From cb8046c44727077b89fa10e66bbebe594ccf959b Mon Sep 17 00:00:00 2001 From: SheetJS Date: Mon, 31 Jan 2022 06:40:30 -0500 Subject: [PATCH] arithmancy --- .gitignore | 1 + .npmignore | 1 + .spelling | 1 + CHANGELOG.md | 1 + Makefile | 1 - bits/83_numbers.js | 129 +- bits/85_parsezip.js | 2 +- dist/jszip.js | 9000 -------------------------------- docbits/80_parseopts.md | 2 +- docbits/85_filetype.md | 16 + formats.png | Bin 195182 -> 207722 bytes misc/formats.dot | 2 + modules/83_numbers.js | 129 +- modules/numbers_to_csv.node.ts | 10 +- modules/src/frame.ts | 33 +- modules/src/numbers.ts | 33 +- modules/src/prebnccell.ts | 41 + modules/src/proto.ts | 50 +- modules/src/util.ts | 8 + packages/otorp/index.node.js | 16 +- packages/otorp/package.json | 2 +- packages/otorp/src/otorp.ts | 8 +- 22 files changed, 332 insertions(+), 9154 deletions(-) delete mode 100644 dist/jszip.js create mode 100644 modules/src/prebnccell.ts diff --git a/.gitignore b/.gitignore index 9a15266..e160bd2 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ tmp *.[bB][iI][fF][fF][23458] *.[rR][tT][fF] *.[eE][tT][hH] +*.[nN][uU][mM][bB][eE][rR][sS] *.123 *.htm *.html diff --git a/.npmignore b/.npmignore index 2c25acc..8162f66 100644 --- a/.npmignore +++ b/.npmignore @@ -1,4 +1,5 @@ test_files/ +modules/ packages/ .github/ tests/files/ diff --git a/.spelling b/.spelling index 8e99309..36cae85 100644 --- a/.spelling +++ b/.spelling @@ -51,6 +51,7 @@ VueJS WebSQL WK_ iOS +iWork nodejs node.js npm diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ac85e0..9f28450 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ changes may not be included if they are not expected to break existing code. ## v0.18.0 * Browser scripts only expose `XLSX` variable +* Module no longer ships with `dist/jszip.js` browser script ## v0.17.4 diff --git a/Makefile b/Makefile index 4e4a38f..e0d3913 100644 --- a/Makefile +++ b/Makefile @@ -94,7 +94,6 @@ dist: dist-deps $(TARGET) bower.json ## Prepare JS files for distribution dist-deps: ## Copy dependencies for distribution mkdir -p dist cp node_modules/codepage/dist/cpexcel.full.js dist/cpexcel.js - cp jszip.js dist/jszip.js .PHONY: aux aux: $(AUXTARGETS) diff --git a/bits/83_numbers.js b/bits/83_numbers.js index 792ca77..ca6342b 100755 --- a/bits/83_numbers.js +++ b/bits/83_numbers.js @@ -54,6 +54,11 @@ var NUMBERS = (function() { }); return out; }; + var popcnt = function(x) { + x -= x >> 1 & 1431655765; + x = (x & 858993459) + (x >> 2 & 858993459); + return (x + (x >> 4) & 252645135) * 16843009 >>> 24; + }; // src/proto.ts function parse_varint49(buf, ptr) { @@ -126,12 +131,16 @@ var NUMBERS = (function() { break; case 5: len = 4; + res = buf.slice(ptr[0], ptr[0] + len); + ptr[0] += len; + break; case 1: - if (!len) - len = 8; + len = 8; + res = buf.slice(ptr[0], ptr[0] + len); + ptr[0] += len; + break; case 2: - if (!len) - len = parse_varint49(buf, ptr); + len = parse_varint49(buf, ptr); res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; @@ -140,7 +149,7 @@ var NUMBERS = (function() { default: throw new Error("PB Type ".concat(type, " for Field ").concat(num, " at offset ").concat(off)); } - var v = { offset: off, data: res }; + var v = { offset: off, data: res, type: type }; if (out[num] == null) out[num] = [v]; else @@ -172,14 +181,14 @@ var NUMBERS = (function() { var t = buf[l++]; var len = buf[l] | buf[l + 1] << 8 | buf[l + 2] << 16; l += 3; - out.push(process_chunk(t, buf.slice(l, l + len))); + out.push(parse_snappy_chunk(t, buf.slice(l, l + len))); l += len; } if (l !== buf.length) throw new Error("data is not a valid framed stream!"); return u8concat(out); } - function process_chunk(type, buf) { + function parse_snappy_chunk(type, buf) { if (type != 0) throw new Error("Unexpected Snappy chunk type ".concat(type)); var ptr = [0]; @@ -270,6 +279,62 @@ var NUMBERS = (function() { return out; } + // src/prebnccell.ts + function parseit(buf, version) { + var dv = u8_to_dataview(buf); + var ctype = buf[version == 4 ? 1 : 2]; + var flags = dv.getUint32(4, true); + var data_offset = 12 + popcnt(flags & 16270) * 4; + var sidx = -1, ieee = NaN, dt = NaN; + if (flags & 16) { + sidx = dv.getUint32(data_offset, true); + data_offset += 4; + } + if (flags & 32) { + ieee = dv.getFloat64(data_offset, true); + data_offset += 8; + } + if (flags & 64) { + dt = dv.getFloat64(data_offset, true); + data_offset += 8; + } + var ret; + switch (ctype) { + case 0: + break; + case 2: + ret = { t: "n", v: ieee }; + break; + case 3: + ret = { t: "s", v: sidx }; + break; + case 5: + var dd = new Date(2001, 0, 1); + dd.setTime(dd.getTime() + dt * 1e3); + ret = { t: "d", v: dd }; + break; + case 6: + ret = { t: "b", v: ieee > 0 }; + break; + case 7: + ret = { t: "n", v: ieee }; + break; + default: + throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); + } + return ret; + } + function parse(buf) { + var version = buf[0]; + switch (version) { + case 3: + case 4: + return parseit(buf, version); + default: + throw new Error("Unsupported pre-BNC version ".concat(version)); + } + } + // src/numbers.ts var encode_col = function(C) { var s = ""; @@ -343,7 +408,7 @@ var NUMBERS = (function() { var pb = parse_shallow(root.data); var entries = pb[3]; var data = []; - entries == null ? void 0 : entries.forEach(function(entry) { + (entries || []).forEach(function(entry) { var le = parse_shallow(entry.data); var key = varint_to_i32(le[1][0].data) >>> 0; data[key] = u8str(le[3][0].data); @@ -405,50 +470,12 @@ var NUMBERS = (function() { tiles.forEach(function(tile2) { tile2.ref.forEach(function(row, R) { row.forEach(function(buf, C) { - var dv = u8_to_dataview(buf); - var ctype = buf[2]; var addr = encode_cell({ r: R, c: C }); - switch (ctype) { - case 0: - { - switch (buf[1]) { - case 3: - ws[addr] = { t: "s", v: sst[dv.getUint32(buf.length - 4, true)] }; - break; - case 2: - ws[addr] = { t: "n", v: dv.getFloat64(16, true) }; - break; - case 0: - break; - case 5: - break; - case 7: - break; - case 6: - ws[addr] = { t: "b", v: dv.getFloat64(buf.length - 8, true) > 0 }; - break; - default: - throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); - } - } - break; - case 3: - { - ws[addr] = { t: "s", v: sst[dv.getUint32(16, true)] }; - } - break; - case 2: - { - ws[addr] = { t: "n", v: dv.getFloat64(buf.length - 12, true) }; - } - break; - case 6: - { - ws[addr] = { t: "b", v: dv.getFloat64(16, true) > 0 }; - } - break; - default: - throw new Error("Unsupported cell type ".concat(ctype)); + var res = parse(buf); + if (res) { + ws[addr] = res; + if (res.t == "s" && typeof res.v == "number") + res.v = sst[res.v]; } }); }); diff --git a/bits/85_parsezip.js b/bits/85_parsezip.js index 55c848d..dccc282 100644 --- a/bits/85_parsezip.js +++ b/bits/85_parsezip.js @@ -61,7 +61,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ { if(safegetzipfile(zip, 'objectdata.xml')) return parse_ods(zip, opts); /* Numbers */ if(safegetzipfile(zip, 'Index/Document.iwa')) { - if(typeof Uint8Array == "undefined") throw new Error('NUMBERS file parsing requires Uint8Array support') + if(typeof Uint8Array == "undefined") throw new Error('NUMBERS file parsing requires Uint8Array support'); if(typeof NUMBERS != "undefined") { if(zip.FileIndex) return NUMBERS.parse_numbers(zip); var _zip = CFB.utils.cfb_new(); diff --git a/dist/jszip.js b/dist/jszip.js deleted file mode 100644 index ad31cac..0000000 --- a/dist/jszip.js +++ /dev/null @@ -1,9000 +0,0 @@ -/* - -JSZip - A Javascript class for generating and reading zip files - - -(c) 2009-2014 Stuart Knightley -Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. - -JSZip uses the library pako released under the MIT license : -https://github.com/nodeca/pako/blob/master/LICENSE - -Note: since JSZip 3 removed critical functionality, this version assigns to the -`JSZipSync` variable. Another JSZip version can be loaded in parallel. -*/ -(function(e){ - if("object"==typeof exports&&"undefined"!=typeof module&&"undefined"==typeof DO_NOT_EXPORT_JSZIP)module.exports=e(); - else if("function"==typeof define&&define.amd&&"undefined"==typeof DO_NOT_EXPORT_JSZIP){JSZipSync=e();define('j',[],e);} - else{ - var f; - "undefined"!=typeof globalThis?f=globalThis: - "undefined"!=typeof window?f=window: - "undefined"!=typeof global?f=global: - "undefined"!=typeof $ && $.global?f=$.global: - "undefined"!=typeof self&&(f=self),f.JSZipSync=e() - } -}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o> 2; - enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); - enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); - enc4 = chr3 & 63; - - if (isNaN(chr2)) { - enc3 = enc4 = 64; - } - else if (isNaN(chr3)) { - enc4 = 64; - } - - output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4); - - } - - return output; -}; - -// public method for decoding -exports.decode = function(input, utf8) { - var output = ""; - var chr1, chr2, chr3; - var enc1, enc2, enc3, enc4; - var i = 0; - - input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); - - while (i < input.length) { - - enc1 = _keyStr.indexOf(input.charAt(i++)); - enc2 = _keyStr.indexOf(input.charAt(i++)); - enc3 = _keyStr.indexOf(input.charAt(i++)); - enc4 = _keyStr.indexOf(input.charAt(i++)); - - chr1 = (enc1 << 2) | (enc2 >> 4); - chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); - chr3 = ((enc3 & 3) << 6) | enc4; - - output = output + String.fromCharCode(chr1); - - if (enc3 != 64) { - output = output + String.fromCharCode(chr2); - } - if (enc4 != 64) { - output = output + String.fromCharCode(chr3); - } - - } - - return output; - -}; - -},{}],2:[function(_dereq_,module,exports){ -'use strict'; -function CompressedObject() { - this.compressedSize = 0; - this.uncompressedSize = 0; - this.crc32 = 0; - this.compressionMethod = null; - this.compressedContent = null; -} - -CompressedObject.prototype = { - /** - * Return the decompressed content in an unspecified format. - * The format will depend on the decompressor. - * @return {Object} the decompressed content. - */ - getContent: function() { - return null; // see implementation - }, - /** - * Return the compressed content in an unspecified format. - * The format will depend on the compressed conten source. - * @return {Object} the compressed content. - */ - getCompressedContent: function() { - return null; // see implementation - } -}; -module.exports = CompressedObject; - -},{}],3:[function(_dereq_,module,exports){ -'use strict'; -exports.STORE = { - magic: "\x00\x00", - compress: function(content) { - return content; // no compression - }, - uncompress: function(content) { - return content; // no compression - }, - compressInputType: null, - uncompressInputType: null -}; -exports.DEFLATE = _dereq_('./flate'); - -},{"./flate":8}],4:[function(_dereq_,module,exports){ -'use strict'; - -var utils = _dereq_('./utils'); - -var table = [ - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D -]; - -/** - * - * Javascript crc32 - * http://www.webtoolkit.info/ - * - */ -module.exports = function crc32(input, crc) { - if (typeof input === "undefined" || !input.length) { - return 0; - } - - var isArray = utils.getTypeOf(input) !== "string"; - - if (typeof(crc) == "undefined") { - crc = 0; - } - var x = 0; - var y = 0; - var b = 0; - - crc = crc ^ (-1); - for (var i = 0, iTop = input.length; i < iTop; i++) { - b = isArray ? input[i] : input.charCodeAt(i); - y = (crc ^ b) & 0xFF; - x = table[y]; - crc = (crc >>> 8) ^ x; - } - - return crc ^ (-1); -}; -// vim: set shiftwidth=4 softtabstop=4: - -},{"./utils":21}],5:[function(_dereq_,module,exports){ -'use strict'; -var utils = _dereq_('./utils'); - -function DataReader(data) { - this.data = null; // type : see implementation - this.length = 0; - this.index = 0; -} -DataReader.prototype = { - /** - * Check that the offset will not go too far. - * @param {string} offset the additional offset to check. - * @throws {Error} an Error if the offset is out of bounds. - */ - checkOffset: function(offset) { - this.checkIndex(this.index + offset); - }, - /** - * Check that the specifed index will not be too far. - * @param {string} newIndex the index to check. - * @throws {Error} an Error if the index is out of bounds. - */ - checkIndex: function(newIndex) { - if (this.length < newIndex || newIndex < 0) { - throw new Error("End of data reached (data length = " + this.length + ", asked index = " + (newIndex) + "). Corrupted zip ?"); - } - }, - /** - * Change the index. - * @param {number} newIndex The new index. - * @throws {Error} if the new index is out of the data. - */ - setIndex: function(newIndex) { - this.checkIndex(newIndex); - this.index = newIndex; - }, - /** - * Skip the next n bytes. - * @param {number} n the number of bytes to skip. - * @throws {Error} if the new index is out of the data. - */ - skip: function(n) { - this.setIndex(this.index + n); - }, - /** - * Get the byte at the specified index. - * @param {number} i the index to use. - * @return {number} a byte. - */ - byteAt: function(i) { - // see implementations - }, - /** - * Get the next number with a given byte size. - * @param {number} size the number of bytes to read. - * @return {number} the corresponding number. - */ - readInt: function(size) { - var result = 0, - i; - this.checkOffset(size); - for (i = this.index + size - 1; i >= this.index; i--) { - result = (result << 8) + this.byteAt(i); - } - this.index += size; - return result; - }, - /** - * Get the next string with a given byte size. - * @param {number} size the number of bytes to read. - * @return {string} the corresponding string. - */ - readString: function(size) { - return utils.transformTo("string", this.readData(size)); - }, - /** - * Get raw data without conversion, bytes. - * @param {number} size the number of bytes to read. - * @return {Object} the raw data, implementation specific. - */ - readData: function(size) { - // see implementations - }, - /** - * Find the last occurrence of a zip signature (4 bytes). - * @param {string} sig the signature to find. - * @return {number} the index of the last occurrence, -1 if not found. - */ - lastIndexOfSignature: function(sig) { - // see implementations - }, - /** - * Get the next date. - * @return {Date} the date. - */ - readDate: function() { - var dostime = this.readInt(4); - return new Date( - ((dostime >> 25) & 0x7f) + 1980, // year - ((dostime >> 21) & 0x0f) - 1, // month - (dostime >> 16) & 0x1f, // day - (dostime >> 11) & 0x1f, // hour - (dostime >> 5) & 0x3f, // minute - (dostime & 0x1f) << 1); // second - } -}; -module.exports = DataReader; - -},{"./utils":21}],6:[function(_dereq_,module,exports){ -'use strict'; -exports.base64 = false; -exports.binary = false; -exports.dir = false; -exports.createFolders = false; -exports.date = null; -exports.compression = null; -exports.comment = null; - -},{}],7:[function(_dereq_,module,exports){ -'use strict'; -var utils = _dereq_('./utils'); - -/** - * @deprecated - * This function will be removed in a future version without replacement. - */ -exports.string2binary = function(str) { - return utils.string2binary(str); -}; - -/** - * @deprecated - * This function will be removed in a future version without replacement. - */ -exports.string2Uint8Array = function(str) { - return utils.transformTo("uint8array", str); -}; - -/** - * @deprecated - * This function will be removed in a future version without replacement. - */ -exports.uint8Array2String = function(array) { - return utils.transformTo("string", array); -}; - -/** - * @deprecated - * This function will be removed in a future version without replacement. - */ -exports.string2Blob = function(str) { - var buffer = utils.transformTo("arraybuffer", str); - return utils.arrayBuffer2Blob(buffer); -}; - -/** - * @deprecated - * This function will be removed in a future version without replacement. - */ -exports.arrayBuffer2Blob = function(buffer) { - return utils.arrayBuffer2Blob(buffer); -}; - -/** - * @deprecated - * This function will be removed in a future version without replacement. - */ -exports.transformTo = function(outputType, input) { - return utils.transformTo(outputType, input); -}; - -/** - * @deprecated - * This function will be removed in a future version without replacement. - */ -exports.getTypeOf = function(input) { - return utils.getTypeOf(input); -}; - -/** - * @deprecated - * This function will be removed in a future version without replacement. - */ -exports.checkSupport = function(type) { - return utils.checkSupport(type); -}; - -/** - * @deprecated - * This value will be removed in a future version without replacement. - */ -exports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS; - -/** - * @deprecated - * This value will be removed in a future version without replacement. - */ -exports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS; - - -/** - * @deprecated - * This function will be removed in a future version without replacement. - */ -exports.pretty = function(str) { - return utils.pretty(str); -}; - -/** - * @deprecated - * This function will be removed in a future version without replacement. - */ -exports.findCompression = function(compressionMethod) { - return utils.findCompression(compressionMethod); -}; - -/** - * @deprecated - * This function will be removed in a future version without replacement. - */ -exports.isRegExp = function (object) { - return utils.isRegExp(object); -}; - - -},{"./utils":21}],8:[function(_dereq_,module,exports){ -'use strict'; -var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined'); - -var pako = _dereq_("pako"); -exports.uncompressInputType = USE_TYPEDARRAY ? "uint8array" : "array"; -exports.compressInputType = USE_TYPEDARRAY ? "uint8array" : "array"; - -exports.magic = "\x08\x00"; -exports.compress = function(input) { - return pako.deflateRaw(input); -}; -exports.uncompress = function(input) { - return pako.inflateRaw(input); -}; - -},{"pako":24}],9:[function(_dereq_,module,exports){ -'use strict'; - -var base64 = _dereq_('./base64'); - -/** -Usage: - zip = new JSZip(); - zip.file("hello.txt", "Hello, World!").file("tempfile", "nothing"); - zip.folder("images").file("smile.gif", base64Data, {base64: true}); - zip.file("Xmas.txt", "Ho ho ho !", {date : new Date("December 25, 2007 00:00:01")}); - zip.remove("tempfile"); - - base64zip = zip.generate(); - -**/ - -/** - * Representation a of zip file in js - * @constructor - * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional). - * @param {Object=} options the options for creating this objects (optional). - */ -function JSZipSync(data, options) { - // if this constructor is used without `new`, it adds `new` before itself: - if(!(this instanceof JSZipSync)) return new JSZipSync(data, options); - - // object containing the files : - // { - // "folder/" : {...}, - // "folder/data.txt" : {...} - // } - this.files = {}; - - this.comment = null; - - // Where we are in the hierarchy - this.root = ""; - if (data) { - this.load(data, options); - } - this.clone = function() { - var newObj = new JSZipSync(); - for (var i in this) { - if (typeof this[i] !== "function") { - newObj[i] = this[i]; - } - } - return newObj; - }; -} -JSZipSync.prototype = _dereq_('./object'); -JSZipSync.prototype.load = _dereq_('./load'); -JSZipSync.support = _dereq_('./support'); -JSZipSync.defaults = _dereq_('./defaults'); - -/** - * @deprecated - * This namespace will be removed in a future version without replacement. - */ -JSZipSync.utils = _dereq_('./deprecatedPublicUtils'); - -JSZipSync.base64 = { - /** - * @deprecated - * This method will be removed in a future version without replacement. - */ - encode : function(input) { - return base64.encode(input); - }, - /** - * @deprecated - * This method will be removed in a future version without replacement. - */ - decode : function(input) { - return base64.decode(input); - } -}; -JSZipSync.compressions = _dereq_('./compressions'); -module.exports = JSZipSync; - -},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(_dereq_,module,exports){ -'use strict'; -var base64 = _dereq_('./base64'); -var ZipEntries = _dereq_('./zipEntries'); -module.exports = function(data, options) { - var files, zipEntries, i, input; - options = options || {}; - if (options.base64) { - data = base64.decode(data); - } - - zipEntries = new ZipEntries(data, options); - files = zipEntries.files; - for (i = 0; i < files.length; i++) { - input = files[i]; - this.file(input.fileName, input.decompressed, { - binary: true, - optimizedBinaryString: true, - date: input.date, - dir: input.dir, - comment : input.fileComment.length ? input.fileComment : null, - createFolders: options.createFolders - }); - } - if (zipEntries.zipComment.length) { - this.comment = zipEntries.zipComment; - } - - return this; -}; - -},{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){ -(function (Buffer){ -'use strict'; -var Buffer_from = /*::(*/function(){}/*:: :any)*/; -if(typeof Buffer !== 'undefined') { - var nbfs = !Buffer.from; - if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; } - Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer); - // $FlowIgnore - if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); }; -} -module.exports = function(data, encoding){ - return typeof data == 'number' ? Buffer.alloc(data) : Buffer_from(data, encoding); -}; -module.exports.test = function(b){ - return Buffer.isBuffer(b); -}; -}).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined)) -},{}],12:[function(_dereq_,module,exports){ -'use strict'; -var Uint8ArrayReader = _dereq_('./uint8ArrayReader'); - -function NodeBufferReader(data) { - this.data = data; - this.length = this.data.length; - this.index = 0; -} -NodeBufferReader.prototype = new Uint8ArrayReader(); - -/** - * @see DataReader.readData - */ -NodeBufferReader.prototype.readData = function(size) { - this.checkOffset(size); - var result = this.data.slice(this.index, this.index + size); - this.index += size; - return result; -}; -module.exports = NodeBufferReader; - -},{"./uint8ArrayReader":18}],13:[function(_dereq_,module,exports){ -'use strict'; -var support = _dereq_('./support'); -var utils = _dereq_('./utils'); -var crc32 = _dereq_('./crc32'); -var signature = _dereq_('./signature'); -var defaults = _dereq_('./defaults'); -var base64 = _dereq_('./base64'); -var compressions = _dereq_('./compressions'); -var CompressedObject = _dereq_('./compressedObject'); -var nodeBuffer = _dereq_('./nodeBuffer'); -var utf8 = _dereq_('./utf8'); -var StringWriter = _dereq_('./stringWriter'); -var Uint8ArrayWriter = _dereq_('./uint8ArrayWriter'); - -/** - * Returns the raw data of a ZipObject, decompress the content if necessary. - * @param {ZipObject} file the file to use. - * @return {String|ArrayBuffer|Uint8Array|Buffer} the data. - */ -var getRawData = function(file) { - if (file._data instanceof CompressedObject) { - file._data = file._data.getContent(); - file.options.binary = true; - file.options.base64 = false; - - if (utils.getTypeOf(file._data) === "uint8array") { - var copy = file._data; - // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array. - // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file). - file._data = new Uint8Array(copy.length); - // with an empty Uint8Array, Opera fails with a "Offset larger than array size" - if (copy.length !== 0) { - file._data.set(copy, 0); - } - } - } - return file._data; -}; - -/** - * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it. - * @param {ZipObject} file the file to use. - * @return {String|ArrayBuffer|Uint8Array|Buffer} the data. - */ -var getBinaryData = function(file) { - var result = getRawData(file), - type = utils.getTypeOf(result); - if (type === "string") { - if (!file.options.binary) { - // unicode text ! - // unicode string => binary string is a painful process, check if we can avoid it. - if (support.nodebuffer) { - return nodeBuffer(result, "utf-8"); - } - } - return file.asBinary(); - } - return result; -}; - -/** - * Transform this._data into a string. - * @param {function} filter a function String -> String, applied if not null on the result. - * @return {String} the string representing this._data. - */ -var dataToString = function(asUTF8) { - var result = getRawData(this); - if (result === null || typeof result === "undefined") { - return ""; - } - // if the data is a base64 string, we decode it before checking the encoding ! - if (this.options.base64) { - result = base64.decode(result); - } - if (asUTF8 && this.options.binary) { - // JSZip.prototype.utf8decode supports arrays as input - // skip to array => string step, utf8decode will do it. - result = out.utf8decode(result); - } - else { - // no utf8 transformation, do the array => string step. - result = utils.transformTo("string", result); - } - - if (!asUTF8 && !this.options.binary) { - result = utils.transformTo("string", out.utf8encode(result)); - } - return result; -}; -/** - * A simple object representing a file in the zip file. - * @constructor - * @param {string} name the name of the file - * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data - * @param {Object} options the options of the file - */ -var ZipObject = function(name, data, options) { - this.name = name; - this.dir = options.dir; - this.date = options.date; - this.comment = options.comment; - - this._data = data; - this.options = options; - - /* - * This object contains initial values for dir and date. - * With them, we can check if the user changed the deprecated metadata in - * `ZipObject#options` or not. - */ - this._initialMetadata = { - dir : options.dir, - date : options.date - }; -}; - -ZipObject.prototype = { - /** - * Return the content as UTF8 string. - * @return {string} the UTF8 string. - */ - asText: function() { - return dataToString.call(this, true); - }, - /** - * Returns the binary content. - * @return {string} the content as binary. - */ - asBinary: function() { - return dataToString.call(this, false); - }, - /** - * Returns the content as a nodejs Buffer. - * @return {Buffer} the content as a Buffer. - */ - asNodeBuffer: function() { - var result = getBinaryData(this); - return utils.transformTo("nodebuffer", result); - }, - /** - * Returns the content as an Uint8Array. - * @return {Uint8Array} the content as an Uint8Array. - */ - asUint8Array: function() { - var result = getBinaryData(this); - return utils.transformTo("uint8array", result); - }, - /** - * Returns the content as an ArrayBuffer. - * @return {ArrayBuffer} the content as an ArrayBufer. - */ - asArrayBuffer: function() { - return this.asUint8Array().buffer; - } -}; - -/** - * Transform an integer into a string in hexadecimal. - * @private - * @param {number} dec the number to convert. - * @param {number} bytes the number of bytes to generate. - * @returns {string} the result. - */ -var decToHex = function(dec, bytes) { - var hex = "", - i; - for (i = 0; i < bytes; i++) { - hex += String.fromCharCode(dec & 0xff); - dec = dec >>> 8; - } - return hex; -}; - -/** - * Merge the objects passed as parameters into a new one. - * @private - * @param {...Object} var_args All objects to merge. - * @return {Object} a new object with the data of the others. - */ -var extend = function() { - var result = {}, i, attr; - for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers - for (attr in arguments[i]) { - if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") { - result[attr] = arguments[i][attr]; - } - } - } - return result; -}; - -/** - * Transforms the (incomplete) options from the user into the complete - * set of options to create a file. - * @private - * @param {Object} o the options from the user. - * @return {Object} the complete set of options. - */ -var prepareFileAttrs = function(o) { - o = o || {}; - if (o.base64 === true && (o.binary === null || o.binary === undefined)) { - o.binary = true; - } - o = extend(o, defaults); - o.date = o.date || new Date(); - if (o.compression !== null) o.compression = o.compression.toUpperCase(); - - return o; -}; - -/** - * Add a file in the current folder. - * @private - * @param {string} name the name of the file - * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file - * @param {Object} o the options of the file - * @return {Object} the new file. - */ -var fileAdd = function(name, data, o) { - // be sure sub folders exist - var dataType = utils.getTypeOf(data), - parent; - - o = prepareFileAttrs(o); - - if (o.createFolders && (parent = parentFolder(name))) { - folderAdd.call(this, parent, true); - } - - if (o.dir || data === null || typeof data === "undefined") { - o.base64 = false; - o.binary = false; - data = null; - } - else if (dataType === "string") { - if (o.binary && !o.base64) { - // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask - if (o.optimizedBinaryString !== true) { - // this is a string, not in a base64 format. - // Be sure that this is a correct "binary string" - data = utils.string2binary(data); - } - } - } - else { // arraybuffer, uint8array, ... - o.base64 = false; - o.binary = true; - - if (!dataType && !(data instanceof CompressedObject)) { - throw new Error("The data of '" + name + "' is in an unsupported format !"); - } - - // special case : it's way easier to work with Uint8Array than with ArrayBuffer - if (dataType === "arraybuffer") { - data = utils.transformTo("uint8array", data); - } - } - - var object = new ZipObject(name, data, o); - this.files[name] = object; - return object; -}; - -/** - * Find the parent folder of the path. - * @private - * @param {string} path the path to use - * @return {string} the parent folder, or "" - */ -var parentFolder = function (path) { - if (path.slice(-1) == '/') { - path = path.substring(0, path.length - 1); - } - var lastSlash = path.lastIndexOf('/'); - return (lastSlash > 0) ? path.substring(0, lastSlash) : ""; -}; - -/** - * Add a (sub) folder in the current folder. - * @private - * @param {string} name the folder's name - * @param {boolean=} [createFolders] If true, automatically create sub - * folders. Defaults to false. - * @return {Object} the new folder. - */ -var folderAdd = function(name, createFolders) { - // Check the name ends with a / - if (name.slice(-1) != "/") { - name += "/"; // IE doesn't like substr(-1) - } - - createFolders = (typeof createFolders !== 'undefined') ? createFolders : false; - - // Does this folder already exist? - if (!this.files[name]) { - fileAdd.call(this, name, null, { - dir: true, - createFolders: createFolders - }); - } - return this.files[name]; -}; - -/** - * Generate a JSZip.CompressedObject for a given zipOject. - * @param {ZipObject} file the object to read. - * @param {JSZip.compression} compression the compression to use. - * @return {JSZip.CompressedObject} the compressed result. - */ -var generateCompressedObjectFrom = function(file, compression) { - var result = new CompressedObject(), - content; - - // the data has not been decompressed, we might reuse things ! - if (file._data instanceof CompressedObject) { - result.uncompressedSize = file._data.uncompressedSize; - result.crc32 = file._data.crc32; - - if (result.uncompressedSize === 0 || file.dir) { - compression = compressions['STORE']; - result.compressedContent = ""; - result.crc32 = 0; - } - else if (file._data.compressionMethod === compression.magic) { - result.compressedContent = file._data.getCompressedContent(); - } - else { - content = file._data.getContent(); - // need to decompress / recompress - result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content)); - } - } - else { - // have uncompressed data - content = getBinaryData(file); - if (!content || content.length === 0 || file.dir) { - compression = compressions['STORE']; - content = ""; - } - result.uncompressedSize = content.length; - result.crc32 = crc32(content); - result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content)); - } - - result.compressedSize = result.compressedContent.length; - result.compressionMethod = compression.magic; - - return result; -}; - -/** - * Generate the various parts used in the construction of the final zip file. - * @param {string} name the file name. - * @param {ZipObject} file the file content. - * @param {JSZip.CompressedObject} compressedObject the compressed object. - * @param {number} offset the current offset from the start of the zip file. - * @return {object} the zip parts. - */ -var generateZipParts = function(name, file, compressedObject, offset) { - var data = compressedObject.compressedContent, - utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)), - comment = file.comment || "", - utfEncodedComment = utils.transformTo("string", utf8.utf8encode(comment)), - useUTF8ForFileName = utfEncodedFileName.length !== file.name.length, - useUTF8ForComment = utfEncodedComment.length !== comment.length, - o = file.options, - dosTime, - dosDate, - extraFields = "", - unicodePathExtraField = "", - unicodeCommentExtraField = "", - dir, date; - - - // handle the deprecated options.dir - if (file._initialMetadata.dir !== file.dir) { - dir = file.dir; - } else { - dir = o.dir; - } - - // handle the deprecated options.date - if(file._initialMetadata.date !== file.date) { - date = file.date; - } else { - date = o.date; - } - - - dosTime = date.getHours(); - dosTime = dosTime << 6; - dosTime = dosTime | date.getMinutes(); - dosTime = dosTime << 5; - dosTime = dosTime | date.getSeconds() / 2; - - dosDate = date.getFullYear() - 1980; - dosDate = dosDate << 4; - dosDate = dosDate | (date.getMonth() + 1); - dosDate = dosDate << 5; - dosDate = dosDate | date.getDate(); - - if (useUTF8ForFileName) { - // set the unicode path extra field. unzip needs at least one extra - // field to correctly handle unicode path, so using the path is as good - // as any other information. This could improve the situation with - // other archive managers too. - // This field is usually used without the utf8 flag, with a non - // unicode path in the header (winrar, winzip). This helps (a bit) - // with the messy Windows' default compressed folders feature but - // breaks on p7zip which doesn't seek the unicode path extra field. - // So for now, UTF-8 everywhere ! - unicodePathExtraField = - // Version - decToHex(1, 1) + - // NameCRC32 - decToHex(crc32(utfEncodedFileName), 4) + - // UnicodeName - utfEncodedFileName; - - extraFields += - // Info-ZIP Unicode Path Extra Field - "\x75\x70" + - // size - decToHex(unicodePathExtraField.length, 2) + - // content - unicodePathExtraField; - } - - if(useUTF8ForComment) { - - unicodeCommentExtraField = - // Version - decToHex(1, 1) + - // CommentCRC32 - decToHex(this.crc32(utfEncodedComment), 4) + - // UnicodeName - utfEncodedComment; - - extraFields += - // Info-ZIP Unicode Path Extra Field - "\x75\x63" + - // size - decToHex(unicodeCommentExtraField.length, 2) + - // content - unicodeCommentExtraField; - } - - var header = ""; - - // version needed to extract - header += "\x0A\x00"; - // general purpose bit flag - // set bit 11 if utf8 - header += (useUTF8ForFileName || useUTF8ForComment) ? "\x00\x08" : "\x00\x00"; - // compression method - header += compressedObject.compressionMethod; - // last mod file time - header += decToHex(dosTime, 2); - // last mod file date - header += decToHex(dosDate, 2); - // crc-32 - header += decToHex(compressedObject.crc32, 4); - // compressed size - header += decToHex(compressedObject.compressedSize, 4); - // uncompressed size - header += decToHex(compressedObject.uncompressedSize, 4); - // file name length - header += decToHex(utfEncodedFileName.length, 2); - // extra field length - header += decToHex(extraFields.length, 2); - - - var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields; - - var dirRecord = signature.CENTRAL_FILE_HEADER + - // version made by (00: DOS) - "\x14\x00" + - // file header (common to file and central directory) - header + - // file comment length - decToHex(utfEncodedComment.length, 2) + - // disk number start - "\x00\x00" + - // internal file attributes TODO - "\x00\x00" + - // external file attributes - (dir === true ? "\x10\x00\x00\x00" : "\x00\x00\x00\x00") + - // relative offset of local header - decToHex(offset, 4) + - // file name - utfEncodedFileName + - // extra field - extraFields + - // file comment - utfEncodedComment; - - return { - fileRecord: fileRecord, - dirRecord: dirRecord, - compressedObject: compressedObject - }; -}; - - -// return the actual prototype of JSZip -var out = { - /** - * Read an existing zip and merge the data in the current JSZip object. - * The implementation is in jszip-load.js, don't forget to include it. - * @param {String|ArrayBuffer|Uint8Array|Buffer} stream The stream to load - * @param {Object} options Options for loading the stream. - * options.base64 : is the stream in base64 ? default : false - * @return {JSZip} the current JSZip object - */ - load: function(stream, options) { - throw new Error("Load method is not defined. Is the file jszip-load.js included ?"); - }, - - /** - * Filter nested files/folders with the specified function. - * @param {Function} search the predicate to use : - * function (relativePath, file) {...} - * It takes 2 arguments : the relative path and the file. - * @return {Array} An array of matching elements. - */ - filter: function(search) { - var result = [], - filename, relativePath, file, fileClone; - for (filename in this.files) { - if (!this.files.hasOwnProperty(filename)) { - continue; - } - file = this.files[filename]; - // return a new object, don't let the user mess with our internal objects :) - fileClone = new ZipObject(file.name, file._data, extend(file.options)); - relativePath = filename.slice(this.root.length, filename.length); - if (filename.slice(0, this.root.length) === this.root && // the file is in the current root - search(relativePath, fileClone)) { // and the file matches the function - result.push(fileClone); - } - } - return result; - }, - - /** - * Add a file to the zip file, or search a file. - * @param {string|RegExp} name The name of the file to add (if data is defined), - * the name of the file to find (if no data) or a regex to match files. - * @param {String|ArrayBuffer|Uint8Array|Buffer} data The file data, either raw or base64 encoded - * @param {Object} o File options - * @return {JSZip|Object|Array} this JSZip object (when adding a file), - * a file (when searching by string) or an array of files (when searching by regex). - */ - file: function(name, data, o) { - if (arguments.length === 1) { - if (utils.isRegExp(name)) { - var regexp = name; - return this.filter(function(relativePath, file) { - return !file.dir && regexp.test(relativePath); - }); - } - else { // text - return this.filter(function(relativePath, file) { - return !file.dir && relativePath === name; - })[0] || null; - } - } - else { // more than one argument : we have data ! - name = this.root + name; - fileAdd.call(this, name, data, o); - } - return this; - }, - - /** - * Add a directory to the zip file, or search. - * @param {String|RegExp} arg The name of the directory to add, or a regex to search folders. - * @return {JSZip} an object with the new directory as the root, or an array containing matching folders. - */ - folder: function(arg) { - if (!arg) { - return this; - } - - if (utils.isRegExp(arg)) { - return this.filter(function(relativePath, file) { - return file.dir && arg.test(relativePath); - }); - } - - // else, name is a new folder - var name = this.root + arg; - var newFolder = folderAdd.call(this, name); - - // Allow chaining by returning a new object with this folder as the root - var ret = this.clone(); - ret.root = newFolder.name; - return ret; - }, - - /** - * Delete a file, or a directory and all sub-files, from the zip - * @param {string} name the name of the file to delete - * @return {JSZip} this JSZip object - */ - remove: function(name) { - name = this.root + name; - var file = this.files[name]; - if (!file) { - // Look for any folders - if (name.slice(-1) != "/") { - name += "/"; - } - file = this.files[name]; - } - - if (file && !file.dir) { - // file - delete this.files[name]; - } else { - // maybe a folder, delete recursively - var kids = this.filter(function(relativePath, file) { - return file.name.slice(0, name.length) === name; - }); - for (var i = 0; i < kids.length; i++) { - delete this.files[kids[i].name]; - } - } - - return this; - }, - - /** - * Generate the complete zip file - * @param {Object} options the options to generate the zip file : - * - base64, (deprecated, use type instead) true to generate base64. - * - compression, "STORE" by default. - * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob. - * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file - */ - generate: function(options) { - options = extend(options || {}, { - base64: true, - compression: "STORE", - type: "base64", - comment: null - }); - - utils.checkSupport(options.type); - - var zipData = [], - localDirLength = 0, - centralDirLength = 0, - writer, i, - utfEncodedComment = utils.transformTo("string", this.utf8encode(options.comment || this.comment || "")); - - // first, generate all the zip parts. - for (var name in this.files) { - if (!this.files.hasOwnProperty(name)) { - continue; - } - var file = this.files[name]; - - var compressionName = file.options.compression || options.compression.toUpperCase(); - var compression = compressions[compressionName]; - if (!compression) { - throw new Error(compressionName + " is not a valid compression method !"); - } - - var compressedObject = generateCompressedObjectFrom.call(this, file, compression); - - var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength); - localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize; - centralDirLength += zipPart.dirRecord.length; - zipData.push(zipPart); - } - - var dirEnd = ""; - - // end of central dir signature - dirEnd = signature.CENTRAL_DIRECTORY_END + - // number of this disk - "\x00\x00" + - // number of the disk with the start of the central directory - "\x00\x00" + - // total number of entries in the central directory on this disk - decToHex(zipData.length, 2) + - // total number of entries in the central directory - decToHex(zipData.length, 2) + - // size of the central directory 4 bytes - decToHex(centralDirLength, 4) + - // offset of start of central directory with respect to the starting disk number - decToHex(localDirLength, 4) + - // .ZIP file comment length - decToHex(utfEncodedComment.length, 2) + - // .ZIP file comment - utfEncodedComment; - - - // we have all the parts (and the total length) - // time to create a writer ! - var typeName = options.type.toLowerCase(); - if(typeName==="uint8array"||typeName==="arraybuffer"||typeName==="blob"||typeName==="nodebuffer") { - writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length); - }else{ - writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length); - } - - for (i = 0; i < zipData.length; i++) { - writer.append(zipData[i].fileRecord); - writer.append(zipData[i].compressedObject.compressedContent); - } - for (i = 0; i < zipData.length; i++) { - writer.append(zipData[i].dirRecord); - } - - writer.append(dirEnd); - - var zip = writer.finalize(); - - - - switch(options.type.toLowerCase()) { - // case "zip is an Uint8Array" - case "uint8array" : - case "arraybuffer" : - case "nodebuffer" : - return utils.transformTo(options.type.toLowerCase(), zip); - case "blob" : - return utils.arrayBuffer2Blob(utils.transformTo("arraybuffer", zip)); - // case "zip is a string" - case "base64" : - return (options.base64) ? base64.encode(zip) : zip; - default : // case "string" : - return zip; - } - - }, - - /** - * @deprecated - * This method will be removed in a future version without replacement. - */ - crc32: function (input, crc) { - return crc32(input, crc); - }, - - /** - * @deprecated - * This method will be removed in a future version without replacement. - */ - utf8encode: function (string) { - return utils.transformTo("string", utf8.utf8encode(string)); - }, - - /** - * @deprecated - * This method will be removed in a future version without replacement. - */ - utf8decode: function (input) { - return utf8.utf8decode(input); - } -}; -module.exports = out; - -},{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(_dereq_,module,exports){ -'use strict'; -exports.LOCAL_FILE_HEADER = "PK\x03\x04"; -exports.CENTRAL_FILE_HEADER = "PK\x01\x02"; -exports.CENTRAL_DIRECTORY_END = "PK\x05\x06"; -exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x06\x07"; -exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06"; -exports.DATA_DESCRIPTOR = "PK\x07\x08"; - -},{}],15:[function(_dereq_,module,exports){ -'use strict'; -var DataReader = _dereq_('./dataReader'); -var utils = _dereq_('./utils'); - -function StringReader(data, optimizedBinaryString) { - this.data = data; - if (!optimizedBinaryString) { - this.data = utils.string2binary(this.data); - } - this.length = this.data.length; - this.index = 0; -} -StringReader.prototype = new DataReader(); -/** - * @see DataReader.byteAt - */ -StringReader.prototype.byteAt = function(i) { - return this.data.charCodeAt(i); -}; -/** - * @see DataReader.lastIndexOfSignature - */ -StringReader.prototype.lastIndexOfSignature = function(sig) { - return this.data.lastIndexOf(sig); -}; -/** - * @see DataReader.readData - */ -StringReader.prototype.readData = function(size) { - this.checkOffset(size); - // this will work because the constructor applied the "& 0xff" mask. - var result = this.data.slice(this.index, this.index + size); - this.index += size; - return result; -}; -module.exports = StringReader; - -},{"./dataReader":5,"./utils":21}],16:[function(_dereq_,module,exports){ -'use strict'; - -var utils = _dereq_('./utils'); - -/** - * An object to write any content to a string. - * @constructor - */ -var StringWriter = function() { - this.data = []; -}; -StringWriter.prototype = { - /** - * Append any content to the current string. - * @param {Object} input the content to add. - */ - append: function(input) { - input = utils.transformTo("string", input); - this.data.push(input); - }, - /** - * Finalize the construction an return the result. - * @return {string} the generated string. - */ - finalize: function() { - return this.data.join(""); - } -}; - -module.exports = StringWriter; - -},{"./utils":21}],17:[function(_dereq_,module,exports){ -(function (Buffer){ -'use strict'; -exports.base64 = true; -exports.array = true; -exports.string = true; -exports.arraybuffer = typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined"; -// contains true if JSZip can read/generate nodejs Buffer, false otherwise. -// Browserify will provide a Buffer implementation for browsers, which is -// an augmented Uint8Array (i.e., can be used as either Buffer or U8). -exports.nodebuffer = typeof Buffer !== "undefined"; -// contains true if JSZip can read/generate Uint8Array, false otherwise. -exports.uint8array = typeof Uint8Array !== "undefined"; - -if (typeof ArrayBuffer === "undefined") { - exports.blob = false; -} -else { - var buffer = new ArrayBuffer(0); - try { - exports.blob = new Blob([buffer], { - type: "application/zip" - }).size === 0; - } - catch (e) { - try { - var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; - var builder = new Builder(); - builder.append(buffer); - exports.blob = builder.getBlob('application/zip').size === 0; - } - catch (e) { - exports.blob = false; - } - } -} - -}).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined)) -},{}],18:[function(_dereq_,module,exports){ -'use strict'; -var DataReader = _dereq_('./dataReader'); - -function Uint8ArrayReader(data) { - if (data) { - this.data = data; - this.length = this.data.length; - this.index = 0; - } -} -Uint8ArrayReader.prototype = new DataReader(); -/** - * @see DataReader.byteAt - */ -Uint8ArrayReader.prototype.byteAt = function(i) { - return this.data[i]; -}; -/** - * @see DataReader.lastIndexOfSignature - */ -Uint8ArrayReader.prototype.lastIndexOfSignature = function(sig) { - var sig0 = sig.charCodeAt(0), - sig1 = sig.charCodeAt(1), - sig2 = sig.charCodeAt(2), - sig3 = sig.charCodeAt(3); - for (var i = this.length - 4; i >= 0; --i) { - if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) { - return i; - } - } - - return -1; -}; -/** - * @see DataReader.readData - */ -Uint8ArrayReader.prototype.readData = function(size) { - this.checkOffset(size); - if(size === 0) { - // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of []. - return new Uint8Array(0); - } - var result = this.data.subarray(this.index, this.index + size); - this.index += size; - return result; -}; -module.exports = Uint8ArrayReader; - -},{"./dataReader":5}],19:[function(_dereq_,module,exports){ -'use strict'; - -var utils = _dereq_('./utils'); - -/** - * An object to write any content to an Uint8Array. - * @constructor - * @param {number} length The length of the array. - */ -var Uint8ArrayWriter = function(length) { - this.data = new Uint8Array(length); - this.index = 0; -}; -Uint8ArrayWriter.prototype = { - /** - * Append any content to the current array. - * @param {Object} input the content to add. - */ - append: function(input) { - if (input.length !== 0) { - // with an empty Uint8Array, Opera fails with a "Offset larger than array size" - input = utils.transformTo("uint8array", input); - this.data.set(input, this.index); - this.index += input.length; - } - }, - /** - * Finalize the construction an return the result. - * @return {Uint8Array} the generated array. - */ - finalize: function() { - return this.data; - } -}; - -module.exports = Uint8ArrayWriter; - -},{"./utils":21}],20:[function(_dereq_,module,exports){ -'use strict'; - -var utils = _dereq_('./utils'); -var support = _dereq_('./support'); -var nodeBuffer = _dereq_('./nodeBuffer'); - -/** - * The following functions come from pako, from pako/lib/utils/strings - * released under the MIT license, see pako https://github.com/nodeca/pako/ - */ - -// Table with utf8 lengths (calculated by first byte of sequence) -// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, -// because max possible codepoint is 0x10ffff -var _utf8len = new Array(256); -for (var i=0; i<256; i++) { - _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1); -} -_utf8len[254]=_utf8len[254]=1; // Invalid sequence start - -// convert string to array (typed, when possible) -var string2buf = function (str) { - var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; - - // count binary size - for (m_pos = 0; m_pos < str_len; m_pos++) { - c = str.charCodeAt(m_pos); - if (((c & 0xfc00) === 0xd800) && (m_pos+1 < str_len)) { - c2 = str.charCodeAt(m_pos+1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - buf_len += (c < 0x80) ? 1 : ((c < 0x800) ? 2 : ((c < 0x10000) ? 3 : 4)); - } - - // allocate buffer - if (support.uint8array) { - buf = new Uint8Array(buf_len); - } else { - buf = new Array(buf_len); - } - - // convert - for (i=0, m_pos = 0; i < buf_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) { - c2 = str.charCodeAt(m_pos+1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - if (c < 0x80) { - /* one byte */ - buf[i++] = c; - } else if (c < 0x800) { - /* two bytes */ - buf[i++] = 0xC0 | (c >>> 6); - buf[i++] = 0x80 | (c & 0x3f); - } else if (c < 0x10000) { - /* three bytes */ - buf[i++] = 0xE0 | (c >>> 12); - buf[i++] = 0x80 | ((c >>> 6) & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } else { - /* four bytes */ - buf[i++] = 0xf0 | (c >>> 18); - buf[i++] = 0x80 | ((c >>> 12) & 0x3f); - buf[i++] = 0x80 | ((c >>> 6) & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } - } - - return buf; -}; - -// Calculate max possible position in utf8 buffer, -// that will not break sequence. If that's not possible -// - (very small limits) return max size as is. -// -// buf[] - utf8 bytes array -// max - length limit (mandatory); -var utf8border = function(buf, max) { - var pos; - - max = max || buf.length; - if (max > buf.length) { max = buf.length; } - - // go back from last position, until start of sequence found - pos = max-1; - while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } - - // Fuckup - very small and broken sequence, - // return max, because we should return something anyway. - if (pos < 0) { return max; } - - // If we came to start of buffer - that means vuffer is too small, - // return max too. - if (pos === 0) { return max; } - - return (pos + _utf8len[buf[pos]] > max) ? pos : max; -}; - -// convert array to string -var buf2string = function (buf) { - var str, i, out, c, c_len; - var len = buf.length; - - // Reserve max possible length (2 words per char) - // NB: by unknown reasons, Array is significantly faster for - // String.fromCharCode.apply than Uint16Array. - var utf16buf = new Array(len*2); - - for (out=0, i=0; i 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; } - - // apply mask on first byte - c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; - // join the rest - while (c_len > 1 && i < len) { - c = (c << 6) | (buf[i++] & 0x3f); - c_len--; - } - - // terminated by end of string? - if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } - - if (c < 0x10000) { - utf16buf[out++] = c; - } else { - c -= 0x10000; - utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); - utf16buf[out++] = 0xdc00 | (c & 0x3ff); - } - } - - // shrinkBuf(utf16buf, out) - if (utf16buf.length !== out) { - if(utf16buf.subarray) { - utf16buf = utf16buf.subarray(0, out); - } else { - utf16buf.length = out; - } - } - - // return String.fromCharCode.apply(null, utf16buf); - return utils.applyFromCharCode(utf16buf); -}; - - -// That's all for the pako functions. - - -/** - * Transform a javascript string into an array (typed if possible) of bytes, - * UTF-8 encoded. - * @param {String} str the string to encode - * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string. - */ -exports.utf8encode = function utf8encode(str) { - if (support.nodebuffer) { - return nodeBuffer(str, "utf-8"); - } - - return string2buf(str); -}; - - -/** - * Transform a bytes array (or a representation) representing an UTF-8 encoded - * string into a javascript string. - * @param {Array|Uint8Array|Buffer} buf the data de decode - * @return {String} the decoded string. - */ -exports.utf8decode = function utf8decode(buf) { - if (support.nodebuffer) { - return utils.transformTo("nodebuffer", buf).toString("utf-8"); - } - - buf = utils.transformTo(support.uint8array ? "uint8array" : "array", buf); - - // return buf2string(buf); - // Chrome prefers to work with "small" chunks of data - // for the method buf2string. - // Firefox and Chrome has their own shortcut, IE doesn't seem to really care. - var result = [], k = 0, len = buf.length, chunk = 65536; - while (k < len) { - var nextBoundary = utf8border(buf, Math.min(k + chunk, len)); - if (support.uint8array) { - result.push(buf2string(buf.subarray(k, nextBoundary))); - } else { - result.push(buf2string(buf.slice(k, nextBoundary))); - } - k = nextBoundary; - } - return result.join(""); - -}; -// vim: set shiftwidth=4 softtabstop=4: - -},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(_dereq_,module,exports){ -'use strict'; -var support = _dereq_('./support'); -var compressions = _dereq_('./compressions'); -var nodeBuffer = _dereq_('./nodeBuffer'); -/** - * Convert a string to a "binary string" : a string containing only char codes between 0 and 255. - * @param {string} str the string to transform. - * @return {String} the binary string. - */ -exports.string2binary = function(str) { - var result = ""; - for (var i = 0; i < str.length; i++) { - result += String.fromCharCode(str.charCodeAt(i) & 0xff); - } - return result; -}; -exports.arrayBuffer2Blob = function(buffer) { - exports.checkSupport("blob"); - - try { - // Blob constructor - return new Blob([buffer], { - type: "application/zip" - }); - } - catch (e) { - - try { - // deprecated, browser only, old way - var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; - var builder = new Builder(); - builder.append(buffer); - return builder.getBlob('application/zip'); - } - catch (e) { - - // well, fuck ?! - throw new Error("Bug : can't construct the Blob."); - } - } - - -}; -/** - * The identity function. - * @param {Object} input the input. - * @return {Object} the same input. - */ -function identity(input) { - return input; -} - -/** - * Fill in an array with a string. - * @param {String} str the string to use. - * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated). - * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array. - */ -function stringToArrayLike(str, array) { - for (var i = 0; i < str.length; ++i) { - array[i] = str.charCodeAt(i) & 0xFF; - } - return array; -} - -/** - * Transform an array-like object to a string. - * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform. - * @return {String} the result. - */ -function arrayLikeToString(array) { - // Performances notes : - // -------------------- - // String.fromCharCode.apply(null, array) is the fastest, see - // see http://jsperf.com/converting-a-uint8array-to-a-string/2 - // but the stack is limited (and we can get huge arrays !). - // - // result += String.fromCharCode(array[i]); generate too many strings ! - // - // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2 - var chunk = 65536; - var result = [], - len = array.length, - type = exports.getTypeOf(array), - k = 0, - canUseApply = true; - try { - switch(type) { - case "uint8array": - String.fromCharCode.apply(null, new Uint8Array(0)); - break; - case "nodebuffer": - String.fromCharCode.apply(null, nodeBuffer(0)); - break; - } - } catch(e) { - canUseApply = false; - } - - // no apply : slow and painful algorithm - // default browser on android 4.* - if (!canUseApply) { - var resultStr = ""; - for(var i = 0; i < array.length;i++) { - resultStr += String.fromCharCode(array[i]); - } - return resultStr; - } - while (k < len && chunk > 1) { - try { - if (type === "array" || type === "nodebuffer") { - result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len)))); - } - else { - result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len)))); - } - k += chunk; - } - catch (e) { - chunk = Math.floor(chunk / 2); - } - } - return result.join(""); -} - -exports.applyFromCharCode = arrayLikeToString; - - -/** - * Copy the data from an array-like to an other array-like. - * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array. - * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated. - * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array. - */ -function arrayLikeToArrayLike(arrayFrom, arrayTo) { - for (var i = 0; i < arrayFrom.length; i++) { - arrayTo[i] = arrayFrom[i]; - } - return arrayTo; -} - -// a matrix containing functions to transform everything into everything. -var transform = {}; - -// string to ? -transform["string"] = { - "string": identity, - "array": function(input) { - return stringToArrayLike(input, new Array(input.length)); - }, - "arraybuffer": function(input) { - return transform["string"]["uint8array"](input).buffer; - }, - "uint8array": function(input) { - return stringToArrayLike(input, new Uint8Array(input.length)); - }, - "nodebuffer": function(input) { - return stringToArrayLike(input, nodeBuffer(input.length)); - } -}; - -// array to ? -transform["array"] = { - "string": arrayLikeToString, - "array": identity, - "arraybuffer": function(input) { - return (new Uint8Array(input)).buffer; - }, - "uint8array": function(input) { - return new Uint8Array(input); - }, - "nodebuffer": function(input) { - return nodeBuffer(input); - } -}; - -// arraybuffer to ? -transform["arraybuffer"] = { - "string": function(input) { - return arrayLikeToString(new Uint8Array(input)); - }, - "array": function(input) { - return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength)); - }, - "arraybuffer": identity, - "uint8array": function(input) { - return new Uint8Array(input); - }, - "nodebuffer": function(input) { - return nodeBuffer(new Uint8Array(input)); - } -}; - -// uint8array to ? -transform["uint8array"] = { - "string": arrayLikeToString, - "array": function(input) { - return arrayLikeToArrayLike(input, new Array(input.length)); - }, - "arraybuffer": function(input) { - return input.buffer; - }, - "uint8array": identity, - "nodebuffer": function(input) { - return nodeBuffer(input); - } -}; - -// nodebuffer to ? -transform["nodebuffer"] = { - "string": arrayLikeToString, - "array": function(input) { - return arrayLikeToArrayLike(input, new Array(input.length)); - }, - "arraybuffer": function(input) { - return transform["nodebuffer"]["uint8array"](input).buffer; - }, - "uint8array": function(input) { - return arrayLikeToArrayLike(input, new Uint8Array(input.length)); - }, - "nodebuffer": identity -}; - -/** - * Transform an input into any type. - * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer. - * If no output type is specified, the unmodified input will be returned. - * @param {String} outputType the output type. - * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert. - * @throws {Error} an Error if the browser doesn't support the requested output type. - */ -exports.transformTo = function(outputType, input) { - if (!input) { - // undefined, null, etc - // an empty string won't harm. - input = ""; - } - if (!outputType) { - return input; - } - exports.checkSupport(outputType); - var inputType = exports.getTypeOf(input); - var result = transform[inputType][outputType](input); - return result; -}; - -/** - * Return the type of the input. - * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer. - * @param {Object} input the input to identify. - * @return {String} the (lowercase) type of the input. - */ -exports.getTypeOf = function(input) { - if (typeof input === "string") { - return "string"; - } - if (Object.prototype.toString.call(input) === "[object Array]") { - return "array"; - } - if (support.nodebuffer && nodeBuffer.test(input)) { - return "nodebuffer"; - } - if (support.uint8array && input instanceof Uint8Array) { - return "uint8array"; - } - if (support.arraybuffer && input instanceof ArrayBuffer) { - return "arraybuffer"; - } -}; - -/** - * Throw an exception if the type is not supported. - * @param {String} type the type to check. - * @throws {Error} an Error if the browser doesn't support the requested type. - */ -exports.checkSupport = function(type) { - var supported = support[type.toLowerCase()]; - if (!supported) { - throw new Error(type + " is not supported by this browser"); - } -}; -exports.MAX_VALUE_16BITS = 65535; -exports.MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1 - -/** - * Prettify a string read as binary. - * @param {string} str the string to prettify. - * @return {string} a pretty string. - */ -exports.pretty = function(str) { - var res = '', - code, i; - for (i = 0; i < (str || "").length; i++) { - code = str.charCodeAt(i); - res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase(); - } - return res; -}; - -/** - * Find a compression registered in JSZip. - * @param {string} compressionMethod the method magic to find. - * @return {Object|null} the JSZip compression object, null if none found. - */ -exports.findCompression = function(compressionMethod) { - for (var method in compressions) { - if (!compressions.hasOwnProperty(method)) { - continue; - } - if (compressions[method].magic === compressionMethod) { - return compressions[method]; - } - } - return null; -}; -/** -* Cross-window, cross-Node-context regular expression detection -* @param {Object} object Anything -* @return {Boolean} true if the object is a regular expression, -* false otherwise -*/ -exports.isRegExp = function (object) { - return Object.prototype.toString.call(object) === "[object RegExp]"; -}; - - -},{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(_dereq_,module,exports){ -'use strict'; -var StringReader = _dereq_('./stringReader'); -var NodeBufferReader = _dereq_('./nodeBufferReader'); -var Uint8ArrayReader = _dereq_('./uint8ArrayReader'); -var utils = _dereq_('./utils'); -var sig = _dereq_('./signature'); -var ZipEntry = _dereq_('./zipEntry'); -var support = _dereq_('./support'); -var jszipProto = _dereq_('./object'); -// class ZipEntries {{{ -/** - * All the entries in the zip file. - * @constructor - * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load. - * @param {Object} loadOptions Options for loading the stream. - */ -function ZipEntries(data, loadOptions) { - this.files = []; - this.loadOptions = loadOptions; - if (data) { - this.load(data); - } -} -ZipEntries.prototype = { - /** - * Check that the reader is on the speficied signature. - * @param {string} expectedSignature the expected signature. - * @throws {Error} if it is an other signature. - */ - checkSignature: function(expectedSignature) { - var signature = this.reader.readString(4); - if (signature !== expectedSignature) { - throw new Error("Corrupted zip or bug : unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")"); - } - }, - /** - * Read the end of the central directory. - */ - readBlockEndOfCentral: function() { - this.diskNumber = this.reader.readInt(2); - this.diskWithCentralDirStart = this.reader.readInt(2); - this.centralDirRecordsOnThisDisk = this.reader.readInt(2); - this.centralDirRecords = this.reader.readInt(2); - this.centralDirSize = this.reader.readInt(4); - this.centralDirOffset = this.reader.readInt(4); - - this.zipCommentLength = this.reader.readInt(2); - // warning : the encoding depends of the system locale - // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded. - // On a windows machine, this field is encoded with the localized windows code page. - this.zipComment = this.reader.readString(this.zipCommentLength); - // To get consistent behavior with the generation part, we will assume that - // this is utf8 encoded. - this.zipComment = jszipProto.utf8decode(this.zipComment); - }, - /** - * Read the end of the Zip 64 central directory. - * Not merged with the method readEndOfCentral : - * The end of central can coexist with its Zip64 brother, - * I don't want to read the wrong number of bytes ! - */ - readBlockZip64EndOfCentral: function() { - this.zip64EndOfCentralSize = this.reader.readInt(8); - this.versionMadeBy = this.reader.readString(2); - this.versionNeeded = this.reader.readInt(2); - this.diskNumber = this.reader.readInt(4); - this.diskWithCentralDirStart = this.reader.readInt(4); - this.centralDirRecordsOnThisDisk = this.reader.readInt(8); - this.centralDirRecords = this.reader.readInt(8); - this.centralDirSize = this.reader.readInt(8); - this.centralDirOffset = this.reader.readInt(8); - - this.zip64ExtensibleData = {}; - var extraDataSize = this.zip64EndOfCentralSize - 44, - index = 0, - extraFieldId, - extraFieldLength, - extraFieldValue; - while (index < extraDataSize) { - extraFieldId = this.reader.readInt(2); - extraFieldLength = this.reader.readInt(4); - extraFieldValue = this.reader.readString(extraFieldLength); - this.zip64ExtensibleData[extraFieldId] = { - id: extraFieldId, - length: extraFieldLength, - value: extraFieldValue - }; - } - }, - /** - * Read the end of the Zip 64 central directory locator. - */ - readBlockZip64EndOfCentralLocator: function() { - this.diskWithZip64CentralDirStart = this.reader.readInt(4); - this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8); - this.disksCount = this.reader.readInt(4); - if (this.disksCount > 1) { - throw new Error("Multi-volumes zip are not supported"); - } - }, - /** - * Read the local files, based on the offset read in the central part. - */ - readLocalFiles: function() { - var i, file; - for (i = 0; i < this.files.length; i++) { - file = this.files[i]; - this.reader.setIndex(file.localHeaderOffset); - this.checkSignature(sig.LOCAL_FILE_HEADER); - file.readLocalPart(this.reader); - file.handleUTF8(); - } - }, - /** - * Read the central directory. - */ - readCentralDir: function() { - var file; - - this.reader.setIndex(this.centralDirOffset); - while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) { - file = new ZipEntry({ - zip64: this.zip64 - }, this.loadOptions); - file.readCentralPart(this.reader); - this.files.push(file); - } - }, - /** - * Read the end of central directory. - */ - readEndOfCentral: function() { - var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END); - if (offset === -1) { - throw new Error("Corrupted zip : can't find end of central directory"); - } - this.reader.setIndex(offset); - this.checkSignature(sig.CENTRAL_DIRECTORY_END); - this.readBlockEndOfCentral(); - - - /* extract from the zip spec : - 4) If one of the fields in the end of central directory - record is too small to hold required data, the field - should be set to -1 (0xFFFF or 0xFFFFFFFF) and the - ZIP64 format record should be created. - 5) The end of central directory record and the - Zip64 end of central directory locator record must - reside on the same disk when splitting or spanning - an archive. - */ - if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) { - this.zip64 = true; - - /* - Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from - the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents - all numbers as 64-bit double precision IEEE 754 floating point numbers. - So, we have 53bits for integers and bitwise operations treat everything as 32bits. - see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators - and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5 - */ - - // should look for a zip64 EOCD locator - offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR); - if (offset === -1) { - throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator"); - } - this.reader.setIndex(offset); - this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR); - this.readBlockZip64EndOfCentralLocator(); - - // now the zip64 EOCD record - this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir); - this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END); - this.readBlockZip64EndOfCentral(); - } - }, - prepareReader: function(data) { - var type = utils.getTypeOf(data); - if (type === "string" && !support.uint8array) { - this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString); - } - else if (type === "nodebuffer") { - this.reader = new NodeBufferReader(data); - } - else { - this.reader = new Uint8ArrayReader(utils.transformTo("uint8array", data)); - } - }, - /** - * Read a zip file and create ZipEntries. - * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file. - */ - load: function(data) { - this.prepareReader(data); - this.readEndOfCentral(); - this.readCentralDir(); - this.readLocalFiles(); - } -}; -// }}} end of ZipEntries -module.exports = ZipEntries; - -},{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(_dereq_,module,exports){ -'use strict'; -var StringReader = _dereq_('./stringReader'); -var utils = _dereq_('./utils'); -var CompressedObject = _dereq_('./compressedObject'); -var jszipProto = _dereq_('./object'); -// class ZipEntry {{{ -/** - * An entry in the zip file. - * @constructor - * @param {Object} options Options of the current file. - * @param {Object} loadOptions Options for loading the stream. - */ -function ZipEntry(options, loadOptions) { - this.options = options; - this.loadOptions = loadOptions; -} -ZipEntry.prototype = { - /** - * say if the file is encrypted. - * @return {boolean} true if the file is encrypted, false otherwise. - */ - isEncrypted: function() { - // bit 1 is set - return (this.bitFlag & 0x0001) === 0x0001; - }, - /** - * say if the file has utf-8 filename/comment. - * @return {boolean} true if the filename/comment is in utf-8, false otherwise. - */ - useUTF8: function() { - // bit 11 is set - return (this.bitFlag & 0x0800) === 0x0800; - }, - /** - * Prepare the function used to generate the compressed content from this ZipFile. - * @param {DataReader} reader the reader to use. - * @param {number} from the offset from where we should read the data. - * @param {number} length the length of the data to read. - * @return {Function} the callback to get the compressed content (the type depends of the DataReader class). - */ - prepareCompressedContent: function(reader, from, length) { - return function() { - var previousIndex = reader.index; - reader.setIndex(from); - var compressedFileData = reader.readData(length); - reader.setIndex(previousIndex); - - return compressedFileData; - }; - }, - /** - * Prepare the function used to generate the uncompressed content from this ZipFile. - * @param {DataReader} reader the reader to use. - * @param {number} from the offset from where we should read the data. - * @param {number} length the length of the data to read. - * @param {JSZip.compression} compression the compression used on this file. - * @param {number} uncompressedSize the uncompressed size to expect. - * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class). - */ - prepareContent: function(reader, from, length, compression, uncompressedSize) { - return function() { - - var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent()); - var uncompressedFileData = compression.uncompress(compressedFileData); - - if (uncompressedFileData.length !== uncompressedSize) { - throw new Error("Bug : uncompressed data size mismatch"); - } - - return uncompressedFileData; - }; - }, - /** - * Read the local part of a zip file and add the info in this object. - * @param {DataReader} reader the reader to use. - */ - readLocalPart: function(reader) { - var compression, localExtraFieldsLength; - - // we already know everything from the central dir ! - // If the central dir data are false, we are doomed. - // On the bright side, the local part is scary : zip64, data descriptors, both, etc. - // The less data we get here, the more reliable this should be. - // Let's skip the whole header and dash to the data ! - reader.skip(22); - // in some zip created on windows, the filename stored in the central dir contains \ instead of /. - // Strangely, the filename here is OK. - // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes - // or APPNOTE#4.4.17.1, "All slashes MUST be forward slashes '/'") but there are a lot of bad zip generators... - // Search "unzip mismatching "local" filename continuing with "central" filename version" on - // the internet. - // - // I think I see the logic here : the central directory is used to display - // content and the local directory is used to extract the files. Mixing / and \ - // may be used to display \ to windows users and use / when extracting the files. - // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394 - this.fileNameLength = reader.readInt(2); - localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir - this.fileName = reader.readString(this.fileNameLength); - reader.skip(localExtraFieldsLength); - - if (this.compressedSize == -1 || this.uncompressedSize == -1) { - throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize == -1 || uncompressedSize == -1)"); - } - - compression = utils.findCompression(this.compressionMethod); - if (compression === null) { // no compression found - throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")"); - } - this.decompressed = new CompressedObject(); - this.decompressed.compressedSize = this.compressedSize; - this.decompressed.uncompressedSize = this.uncompressedSize; - this.decompressed.crc32 = this.crc32; - this.decompressed.compressionMethod = this.compressionMethod; - this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression); - this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize); - - // we need to compute the crc32... - if (this.loadOptions.checkCRC32) { - this.decompressed = utils.transformTo("string", this.decompressed.getContent()); - if (jszipProto.crc32(this.decompressed) !== this.crc32) { - throw new Error("Corrupted zip : CRC32 mismatch"); - } - } - }, - - /** - * Read the central part of a zip file and add the info in this object. - * @param {DataReader} reader the reader to use. - */ - readCentralPart: function(reader) { - this.versionMadeBy = reader.readString(2); - this.versionNeeded = reader.readInt(2); - this.bitFlag = reader.readInt(2); - this.compressionMethod = reader.readString(2); - this.date = reader.readDate(); - this.crc32 = reader.readInt(4); - this.compressedSize = reader.readInt(4); - this.uncompressedSize = reader.readInt(4); - this.fileNameLength = reader.readInt(2); - this.extraFieldsLength = reader.readInt(2); - this.fileCommentLength = reader.readInt(2); - this.diskNumberStart = reader.readInt(2); - this.internalFileAttributes = reader.readInt(2); - this.externalFileAttributes = reader.readInt(4); - this.localHeaderOffset = reader.readInt(4); - - if (this.isEncrypted()) { - throw new Error("Encrypted zip are not supported"); - } - - this.fileName = reader.readString(this.fileNameLength); - this.readExtraFields(reader); - this.parseZIP64ExtraField(reader); - this.fileComment = reader.readString(this.fileCommentLength); - - // warning, this is true only for zip with madeBy == DOS (plateform dependent feature) - this.dir = this.externalFileAttributes & 0x00000010 ? true : false; - }, - /** - * Parse the ZIP64 extra field and merge the info in the current ZipEntry. - * @param {DataReader} reader the reader to use. - */ - parseZIP64ExtraField: function(reader) { - - if (!this.extraFields[0x0001]) { - return; - } - - // should be something, preparing the extra reader - var extraReader = new StringReader(this.extraFields[0x0001].value); - - // I really hope that these 64bits integer can fit in 32 bits integer, because js - // won't let us have more. - if (this.uncompressedSize === utils.MAX_VALUE_32BITS) { - this.uncompressedSize = extraReader.readInt(8); - } - if (this.compressedSize === utils.MAX_VALUE_32BITS) { - this.compressedSize = extraReader.readInt(8); - } - if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) { - this.localHeaderOffset = extraReader.readInt(8); - } - if (this.diskNumberStart === utils.MAX_VALUE_32BITS) { - this.diskNumberStart = extraReader.readInt(4); - } - }, - /** - * Read the central part of a zip file and add the info in this object. - * @param {DataReader} reader the reader to use. - */ - readExtraFields: function(reader) { - var start = reader.index, - extraFieldId, - extraFieldLength, - extraFieldValue; - - this.extraFields = this.extraFields || {}; - - while (reader.index < start + this.extraFieldsLength) { - extraFieldId = reader.readInt(2); - extraFieldLength = reader.readInt(2); - extraFieldValue = reader.readString(extraFieldLength); - - this.extraFields[extraFieldId] = { - id: extraFieldId, - length: extraFieldLength, - value: extraFieldValue - }; - } - }, - /** - * Apply an UTF8 transformation if needed. - */ - handleUTF8: function() { - if (this.useUTF8()) { - this.fileName = jszipProto.utf8decode(this.fileName); - this.fileComment = jszipProto.utf8decode(this.fileComment); - } else { - var upath = this.findExtraFieldUnicodePath(); - if (upath !== null) { - this.fileName = upath; - } - var ucomment = this.findExtraFieldUnicodeComment(); - if (ucomment !== null) { - this.fileComment = ucomment; - } - } - }, - - /** - * Find the unicode path declared in the extra field, if any. - * @return {String} the unicode path, null otherwise. - */ - findExtraFieldUnicodePath: function() { - var upathField = this.extraFields[0x7075]; - if (upathField) { - var extraReader = new StringReader(upathField.value); - - // wrong version - if (extraReader.readInt(1) !== 1) { - return null; - } - - // the crc of the filename changed, this field is out of date. - if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) { - return null; - } - - return jszipProto.utf8decode(extraReader.readString(upathField.length - 5)); - } - return null; - }, - - /** - * Find the unicode comment declared in the extra field, if any. - * @return {String} the unicode comment, null otherwise. - */ - findExtraFieldUnicodeComment: function() { - var ucommentField = this.extraFields[0x6375]; - if (ucommentField) { - var extraReader = new StringReader(ucommentField.value); - - // wrong version - if (extraReader.readInt(1) !== 1) { - return null; - } - - // the crc of the comment changed, this field is out of date. - if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) { - return null; - } - - return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5)); - } - return null; - } -}; -module.exports = ZipEntry; - -},{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(_dereq_,module,exports){ -// Top level file is just a mixin of submodules & constants -'use strict'; - -var assign = _dereq_('./lib/utils/common').assign; - -var deflate = _dereq_('./lib/deflate'); -var inflate = _dereq_('./lib/inflate'); -var constants = _dereq_('./lib/zlib/constants'); - -var pako = {}; - -assign(pako, deflate, inflate, constants); - -module.exports = pako; -},{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(_dereq_,module,exports){ -'use strict'; - - -var zlib_deflate = _dereq_('./zlib/deflate.js'); -var utils = _dereq_('./utils/common'); -var strings = _dereq_('./utils/strings'); -var msg = _dereq_('./zlib/messages'); -var zstream = _dereq_('./zlib/zstream'); - - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -var Z_NO_FLUSH = 0; -var Z_FINISH = 4; - -var Z_OK = 0; -var Z_STREAM_END = 1; - -var Z_DEFAULT_COMPRESSION = -1; - -var Z_DEFAULT_STRATEGY = 0; - -var Z_DEFLATED = 8; - -/* ===========================================================================*/ - - -/** - * class Deflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[deflate]], - * [[deflateRaw]] and [[gzip]]. - **/ - -/* internal - * Deflate.chunks -> Array - * - * Chunks of output data, if [[Deflate#onData]] not overriden. - **/ - -/** - * Deflate.result -> Uint8Array|Array - * - * Compressed result, generated by default [[Deflate#onData]] - * and [[Deflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Deflate#push]] with `Z_FINISH` / `true` param). - **/ - -/** - * Deflate.err -> Number - * - * Error code after deflate finished. 0 (Z_OK) on success. - * You will not need it in real life, because deflate errors - * are possible only on wrong options or bad `onData` / `onEnd` - * custom handlers. - **/ - -/** - * Deflate.msg -> String - * - * Error message, if [[Deflate.err]] != 0 - **/ - - -/** - * new Deflate(options) - * - options (Object): zlib deflate options. - * - * Creates new deflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `level` - * - `windowBits` - * - `memLevel` - * - `strategy` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw deflate - * - `gzip` (Boolean) - create gzip wrapper - * - `to` (String) - if equal to 'string', then result will be "binary string" - * (each char code [0..255]) - * - `header` (Object) - custom header for gzip - * - `text` (Boolean) - true if compressed data believed to be text - * - `time` (Number) - modification time, unix timestamp - * - `os` (Number) - operation system code - * - `extra` (Array) - array of bytes with extra data (max 65536) - * - `name` (String) - file name (binary string) - * - `comment` (String) - comment (binary string) - * - `hcrc` (Boolean) - true if header crc should be added - * - * ##### Example: - * - * ```javascript - * var pako = require('pako') - * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) - * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * var deflate = new pako.Deflate({ level: 3}); - * - * deflate.push(chunk1, false); - * deflate.push(chunk2, true); // true -> last chunk - * - * if (deflate.err) { throw new Error(deflate.err); } - * - * console.log(deflate.result); - * ``` - **/ -var Deflate = function(options) { - - this.options = utils.assign({ - level: Z_DEFAULT_COMPRESSION, - method: Z_DEFLATED, - chunkSize: 16384, - windowBits: 15, - memLevel: 8, - strategy: Z_DEFAULT_STRATEGY, - to: '' - }, options || {}); - - var opt = this.options; - - if (opt.raw && (opt.windowBits > 0)) { - opt.windowBits = -opt.windowBits; - } - - else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { - opt.windowBits += 16; - } - - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new zstream(); - this.strm.avail_out = 0; - - var status = zlib_deflate.deflateInit2( - this.strm, - opt.level, - opt.method, - opt.windowBits, - opt.memLevel, - opt.strategy - ); - - if (status !== Z_OK) { - throw new Error(msg[status]); - } - - if (opt.header) { - zlib_deflate.deflateSetHeader(this.strm, opt.header); - } -}; - -/** - * Deflate#push(data[, mode]) -> Boolean - * - data (Uint8Array|Array|String): input data. Strings will be converted to - * utf8 byte sequence. - * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. - * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH. - * - * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with - * new compressed chunks. Returns `true` on success. The last data block must have - * mode Z_FINISH (or `true`). That flush internal pending buffers and call - * [[Deflate#onEnd]]. - * - * On fail call [[Deflate#onEnd]] with error code and return false. - * - * We strongly recommend to use `Uint8Array` on input for best speed (output - * array format is detected automatically). Also, don't skip last param and always - * use the same type in your code (boolean or number). That will improve JS speed. - * - * For regular `Array`-s make sure all elements are [0..255]. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ -Deflate.prototype.push = function(data, mode) { - var strm = this.strm; - var chunkSize = this.options.chunkSize; - var status, _mode; - - if (this.ended) { return false; } - - _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH); - - // Convert data if needed - if (typeof data === 'string') { - // If we need to compress text, change encoding to utf8. - strm.input = strings.string2buf(data); - } else { - strm.input = data; - } - - strm.next_in = 0; - strm.avail_in = strm.input.length; - - do { - if (strm.avail_out === 0) { - strm.output = new utils.Buf8(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - status = zlib_deflate.deflate(strm, _mode); /* no bad return value */ - - if (status !== Z_STREAM_END && status !== Z_OK) { - this.onEnd(status); - this.ended = true; - return false; - } - if (strm.avail_out === 0 || (strm.avail_in === 0 && _mode === Z_FINISH)) { - if (this.options.to === 'string') { - this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out))); - } else { - this.onData(utils.shrinkBuf(strm.output, strm.next_out)); - } - } - } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END); - - // Finalize on the last chunk. - if (_mode === Z_FINISH) { - status = zlib_deflate.deflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return status === Z_OK; - } - - return true; -}; - - -/** - * Deflate#onData(chunk) -> Void - * - chunk (Uint8Array|Array|String): ouput data. Type of array depends - * on js engine support. When string output requested, each chunk - * will be string. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ -Deflate.prototype.onData = function(chunk) { - this.chunks.push(chunk); -}; - - -/** - * Deflate#onEnd(status) -> Void - * - status (Number): deflate status. 0 (Z_OK) on success, - * other if not. - * - * Called once after you tell deflate that input stream complete - * or error happenned. By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ -Deflate.prototype.onEnd = function(status) { - // On success - join - if (status === Z_OK) { - if (this.options.to === 'string') { - this.result = this.chunks.join(''); - } else { - this.result = utils.flattenChunks(this.chunks); - } - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; -}; - - -/** - * deflate(data[, options]) -> Uint8Array|Array|String - * - data (Uint8Array|Array|String): input data to compress. - * - options (Object): zlib deflate options. - * - * Compress `data` with deflate alrorythm and `options`. - * - * Supported options are: - * - * - level - * - windowBits - * - memLevel - * - strategy - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - `to` (String) - if equal to 'string', then result will be "binary string" - * (each char code [0..255]) - * - * ##### Example: - * - * ```javascript - * var pako = require('pako') - * , data = Uint8Array([1,2,3,4,5,6,7,8,9]); - * - * console.log(pako.deflate(data)); - * ``` - **/ -function deflate(input, options) { - var deflator = new Deflate(options); - - deflator.push(input, true); - - // That will never happens, if you don't cheat with options :) - if (deflator.err) { throw deflator.msg; } - - return deflator.result; -} - - -/** - * deflateRaw(data[, options]) -> Uint8Array|Array|String - * - data (Uint8Array|Array|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ -function deflateRaw(input, options) { - options = options || {}; - options.raw = true; - return deflate(input, options); -} - - -/** - * gzip(data[, options]) -> Uint8Array|Array|String - * - data (Uint8Array|Array|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but create gzip wrapper instead of - * deflate one. - **/ -function gzip(input, options) { - options = options || {}; - options.gzip = true; - return deflate(input, options); -} - - -exports.Deflate = Deflate; -exports.deflate = deflate; -exports.deflateRaw = deflateRaw; -exports.gzip = gzip; -},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(_dereq_,module,exports){ -'use strict'; - - -var zlib_inflate = _dereq_('./zlib/inflate.js'); -var utils = _dereq_('./utils/common'); -var strings = _dereq_('./utils/strings'); -var c = _dereq_('./zlib/constants'); -var msg = _dereq_('./zlib/messages'); -var zstream = _dereq_('./zlib/zstream'); -var gzheader = _dereq_('./zlib/gzheader'); - - -/** - * class Inflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[inflate]] - * and [[inflateRaw]]. - **/ - -/* internal - * inflate.chunks -> Array - * - * Chunks of output data, if [[Inflate#onData]] not overriden. - **/ - -/** - * Inflate.result -> Uint8Array|Array|String - * - * Uncompressed result, generated by default [[Inflate#onData]] - * and [[Inflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Inflate#push]] with `Z_FINISH` / `true` param). - **/ - -/** - * Inflate.err -> Number - * - * Error code after inflate finished. 0 (Z_OK) on success. - * Should be checked if broken data possible. - **/ - -/** - * Inflate.msg -> String - * - * Error message, if [[Inflate.err]] != 0 - **/ - - -/** - * new Inflate(options) - * - options (Object): zlib inflate options. - * - * Creates new inflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `windowBits` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw inflate - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * By default, when no options set, autodetect deflate/gzip data format via - * wrapper header. - * - * ##### Example: - * - * ```javascript - * var pako = require('pako') - * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) - * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * var inflate = new pako.Inflate({ level: 3}); - * - * inflate.push(chunk1, false); - * inflate.push(chunk2, true); // true -> last chunk - * - * if (inflate.err) { throw new Error(inflate.err); } - * - * console.log(inflate.result); - * ``` - **/ -var Inflate = function(options) { - - this.options = utils.assign({ - chunkSize: 16384, - windowBits: 0, - to: '' - }, options || {}); - - var opt = this.options; - - // Force window size for `raw` data, if not set directly, - // because we have no header for autodetect. - if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { - opt.windowBits = -opt.windowBits; - if (opt.windowBits === 0) { opt.windowBits = -15; } - } - - // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate - if ((opt.windowBits >= 0) && (opt.windowBits < 16) && - !(options && options.windowBits)) { - opt.windowBits += 32; - } - - // Gzip header has no info about windows size, we can do autodetect only - // for deflate. So, if window size not set, force it to max when gzip possible - if ((opt.windowBits > 15) && (opt.windowBits < 48)) { - // bit 3 (16) -> gzipped data - // bit 4 (32) -> autodetect gzip/deflate - if ((opt.windowBits & 15) === 0) { - opt.windowBits |= 15; - } - } - - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new zstream(); - this.strm.avail_out = 0; - - var status = zlib_inflate.inflateInit2( - this.strm, - opt.windowBits - ); - - if (status !== c.Z_OK) { - throw new Error(msg[status]); - } - - this.header = new gzheader(); - - zlib_inflate.inflateGetHeader(this.strm, this.header); -}; - -/** - * Inflate#push(data[, mode]) -> Boolean - * - data (Uint8Array|Array|String): input data - * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. - * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH. - * - * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with - * new output chunks. Returns `true` on success. The last data block must have - * mode Z_FINISH (or `true`). That flush internal pending buffers and call - * [[Inflate#onEnd]]. - * - * On fail call [[Inflate#onEnd]] with error code and return false. - * - * We strongly recommend to use `Uint8Array` on input for best speed (output - * format is detected automatically). Also, don't skip last param and always - * use the same type in your code (boolean or number). That will improve JS speed. - * - * For regular `Array`-s make sure all elements are [0..255]. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ -Inflate.prototype.push = function(data, mode) { - var strm = this.strm; - var chunkSize = this.options.chunkSize; - var status, _mode; - var next_out_utf8, tail, utf8str; - - if (this.ended) { return false; } - _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH); - - // Convert data if needed - if (typeof data === 'string') { - // Only binary strings can be decompressed on practice - strm.input = strings.binstring2buf(data); - } else { - strm.input = data; - } - - strm.next_in = 0; - strm.avail_in = strm.input.length; - - do { - if (strm.avail_out === 0) { - strm.output = new utils.Buf8(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - - status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */ - - if (status !== c.Z_STREAM_END && status !== c.Z_OK) { - this.onEnd(status); - this.ended = true; - return false; - } - - if (strm.next_out) { - if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && _mode === c.Z_FINISH)) { - - if (this.options.to === 'string') { - - next_out_utf8 = strings.utf8border(strm.output, strm.next_out); - - tail = strm.next_out - next_out_utf8; - utf8str = strings.buf2string(strm.output, next_out_utf8); - - // move tail - strm.next_out = tail; - strm.avail_out = chunkSize - tail; - if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); } - - this.onData(utf8str); - - } else { - this.onData(utils.shrinkBuf(strm.output, strm.next_out)); - } - } - } - } while ((strm.avail_in > 0) && status !== c.Z_STREAM_END); - - if (status === c.Z_STREAM_END) { - _mode = c.Z_FINISH; - } - // Finalize on the last chunk. - if (_mode === c.Z_FINISH) { - status = zlib_inflate.inflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return status === c.Z_OK; - } - - return true; -}; - - -/** - * Inflate#onData(chunk) -> Void - * - chunk (Uint8Array|Array|String): ouput data. Type of array depends - * on js engine support. When string output requested, each chunk - * will be string. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ -Inflate.prototype.onData = function(chunk) { - this.chunks.push(chunk); -}; - - -/** - * Inflate#onEnd(status) -> Void - * - status (Number): inflate status. 0 (Z_OK) on success, - * other if not. - * - * Called once after you tell inflate that input stream complete - * or error happenned. By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ -Inflate.prototype.onEnd = function(status) { - // On success - join - if (status === c.Z_OK) { - if (this.options.to === 'string') { - // Glue & convert here, until we teach pako to send - // utf8 alligned strings to onData - this.result = this.chunks.join(''); - } else { - this.result = utils.flattenChunks(this.chunks); - } - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; -}; - - -/** - * inflate(data[, options]) -> Uint8Array|Array|String - * - data (Uint8Array|Array|String): input data to decompress. - * - options (Object): zlib inflate options. - * - * Decompress `data` with inflate/ungzip and `options`. Autodetect - * format via wrapper header by default. That's why we don't provide - * separate `ungzip` method. - * - * Supported options are: - * - * - windowBits - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * - * ##### Example: - * - * ```javascript - * var pako = require('pako') - * , input = pako.deflate([1,2,3,4,5,6,7,8,9]) - * , output; - * - * try { - * output = pako.inflate(input); - * } catch (err) - * console.log(err); - * } - * ``` - **/ -function inflate(input, options) { - var inflator = new Inflate(options); - - inflator.push(input, true); - - // That will never happens, if you don't cheat with options :) - if (inflator.err) { throw inflator.msg; } - - return inflator.result; -} - - -/** - * inflateRaw(data[, options]) -> Uint8Array|Array|String - * - data (Uint8Array|Array|String): input data to decompress. - * - options (Object): zlib inflate options. - * - * The same as [[inflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ -function inflateRaw(input, options) { - options = options || {}; - options.raw = true; - return inflate(input, options); -} - - -/** - * ungzip(data[, options]) -> Uint8Array|Array|String - * - data (Uint8Array|Array|String): input data to decompress. - * - options (Object): zlib inflate options. - * - * Just shortcut to [[inflate]], because it autodetects format - * by header.content. Done for convenience. - **/ - - -exports.Inflate = Inflate; -exports.inflate = inflate; -exports.inflateRaw = inflateRaw; -exports.ungzip = inflate; - -},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(_dereq_,module,exports){ -'use strict'; - - -var TYPED_OK = (typeof Uint8Array !== 'undefined') && - (typeof Uint16Array !== 'undefined') && - (typeof Int32Array !== 'undefined'); - - -exports.assign = function (obj /*from1, from2, from3, ...*/) { - var sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - var source = sources.shift(); - if (!source) { continue; } - - if (typeof(source) !== 'object') { - throw new TypeError(source + 'must be non-object'); - } - - for (var p in source) { - if (source.hasOwnProperty(p)) { - obj[p] = source[p]; - } - } - } - - return obj; -}; - - -// reduce buffer size, avoiding mem copy -exports.shrinkBuf = function (buf, size) { - if (buf.length === size) { return buf; } - if (buf.subarray) { return buf.subarray(0, size); } - buf.length = size; - return buf; -}; - - -var fnTyped = { - arraySet: function (dest, src, src_offs, len, dest_offs) { - if (src.subarray && dest.subarray) { - dest.set(src.subarray(src_offs, src_offs+len), dest_offs); - return; - } - // Fallback to ordinary array - for(var i=0; i= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1); -} -_utf8len[254]=_utf8len[254]=1; // Invalid sequence start - - -// convert string to array (typed, when possible) -exports.string2buf = function (str) { - var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; - - // count binary size - for (m_pos = 0; m_pos < str_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) { - c2 = str.charCodeAt(m_pos+1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; - } - - // allocate buffer - buf = new utils.Buf8(buf_len); - - // convert - for (i=0, m_pos = 0; i < buf_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) { - c2 = str.charCodeAt(m_pos+1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - if (c < 0x80) { - /* one byte */ - buf[i++] = c; - } else if (c < 0x800) { - /* two bytes */ - buf[i++] = 0xC0 | (c >>> 6); - buf[i++] = 0x80 | (c & 0x3f); - } else if (c < 0x10000) { - /* three bytes */ - buf[i++] = 0xE0 | (c >>> 12); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } else { - /* four bytes */ - buf[i++] = 0xf0 | (c >>> 18); - buf[i++] = 0x80 | (c >>> 12 & 0x3f); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } - } - - return buf; -}; - -// Helper (used in 2 places) -function buf2binstring(buf, len) { - // use fallback for big arrays to avoid stack overflow - if (len < 65537) { - if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) { - return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len)); - } - } - - var result = ''; - for(var i=0; i < len; i++) { - result += String.fromCharCode(buf[i]); - } - return result; -} - - -// Convert byte array to binary string -exports.buf2binstring = function(buf) { - return buf2binstring(buf, buf.length); -}; - - -// Convert binary string (typed, when possible) -exports.binstring2buf = function(str) { - var buf = new utils.Buf8(str.length); - for(var i=0, len=buf.length; i < len; i++) { - buf[i] = str.charCodeAt(i); - } - return buf; -}; - - -// convert array to string -exports.buf2string = function (buf, max) { - var i, out, c, c_len; - var len = max || buf.length; - - // Reserve max possible length (2 words per char) - // NB: by unknown reasons, Array is significantly faster for - // String.fromCharCode.apply than Uint16Array. - var utf16buf = new Array(len*2); - - for (out=0, i=0; i 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; } - - // apply mask on first byte - c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; - // join the rest - while (c_len > 1 && i < len) { - c = (c << 6) | (buf[i++] & 0x3f); - c_len--; - } - - // terminated by end of string? - if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } - - if (c < 0x10000) { - utf16buf[out++] = c; - } else { - c -= 0x10000; - utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); - utf16buf[out++] = 0xdc00 | (c & 0x3ff); - } - } - - return buf2binstring(utf16buf, out); -}; - - -// Calculate max possible position in utf8 buffer, -// that will not break sequence. If that's not possible -// - (very small limits) return max size as is. -// -// buf[] - utf8 bytes array -// max - length limit (mandatory); -exports.utf8border = function(buf, max) { - var pos; - - max = max || buf.length; - if (max > buf.length) { max = buf.length; } - - // go back from last position, until start of sequence found - pos = max-1; - while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } - - // Fuckup - very small and broken sequence, - // return max, because we should return something anyway. - if (pos < 0) { return max; } - - // If we came to start of buffer - that means vuffer is too small, - // return max too. - if (pos === 0) { return max; } - - return (pos + _utf8len[buf[pos]] > max) ? pos : max; -}; - -},{"./common":27}],29:[function(_dereq_,module,exports){ -'use strict'; - -// Note: adler32 takes 12% for level 0 and 2% for level 6. -// It doesn't worth to make additional optimizationa as in original. -// Small size is preferable. - -function adler32(adler, buf, len, pos) { - var s1 = (adler & 0xffff) |0 - , s2 = ((adler >>> 16) & 0xffff) |0 - , n = 0; - - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; - - do { - s1 = (s1 + buf[pos++]) |0; - s2 = (s2 + s1) |0; - } while (--n); - - s1 %= 65521; - s2 %= 65521; - } - - return (s1 | (s2 << 16)) |0; -} - - -module.exports = adler32; -},{}],30:[function(_dereq_,module,exports){ -module.exports = { - - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, - - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - //Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, - - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - - - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, - - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type -}; -},{}],31:[function(_dereq_,module,exports){ -'use strict'; - -// Note: we can't get significant speed boost here. -// So write code to minimize size - no pregenerated tables -// and array tools dependencies. - - -// Use ordinary array, since untyped makes no boost here -function makeTable() { - var c, table = []; - - for(var n =0; n < 256; n++){ - c = n; - for(var k =0; k < 8; k++){ - c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); - } - table[n] = c; - } - - return table; -} - -// Create table on load. Just 255 signed longs. Not a problem. -var crcTable = makeTable(); - - -function crc32(crc, buf, len, pos) { - var t = crcTable - , end = pos + len; - - crc = crc ^ (-1); - - for (var i = pos; i < end; i++ ) { - crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; - } - - return (crc ^ (-1)); // >>> 0; -} - - -module.exports = crc32; -},{}],32:[function(_dereq_,module,exports){ -'use strict'; - -var utils = _dereq_('../utils/common'); -var trees = _dereq_('./trees'); -var adler32 = _dereq_('./adler32'); -var crc32 = _dereq_('./crc32'); -var msg = _dereq_('./messages'); - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - - -/* Allowed flush values; see deflate() and inflate() below for details */ -var Z_NO_FLUSH = 0; -var Z_PARTIAL_FLUSH = 1; -//var Z_SYNC_FLUSH = 2; -var Z_FULL_FLUSH = 3; -var Z_FINISH = 4; -var Z_BLOCK = 5; -//var Z_TREES = 6; - - -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ -var Z_OK = 0; -var Z_STREAM_END = 1; -//var Z_NEED_DICT = 2; -//var Z_ERRNO = -1; -var Z_STREAM_ERROR = -2; -var Z_DATA_ERROR = -3; -//var Z_MEM_ERROR = -4; -var Z_BUF_ERROR = -5; -//var Z_VERSION_ERROR = -6; - - -/* compression levels */ -//var Z_NO_COMPRESSION = 0; -//var Z_BEST_SPEED = 1; -//var Z_BEST_COMPRESSION = 9; -var Z_DEFAULT_COMPRESSION = -1; - - -var Z_FILTERED = 1; -var Z_HUFFMAN_ONLY = 2; -var Z_RLE = 3; -var Z_FIXED = 4; -var Z_DEFAULT_STRATEGY = 0; - -/* Possible values of the data_type field (though see inflate()) */ -//var Z_BINARY = 0; -//var Z_TEXT = 1; -//var Z_ASCII = 1; // = Z_TEXT -var Z_UNKNOWN = 2; - - -/* The deflate compression method */ -var Z_DEFLATED = 8; - -/*============================================================================*/ - - -var MAX_MEM_LEVEL = 9; -/* Maximum value for memLevel in deflateInit2 */ -var MAX_WBITS = 15; -/* 32K LZ77 window */ -var DEF_MEM_LEVEL = 8; - - -var LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ -var LITERALS = 256; -/* number of literal bytes 0..255 */ -var L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ -var D_CODES = 30; -/* number of distance codes */ -var BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ -var HEAP_SIZE = 2*L_CODES + 1; -/* maximum heap size */ -var MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ - -var MIN_MATCH = 3; -var MAX_MATCH = 258; -var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); - -var PRESET_DICT = 0x20; - -var INIT_STATE = 42; -var EXTRA_STATE = 69; -var NAME_STATE = 73; -var COMMENT_STATE = 91; -var HCRC_STATE = 103; -var BUSY_STATE = 113; -var FINISH_STATE = 666; - -var BS_NEED_MORE = 1; /* block not completed, need more input or more output */ -var BS_BLOCK_DONE = 2; /* block flush performed */ -var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ -var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ - -var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. - -function err(strm, errorCode) { - strm.msg = msg[errorCode]; - return errorCode; -} - -function rank(f) { - return ((f) << 1) - ((f) > 4 ? 9 : 0); -} - -function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } - - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->output buffer and copying into it. - * (See also read_buf()). - */ -function flush_pending(strm) { - var s = strm.state; - - //_tr_flush_bits(s); - var len = s.pending; - if (len > strm.avail_out) { - len = strm.avail_out; - } - if (len === 0) { return; } - - utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); - strm.next_out += len; - s.pending_out += len; - strm.total_out += len; - strm.avail_out -= len; - s.pending -= len; - if (s.pending === 0) { - s.pending_out = 0; - } -} - - -function flush_block_only (s, last) { - trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); - s.block_start = s.strstart; - flush_pending(s.strm); -} - - -function put_byte(s, b) { - s.pending_buf[s.pending++] = b; -} - - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -function putShortMSB(s, b) { -// put_byte(s, (Byte)(b >> 8)); -// put_byte(s, (Byte)(b & 0xff)); - s.pending_buf[s.pending++] = (b >>> 8) & 0xff; - s.pending_buf[s.pending++] = b & 0xff; -} - - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->input buffer and copying from it. - * (See also flush_pending()). - */ -function read_buf(strm, buf, start, size) { - var len = strm.avail_in; - - if (len > size) { len = size; } - if (len === 0) { return 0; } - - strm.avail_in -= len; - - utils.arraySet(buf, strm.input, strm.next_in, len, start); - if (strm.state.wrap === 1) { - strm.adler = adler32(strm.adler, buf, len, start); - } - - else if (strm.state.wrap === 2) { - strm.adler = crc32(strm.adler, buf, len, start); - } - - strm.next_in += len; - strm.total_in += len; - - return len; -} - - -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -function longest_match(s, cur_match) { - var chain_length = s.max_chain_length; /* max hash chain length */ - var scan = s.strstart; /* current string */ - var match; /* matched string */ - var len; /* length of current match */ - var best_len = s.prev_length; /* best match length so far */ - var nice_match = s.nice_match; /* stop if match long enough */ - var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? - s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; - - var _win = s.window; // shortcut - - var wmask = s.w_mask; - var prev = s.prev; - - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - - var strend = s.strstart + MAX_MATCH; - var scan_end1 = _win[scan + best_len - 1]; - var scan_end = _win[scan + best_len]; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s.prev_length >= s.good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if (nice_match > s.lookahead) { nice_match = s.lookahead; } - - // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - // Assert(cur_match < s->strstart, "no future"); - match = cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ - - if (_win[match + best_len] !== scan_end || - _win[match + best_len - 1] !== scan_end1 || - _win[match] !== _win[scan] || - _win[++match] !== _win[scan + 1]) { - continue; - } - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2; - match++; - // Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - /*jshint noempty:false*/ - } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - scan < strend); - - // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (strend - scan); - scan = strend - MAX_MATCH; - - if (len > best_len) { - s.match_start = cur_match; - best_len = len; - if (len >= nice_match) { - break; - } - scan_end1 = _win[scan + best_len - 1]; - scan_end = _win[scan + best_len]; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); - - if (best_len <= s.lookahead) { - return best_len; - } - return s.lookahead; -} - - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -function fill_window(s) { - var _w_size = s.w_size; - var p, n, m, more, str; - - //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = s.window_size - s.lookahead - s.strstart; - - // JS ints have 32 bit, block below not needed - /* Deal with !@#$% 64K limit: */ - //if (sizeof(int) <= 2) { - // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - // more = wsize; - // - // } else if (more == (unsigned)(-1)) { - // /* Very unlikely, but possible on 16 bit machine if - // * strstart == 0 && lookahead == 1 (input done a byte at time) - // */ - // more--; - // } - //} - - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { - - utils.arraySet(s.window, s.window, _w_size, _w_size, 0); - s.match_start -= _w_size; - s.strstart -= _w_size; - /* we now have strstart >= MAX_DIST */ - s.block_start -= _w_size; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - - n = s.hash_size; - p = n; - do { - m = s.head[--p]; - s.head[p] = (m >= _w_size ? m - _w_size : 0); - } while (--n); - - n = _w_size; - p = n; - do { - m = s.prev[--p]; - s.prev[p] = (m >= _w_size ? m - _w_size : 0); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); - - more += _w_size; - } - if (s.strm.avail_in === 0) { - break; - } - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - //Assert(more >= 2, "more < 2"); - n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); - s.lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s.lookahead + s.insert >= MIN_MATCH) { - str = s.strstart - s.insert; - s.ins_h = s.window[str]; - - /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask; -//#if MIN_MATCH != 3 -// Call update_hash() MIN_MATCH-3 more times -//#endif - while (s.insert) { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH-1]) & s.hash_mask; - - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - s.insert--; - if (s.lookahead + s.insert < MIN_MATCH) { - break; - } - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ -// if (s.high_water < s.window_size) { -// var curr = s.strstart + s.lookahead; -// var init = 0; -// -// if (s.high_water < curr) { -// /* Previous high water mark below current data -- zero WIN_INIT -// * bytes or up to end of window, whichever is less. -// */ -// init = s.window_size - curr; -// if (init > WIN_INIT) -// init = WIN_INIT; -// zmemzero(s->window + curr, (unsigned)init); -// s->high_water = curr + init; -// } -// else if (s->high_water < (ulg)curr + WIN_INIT) { -// /* High water mark at or above current data, but below current data -// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up -// * to end of window, whichever is less. -// */ -// init = (ulg)curr + WIN_INIT - s->high_water; -// if (init > s->window_size - s->high_water) -// init = s->window_size - s->high_water; -// zmemzero(s->window + s->high_water, (unsigned)init); -// s->high_water += init; -// } -// } -// -// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, -// "not enough room for search"); -} - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -function deflate_stored(s, flush) { - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - var max_block_size = 0xffff; - - if (max_block_size > s.pending_buf_size - 5) { - max_block_size = s.pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s.lookahead <= 1) { - - //Assert(s->strstart < s->w_size+MAX_DIST(s) || - // s->block_start >= (long)s->w_size, "slide too late"); -// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) || -// s.block_start >= s.w_size)) { -// throw new Error("slide too late"); -// } - - fill_window(s); - if (s.lookahead === 0 && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - - if (s.lookahead === 0) { - break; - } - /* flush the current block */ - } - //Assert(s->block_start >= 0L, "block gone"); -// if (s.block_start < 0) throw new Error("block gone"); - - s.strstart += s.lookahead; - s.lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - var max_start = s.block_start + max_block_size; - - if (s.strstart === 0 || s.strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s.lookahead = s.strstart - max_start; - s.strstart = max_start; - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - - - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - - s.insert = 0; - - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - - if (s.strstart > s.block_start) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_NEED_MORE; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -function deflate_fast(s, flush) { - var hash_head; /* head of the hash chain */ - var bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; /* flush the current block */ - } - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - } - if (s.match_length >= MIN_MATCH) { - // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only - - /*** _tr_tally_dist(s, s.strstart - s.match_start, - s.match_length - MIN_MATCH, bflush); ***/ - bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); - - s.lookahead -= s.match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) { - s.match_length--; /* string at strstart already in table */ - do { - s.strstart++; - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s.match_length !== 0); - s.strstart++; - } else - { - s.strstart += s.match_length; - s.match_length = 0; - s.ins_h = s.window[s.strstart]; - /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask; - -//#if MIN_MATCH != 3 -// Call UPDATE_HASH() MIN_MATCH-3 more times -//#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s.window[s.strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = ((s.strstart < (MIN_MATCH-1)) ? s.strstart : MIN_MATCH-1); - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -function deflate_slow(s, flush) { - var hash_head; /* head of hash chain */ - var bflush; /* set if current block must be flushed */ - - var max_insert; - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - */ - s.prev_length = s.match_length; - s.prev_match = s.match_start; - s.match_length = MIN_MATCH-1; - - if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && - s.strstart - hash_head <= (s.w_size-MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - - if (s.match_length <= 5 && - (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s.match_length = MIN_MATCH-1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { - max_insert = s.strstart + s.lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - //check_match(s, s.strstart-1, s.prev_match, s.prev_length); - - /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, - s.prev_length - MIN_MATCH, bflush);***/ - bflush = trees._tr_tally(s, s.strstart - 1- s.prev_match, s.prev_length - MIN_MATCH); - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s.lookahead -= s.prev_length-1; - s.prev_length -= 2; - do { - if (++s.strstart <= max_insert) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - } while (--s.prev_length !== 0); - s.match_available = 0; - s.match_length = MIN_MATCH-1; - s.strstart++; - - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - } else if (s.match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]); - - if (bflush) { - /*** FLUSH_BLOCK_ONLY(s, 0) ***/ - flush_block_only(s, false); - /***/ - } - s.strstart++; - s.lookahead--; - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s.match_available = 1; - s.strstart++; - s.lookahead--; - } - } - //Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s.match_available) { - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]); - - s.match_available = 0; - } - s.insert = s.strstart < MIN_MATCH-1 ? s.strstart : MIN_MATCH-1; - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; -} - - -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -function deflate_rle(s, flush) { - var bflush; /* set if current block must be flushed */ - var prev; /* byte at distance one to match */ - var scan, strend; /* scan goes up to strend for length of run */ - - var _win = s.window; - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s.lookahead <= MAX_MATCH) { - fill_window(s); - if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s.match_length = 0; - if (s.lookahead >= MIN_MATCH && s.strstart > 0) { - scan = s.strstart - 1; - prev = _win[scan]; - if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { - strend = s.strstart + MAX_MATCH; - do { - /*jshint noempty:false*/ - } while (prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - scan < strend); - s.match_length = MAX_MATCH - (strend - scan); - if (s.match_length > s.lookahead) { - s.match_length = s.lookahead; - } - } - //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s.match_length >= MIN_MATCH) { - //check_match(s, s.strstart, s.strstart - 1, s.match_length); - - /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ - bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH); - - s.lookahead -= s.match_length; - s.strstart += s.match_length; - s.match_length = 0; - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ -function deflate_huff(s, flush) { - var bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s.lookahead === 0) { - fill_window(s); - if (s.lookahead === 0) { - if (flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s.match_length = 0; - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -var Config = function (good_length, max_lazy, nice_length, max_chain, func) { - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; -}; - -var configuration_table; - -configuration_table = [ - /* good lazy nice chain */ - new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ - new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ - new Config(4, 5, 16, 8, deflate_fast), /* 2 */ - new Config(4, 6, 32, 32, deflate_fast), /* 3 */ - - new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ - new Config(8, 16, 32, 32, deflate_slow), /* 5 */ - new Config(8, 16, 128, 128, deflate_slow), /* 6 */ - new Config(8, 32, 128, 256, deflate_slow), /* 7 */ - new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ - new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ -]; - - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -function lm_init(s) { - s.window_size = 2 * s.w_size; - - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - - /* Set the default configuration parameters: - */ - s.max_lazy_match = configuration_table[s.level].max_lazy; - s.good_match = configuration_table[s.level].good_length; - s.nice_match = configuration_table[s.level].nice_length; - s.max_chain_length = configuration_table[s.level].max_chain; - - s.strstart = 0; - s.block_start = 0; - s.lookahead = 0; - s.insert = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - s.ins_h = 0; -} - - -function DeflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.status = 0; /* as the name implies */ - this.pending_buf = null; /* output still pending */ - this.pending_buf_size = 0; /* size of pending_buf */ - this.pending_out = 0; /* next pending byte to output to the stream */ - this.pending = 0; /* nb of bytes in the pending buffer */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.gzhead = null; /* gzip header information to write */ - this.gzindex = 0; /* where in extra, name, or comment */ - this.method = Z_DEFLATED; /* can only be DEFLATED */ - this.last_flush = -1; /* value of flush param for previous deflate call */ - - this.w_size = 0; /* LZ77 window size (32K by default) */ - this.w_bits = 0; /* log2(w_size) (8..16) */ - this.w_mask = 0; /* w_size - 1 */ - - this.window = null; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. - */ - - this.window_size = 0; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - this.prev = null; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - this.head = null; /* Heads of the hash chains or NIL. */ - - this.ins_h = 0; /* hash index of string to be inserted */ - this.hash_size = 0; /* number of elements in hash table */ - this.hash_bits = 0; /* log2(hash_size) */ - this.hash_mask = 0; /* hash_size-1 */ - - this.hash_shift = 0; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - this.block_start = 0; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - this.match_length = 0; /* length of best match */ - this.prev_match = 0; /* previous match */ - this.match_available = 0; /* set if previous match exists */ - this.strstart = 0; /* start of string to insert */ - this.match_start = 0; /* start of matching string */ - this.lookahead = 0; /* number of valid bytes ahead in window */ - - this.prev_length = 0; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - this.max_chain_length = 0; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - this.max_lazy_match = 0; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ - // That's alias to max_lazy_match, don't use directly - //this.max_insert_length = 0; - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - this.level = 0; /* compression level (1..9) */ - this.strategy = 0; /* favor or force Huffman coding*/ - - this.good_match = 0; - /* Use a faster search when the previous match is longer than this */ - - this.nice_match = 0; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - - /* Didn't use ct_data typedef below to suppress compiler warning */ - - // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - // Use flat array of DOUBLE size, with interleaved fata, - // because JS does not support effective - this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2); - this.dyn_dtree = new utils.Buf16((2*D_CODES+1) * 2); - this.bl_tree = new utils.Buf16((2*BL_CODES+1) * 2); - zero(this.dyn_ltree); - zero(this.dyn_dtree); - zero(this.bl_tree); - - this.l_desc = null; /* desc. for literal tree */ - this.d_desc = null; /* desc. for distance tree */ - this.bl_desc = null; /* desc. for bit length tree */ - - //ush bl_count[MAX_BITS+1]; - this.bl_count = new utils.Buf16(MAX_BITS+1); - /* number of codes at each bit length for an optimal tree */ - - //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - this.heap = new utils.Buf16(2*L_CODES+1); /* heap used to build the Huffman trees */ - zero(this.heap); - - this.heap_len = 0; /* number of elements in the heap */ - this.heap_max = 0; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - this.depth = new utils.Buf16(2*L_CODES+1); //uch depth[2*L_CODES+1]; - zero(this.depth); - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - this.l_buf = 0; /* buffer index for literals or lengths */ - - this.lit_bufsize = 0; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - this.last_lit = 0; /* running index in l_buf */ - - this.d_buf = 0; - /* Buffer index for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - this.opt_len = 0; /* bit length of current block with optimal trees */ - this.static_len = 0; /* bit length of current block with static trees */ - this.matches = 0; /* number of string matches in current block */ - this.insert = 0; /* bytes at end of window left to insert */ - - - this.bi_buf = 0; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - this.bi_valid = 0; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - // Used for window memory init. We safely ignore it for JS. That makes - // sense only for pointers and memory check tools. - //this.high_water = 0; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ -} - - -function deflateResetKeep(strm) { - var s; - - if (!strm || !strm.state) { - return err(strm, Z_STREAM_ERROR); - } - - strm.total_in = strm.total_out = 0; - strm.data_type = Z_UNKNOWN; - - s = strm.state; - s.pending = 0; - s.pending_out = 0; - - if (s.wrap < 0) { - s.wrap = -s.wrap; - /* was made negative by deflate(..., Z_FINISH); */ - } - s.status = (s.wrap ? INIT_STATE : BUSY_STATE); - strm.adler = (s.wrap === 2) ? - 0 // crc32(0, Z_NULL, 0) - : - 1; // adler32(0, Z_NULL, 0) - s.last_flush = Z_NO_FLUSH; - trees._tr_init(s); - return Z_OK; -} - - -function deflateReset(strm) { - var ret = deflateResetKeep(strm); - if (ret === Z_OK) { - lm_init(strm.state); - } - return ret; -} - - -function deflateSetHeader(strm, head) { - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; } - strm.state.gzhead = head; - return Z_OK; -} - - -function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { - if (!strm) { // === Z_NULL - return Z_STREAM_ERROR; - } - var wrap = 1; - - if (level === Z_DEFAULT_COMPRESSION) { - level = 6; - } - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } - - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } - - - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED) { - return err(strm, Z_STREAM_ERROR); - } - - - if (windowBits === 8) { - windowBits = 9; - } - /* until 256-byte window bug fixed */ - - var s = new DeflateState(); - - strm.state = s; - s.strm = strm; - - s.wrap = wrap; - s.gzhead = null; - s.w_bits = windowBits; - s.w_size = 1 << s.w_bits; - s.w_mask = s.w_size - 1; - - s.hash_bits = memLevel + 7; - s.hash_size = 1 << s.hash_bits; - s.hash_mask = s.hash_size - 1; - s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); - - s.window = new utils.Buf8(s.w_size * 2); - s.head = new utils.Buf16(s.hash_size); - s.prev = new utils.Buf16(s.w_size); - - // Don't need mem init magic for JS. - //s.high_water = 0; /* nothing written to s->window yet */ - - s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - s.pending_buf_size = s.lit_bufsize * 4; - s.pending_buf = new utils.Buf8(s.pending_buf_size); - - s.d_buf = s.lit_bufsize >> 1; - s.l_buf = (1 + 2) * s.lit_bufsize; - - s.level = level; - s.strategy = strategy; - s.method = method; - - return deflateReset(strm); -} - -function deflateInit(strm, level) { - return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); -} - - -function deflate(strm, flush) { - var old_flush, s; - var beg, val; // for gzip header write only - - if (!strm || !strm.state || - flush > Z_BLOCK || flush < 0) { - return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR; - } - - s = strm.state; - - if (!strm.output || - (!strm.input && strm.avail_in !== 0) || - (s.status === FINISH_STATE && flush !== Z_FINISH)) { - return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR); - } - - s.strm = strm; /* just in case */ - old_flush = s.last_flush; - s.last_flush = flush; - - /* Write the header */ - if (s.status === INIT_STATE) { - - if (s.wrap === 2) { // GZIP header - strm.adler = 0; //crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (!s.gzhead) { // s->gzhead == Z_NULL - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s.status = BUSY_STATE; - } - else { - put_byte(s, (s.gzhead.text ? 1 : 0) + - (s.gzhead.hcrc ? 2 : 0) + - (!s.gzhead.extra ? 0 : 4) + - (!s.gzhead.name ? 0 : 8) + - (!s.gzhead.comment ? 0 : 16) - ); - put_byte(s, s.gzhead.time & 0xff); - put_byte(s, (s.gzhead.time >> 8) & 0xff); - put_byte(s, (s.gzhead.time >> 16) & 0xff); - put_byte(s, (s.gzhead.time >> 24) & 0xff); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, s.gzhead.os & 0xff); - if (s.gzhead.extra && s.gzhead.extra.length) { - put_byte(s, s.gzhead.extra.length & 0xff); - put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); - } - if (s.gzhead.hcrc) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0); - } - s.gzindex = 0; - s.status = EXTRA_STATE; - } - } - else // DEFLATE header - { - var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8; - var level_flags = -1; - - if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { - level_flags = 0; - } else if (s.level < 6) { - level_flags = 1; - } else if (s.level === 6) { - level_flags = 2; - } else { - level_flags = 3; - } - header |= (level_flags << 6); - if (s.strstart !== 0) { header |= PRESET_DICT; } - header += 31 - (header % 31); - - s.status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s.strstart !== 0) { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - strm.adler = 1; // adler32(0L, Z_NULL, 0); - } - } - -//#ifdef GZIP - if (s.status === EXTRA_STATE) { - if (s.gzhead.extra/* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - - while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - break; - } - } - put_byte(s, s.gzhead.extra[s.gzindex] & 0xff); - s.gzindex++; - } - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (s.gzindex === s.gzhead.extra.length) { - s.gzindex = 0; - s.status = NAME_STATE; - } - } - else { - s.status = NAME_STATE; - } - } - if (s.status === NAME_STATE) { - if (s.gzhead.name/* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - //int val; - - do { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - val = 1; - break; - } - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.name.length) { - val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - - if (s.gzhead.hcrc && s.pending > beg){ - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (val === 0) { - s.gzindex = 0; - s.status = COMMENT_STATE; - } - } - else { - s.status = COMMENT_STATE; - } - } - if (s.status === COMMENT_STATE) { - if (s.gzhead.comment/* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - //int val; - - do { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - val = 1; - break; - } - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.comment.length) { - val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (val === 0) { - s.status = HCRC_STATE; - } - } - else { - s.status = HCRC_STATE; - } - } - if (s.status === HCRC_STATE) { - if (s.gzhead.hcrc) { - if (s.pending + 2 > s.pending_buf_size) { - flush_pending(strm); - } - if (s.pending + 2 <= s.pending_buf_size) { - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - strm.adler = 0; //crc32(0L, Z_NULL, 0); - s.status = BUSY_STATE; - } - } - else { - s.status = BUSY_STATE; - } - } -//#endif - - /* Flush as much pending output as possible */ - if (s.pending !== 0) { - flush_pending(strm); - if (strm.avail_out === 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s.last_flush = -1; - return Z_OK; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && - flush !== Z_FINISH) { - return err(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s.status === FINISH_STATE && strm.avail_in !== 0) { - return err(strm, Z_BUF_ERROR); - } - - /* Start a new block or continue the current one. - */ - if (strm.avail_in !== 0 || s.lookahead !== 0 || - (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) { - var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) : - (s.strategy === Z_RLE ? deflate_rle(s, flush) : - configuration_table[s.level].func(s, flush)); - - if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { - s.status = FINISH_STATE; - } - if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { - if (strm.avail_out === 0) { - s.last_flush = -1; - /* avoid BUF_ERROR next call, see above */ - } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate === BS_BLOCK_DONE) { - if (flush === Z_PARTIAL_FLUSH) { - trees._tr_align(s); - } - else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ - - trees._tr_stored_block(s, 0, 0, false); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush === Z_FULL_FLUSH) { - /*** CLEAR_HASH(s); ***/ /* forget history */ - zero(s.head); // Fill with NIL (= 0); - - if (s.lookahead === 0) { - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - } - } - flush_pending(strm); - if (strm.avail_out === 0) { - s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } - } - } - //Assert(strm->avail_out > 0, "bug2"); - //if (strm.avail_out <= 0) { throw new Error("bug2");} - - if (flush !== Z_FINISH) { return Z_OK; } - if (s.wrap <= 0) { return Z_STREAM_END; } - - /* Write the trailer */ - if (s.wrap === 2) { - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - put_byte(s, (strm.adler >> 16) & 0xff); - put_byte(s, (strm.adler >> 24) & 0xff); - put_byte(s, strm.total_in & 0xff); - put_byte(s, (strm.total_in >> 8) & 0xff); - put_byte(s, (strm.total_in >> 16) & 0xff); - put_byte(s, (strm.total_in >> 24) & 0xff); - } - else - { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s.wrap > 0) { s.wrap = -s.wrap; } - /* write the trailer only once! */ - return s.pending !== 0 ? Z_OK : Z_STREAM_END; -} - -function deflateEnd(strm) { - var status; - - if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { - return Z_STREAM_ERROR; - } - - status = strm.state.status; - if (status !== INIT_STATE && - status !== EXTRA_STATE && - status !== NAME_STATE && - status !== COMMENT_STATE && - status !== HCRC_STATE && - status !== BUSY_STATE && - status !== FINISH_STATE - ) { - return err(strm, Z_STREAM_ERROR); - } - - strm.state = null; - - return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK; -} - -/* ========================================================================= - * Copy the source state to the destination state - */ -//function deflateCopy(dest, source) { -// -//} - -exports.deflateInit = deflateInit; -exports.deflateInit2 = deflateInit2; -exports.deflateReset = deflateReset; -exports.deflateResetKeep = deflateResetKeep; -exports.deflateSetHeader = deflateSetHeader; -exports.deflate = deflate; -exports.deflateEnd = deflateEnd; -exports.deflateInfo = 'pako deflate (from Nodeca project)'; - -/* Not implemented -exports.deflateBound = deflateBound; -exports.deflateCopy = deflateCopy; -exports.deflateSetDictionary = deflateSetDictionary; -exports.deflateParams = deflateParams; -exports.deflatePending = deflatePending; -exports.deflatePrime = deflatePrime; -exports.deflateTune = deflateTune; -*/ -},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(_dereq_,module,exports){ -'use strict'; - - -function GZheader() { - /* true if compressed data believed to be text */ - this.text = 0; - /* modification time */ - this.time = 0; - /* extra flags (not used when writing a gzip file) */ - this.xflags = 0; - /* operating system */ - this.os = 0; - /* pointer to extra field or Z_NULL if none */ - this.extra = null; - /* extra field length (valid if extra != Z_NULL) */ - this.extra_len = 0; // Actually, we don't need it in JS, - // but leave for few code modifications - - // - // Setup limits is not necessary because in js we should not preallocate memory - // for inflate use constant limit in 65536 bytes - // - - /* space at extra (only when reading header) */ - // this.extra_max = 0; - /* pointer to zero-terminated file name or Z_NULL */ - this.name = ''; - /* space at name (only when reading header) */ - // this.name_max = 0; - /* pointer to zero-terminated comment or Z_NULL */ - this.comment = ''; - /* space at comment (only when reading header) */ - // this.comm_max = 0; - /* true if there was or will be a header crc */ - this.hcrc = 0; - /* true when done reading gzip header (not used when writing a gzip file) */ - this.done = false; -} - -module.exports = GZheader; -},{}],34:[function(_dereq_,module,exports){ -'use strict'; - -// See state defs from inflate.js -var BAD = 30; /* got a data error -- remain here until reset */ -var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state.mode === LEN - strm.avail_in >= 6 - strm.avail_out >= 258 - start >= strm.avail_out - state.bits < 8 - - On return, state.mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm.avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm.avail_out >= 258 for each loop to avoid checking for - output space. - */ -module.exports = function inflate_fast(strm, start) { - var state; - var _in; /* local strm.input */ - var last; /* have enough input while in < last */ - var _out; /* local strm.output */ - var beg; /* inflate()'s initial strm.output */ - var end; /* while out < end, enough space available */ -//#ifdef INFLATE_STRICT - var dmax; /* maximum distance from zlib header */ -//#endif - var wsize; /* window size or zero if not using window */ - var whave; /* valid bytes in the window */ - var wnext; /* window write index */ - var window; /* allocated sliding window, if wsize != 0 */ - var hold; /* local strm.hold */ - var bits; /* local strm.bits */ - var lcode; /* local strm.lencode */ - var dcode; /* local strm.distcode */ - var lmask; /* mask for first level of length codes */ - var dmask; /* mask for first level of distance codes */ - var here; /* retrieved table entry */ - var op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - var len; /* match length, unused bytes */ - var dist; /* match distance */ - var from; /* where to copy match from */ - var from_source; - - - var input, output; // JS specific, because we have no pointers - - /* copy state to local variables */ - state = strm.state; - //here = state.here; - _in = strm.next_in; - input = strm.input; - last = _in + (strm.avail_in - 5); - _out = strm.next_out; - output = strm.output; - beg = _out - (start - strm.avail_out); - end = _out + (strm.avail_out - 257); -//#ifdef INFLATE_STRICT - dmax = state.dmax; -//#endif - wsize = state.wsize; - whave = state.whave; - wnext = state.wnext; - window = state.window; - hold = state.hold; - bits = state.bits; - lcode = state.lencode; - dcode = state.distcode; - lmask = (1 << state.lenbits) - 1; - dmask = (1 << state.distbits) - 1; - - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - top: - do { - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - - here = lcode[hold & lmask]; - - dolen: - for (;;) { // Goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - if (op === 0) { /* literal */ - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - output[_out++] = here & 0xffff/*here.val*/; - } - else if (op & 16) { /* length base */ - len = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - len += hold & ((1 << op) - 1); - hold >>>= op; - bits -= op; - } - //Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = dcode[hold & dmask]; - - dodist: - for (;;) { // goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - - if (op & 16) { /* distance base */ - dist = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - } - dist += hold & ((1 << op) - 1); -//#ifdef INFLATE_STRICT - if (dist > dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break top; - } -//#endif - hold >>>= op; - bits -= op; - //Tracevv((stderr, "inflate: distance %u\n", dist)); - op = _out - beg; /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break top; - } - -// (!) This block is disabled in zlib defailts, -// don't enable it for binary compatibility -//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR -// if (len <= op - whave) { -// do { -// output[_out++] = 0; -// } while (--len); -// continue top; -// } -// len -= op - whave; -// do { -// output[_out++] = 0; -// } while (--op > whave); -// if (op === 0) { -// from = _out - dist; -// do { -// output[_out++] = output[from++]; -// } while (--len); -// continue top; -// } -//#endif - } - from = 0; // window index - from_source = window; - if (wnext === 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - else if (wnext < op) { /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { /* some from end of window */ - len -= op; - do { - output[_out++] = window[from++]; - } while (--op); - from = 0; - if (wnext < len) { /* some from start of window */ - op = wnext; - len -= op; - do { - output[_out++] = window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - } - else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - while (len > 2) { - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - len -= 3; - } - if (len) { - output[_out++] = from_source[from++]; - if (len > 1) { - output[_out++] = from_source[from++]; - } - } - } - else { - from = _out - dist; /* copy direct from output */ - do { /* minimum length is three */ - output[_out++] = output[from++]; - output[_out++] = output[from++]; - output[_out++] = output[from++]; - len -= 3; - } while (len > 2); - if (len) { - output[_out++] = output[from++]; - if (len > 1) { - output[_out++] = output[from++]; - } - } - } - } - else if ((op & 64) === 0) { /* 2nd level distance code */ - here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dodist; - } - else { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break top; - } - - break; // need to emulate goto via "continue" - } - } - else if ((op & 64) === 0) { /* 2nd level length code */ - here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dolen; - } - else if (op & 32) { /* end-of-block */ - //Tracevv((stderr, "inflate: end of block\n")); - state.mode = TYPE; - break top; - } - else { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break top; - } - - break; // need to emulate goto via "continue" - } - } while (_in < last && _out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - _in -= len; - bits -= len << 3; - hold &= (1 << bits) - 1; - - /* update state and return */ - strm.next_in = _in; - strm.next_out = _out; - strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); - strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); - state.hold = hold; - state.bits = bits; - return; -}; - -},{}],35:[function(_dereq_,module,exports){ -'use strict'; - - -var utils = _dereq_('../utils/common'); -var adler32 = _dereq_('./adler32'); -var crc32 = _dereq_('./crc32'); -var inflate_fast = _dereq_('./inffast'); -var inflate_table = _dereq_('./inftrees'); - -var CODES = 0; -var LENS = 1; -var DISTS = 2; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - - -/* Allowed flush values; see deflate() and inflate() below for details */ -//var Z_NO_FLUSH = 0; -//var Z_PARTIAL_FLUSH = 1; -//var Z_SYNC_FLUSH = 2; -//var Z_FULL_FLUSH = 3; -var Z_FINISH = 4; -var Z_BLOCK = 5; -var Z_TREES = 6; - - -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ -var Z_OK = 0; -var Z_STREAM_END = 1; -var Z_NEED_DICT = 2; -//var Z_ERRNO = -1; -var Z_STREAM_ERROR = -2; -var Z_DATA_ERROR = -3; -var Z_MEM_ERROR = -4; -var Z_BUF_ERROR = -5; -//var Z_VERSION_ERROR = -6; - -/* The deflate compression method */ -var Z_DEFLATED = 8; - - -/* STATES ====================================================================*/ -/* ===========================================================================*/ - - -var HEAD = 1; /* i: waiting for magic header */ -var FLAGS = 2; /* i: waiting for method and flags (gzip) */ -var TIME = 3; /* i: waiting for modification time (gzip) */ -var OS = 4; /* i: waiting for extra flags and operating system (gzip) */ -var EXLEN = 5; /* i: waiting for extra length (gzip) */ -var EXTRA = 6; /* i: waiting for extra bytes (gzip) */ -var NAME = 7; /* i: waiting for end of file name (gzip) */ -var COMMENT = 8; /* i: waiting for end of comment (gzip) */ -var HCRC = 9; /* i: waiting for header crc (gzip) */ -var DICTID = 10; /* i: waiting for dictionary check value */ -var DICT = 11; /* waiting for inflateSetDictionary() call */ -var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ -var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */ -var STORED = 14; /* i: waiting for stored size (length and complement) */ -var COPY_ = 15; /* i/o: same as COPY below, but only first time in */ -var COPY = 16; /* i/o: waiting for input or output to copy stored block */ -var TABLE = 17; /* i: waiting for dynamic block table lengths */ -var LENLENS = 18; /* i: waiting for code length code lengths */ -var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */ -var LEN_ = 20; /* i: same as LEN below, but only first time in */ -var LEN = 21; /* i: waiting for length/lit/eob code */ -var LENEXT = 22; /* i: waiting for length extra bits */ -var DIST = 23; /* i: waiting for distance code */ -var DISTEXT = 24; /* i: waiting for distance extra bits */ -var MATCH = 25; /* o: waiting for output space to copy string */ -var LIT = 26; /* o: waiting for output space to write literal */ -var CHECK = 27; /* i: waiting for 32-bit check value */ -var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */ -var DONE = 29; /* finished check, done -- remain here until reset */ -var BAD = 30; /* got a data error -- remain here until reset */ -var MEM = 31; /* got an inflate() memory error -- remain here until reset */ -var SYNC = 32; /* looking for synchronization bytes to restart inflate() */ - -/* ===========================================================================*/ - - - -var ENOUGH_LENS = 852; -var ENOUGH_DISTS = 592; -//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - -var MAX_WBITS = 15; -/* 32K LZ77 window */ -var DEF_WBITS = MAX_WBITS; - - -function ZSWAP32(q) { - return (((q >>> 24) & 0xff) + - ((q >>> 8) & 0xff00) + - ((q & 0xff00) << 8) + - ((q & 0xff) << 24)); -} - - -function InflateState() { - this.mode = 0; /* current inflate mode */ - this.last = false; /* true if processing last block */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.havedict = false; /* true if dictionary provided */ - this.flags = 0; /* gzip header method and flags (0 if zlib) */ - this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ - this.check = 0; /* protected copy of check value */ - this.total = 0; /* protected copy of output count */ - // TODO: may be {} - this.head = null; /* where to save gzip header information */ - - /* sliding window */ - this.wbits = 0; /* log base 2 of requested window size */ - this.wsize = 0; /* window size or zero if not using window */ - this.whave = 0; /* valid bytes in the window */ - this.wnext = 0; /* window write index */ - this.window = null; /* allocated sliding window, if needed */ - - /* bit accumulator */ - this.hold = 0; /* input bit accumulator */ - this.bits = 0; /* number of bits in "in" */ - - /* for string and stored block copying */ - this.length = 0; /* literal or length of data to copy */ - this.offset = 0; /* distance back to copy string from */ - - /* for table and code decoding */ - this.extra = 0; /* extra bits needed */ - - /* fixed and dynamic code tables */ - this.lencode = null; /* starting table for length/literal codes */ - this.distcode = null; /* starting table for distance codes */ - this.lenbits = 0; /* index bits for lencode */ - this.distbits = 0; /* index bits for distcode */ - - /* dynamic table building */ - this.ncode = 0; /* number of code length code lengths */ - this.nlen = 0; /* number of length code lengths */ - this.ndist = 0; /* number of distance code lengths */ - this.have = 0; /* number of code lengths in lens[] */ - this.next = null; /* next available space in codes[] */ - - this.lens = new utils.Buf16(320); /* temporary storage for code lengths */ - this.work = new utils.Buf16(288); /* work area for code table building */ - - /* - because we don't have pointers in js, we use lencode and distcode directly - as buffers so we don't need codes - */ - //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ - this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ - this.distdyn = null; /* dynamic table for distance codes (JS specific) */ - this.sane = 0; /* if false, allow invalid distance too far */ - this.back = 0; /* bits back of last unprocessed length/lit */ - this.was = 0; /* initial length of match */ -} - -function inflateResetKeep(strm) { - var state; - - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - strm.total_in = strm.total_out = state.total = 0; - strm.msg = ''; /*Z_NULL*/ - if (state.wrap) { /* to support ill-conceived Java test suite */ - strm.adler = state.wrap & 1; - } - state.mode = HEAD; - state.last = 0; - state.havedict = 0; - state.dmax = 32768; - state.head = null/*Z_NULL*/; - state.hold = 0; - state.bits = 0; - //state.lencode = state.distcode = state.next = state.codes; - state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS); - state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS); - - state.sane = 1; - state.back = -1; - //Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - -function inflateReset(strm) { - var state; - - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - state.wsize = 0; - state.whave = 0; - state.wnext = 0; - return inflateResetKeep(strm); - -} - -function inflateReset2(strm, windowBits) { - var wrap; - var state; - - /* get the state */ - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } - else { - wrap = (windowBits >> 4) + 1; - if (windowBits < 48) { - windowBits &= 15; - } - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) { - return Z_STREAM_ERROR; - } - if (state.window !== null && state.wbits !== windowBits) { - state.window = null; - } - - /* update state and reset the rest of it */ - state.wrap = wrap; - state.wbits = windowBits; - return inflateReset(strm); -} - -function inflateInit2(strm, windowBits) { - var ret; - var state; - - if (!strm) { return Z_STREAM_ERROR; } - //strm.msg = Z_NULL; /* in case we return an error */ - - state = new InflateState(); - - //if (state === Z_NULL) return Z_MEM_ERROR; - //Tracev((stderr, "inflate: allocated\n")); - strm.state = state; - state.window = null/*Z_NULL*/; - ret = inflateReset2(strm, windowBits); - if (ret !== Z_OK) { - strm.state = null/*Z_NULL*/; - } - return ret; -} - -function inflateInit(strm) { - return inflateInit2(strm, DEF_WBITS); -} - - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -var virgin = true; - -var lenfix, distfix; // We have no pointers in JS, so keep tables separate - -function fixedtables(state) { - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - var sym; - - lenfix = new utils.Buf32(512); - distfix = new utils.Buf32(32); - - /* literal/length table */ - sym = 0; - while (sym < 144) { state.lens[sym++] = 8; } - while (sym < 256) { state.lens[sym++] = 9; } - while (sym < 280) { state.lens[sym++] = 7; } - while (sym < 288) { state.lens[sym++] = 8; } - - inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, {bits: 9}); - - /* distance table */ - sym = 0; - while (sym < 32) { state.lens[sym++] = 5; } - - inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, {bits: 5}); - - /* do this just once */ - virgin = false; - } - - state.lencode = lenfix; - state.lenbits = 9; - state.distcode = distfix; - state.distbits = 5; -} - - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -function updatewindow(strm, src, end, copy) { - var dist; - var state = strm.state; - - /* if it hasn't been done already, allocate space for the window */ - if (state.window === null) { - state.wsize = 1 << state.wbits; - state.wnext = 0; - state.whave = 0; - - state.window = new utils.Buf8(state.wsize); - } - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state.wsize) { - utils.arraySet(state.window,src, end - state.wsize, state.wsize, 0); - state.wnext = 0; - state.whave = state.wsize; - } - else { - dist = state.wsize - state.wnext; - if (dist > copy) { - dist = copy; - } - //zmemcpy(state->window + state->wnext, end - copy, dist); - utils.arraySet(state.window,src, end - copy, dist, state.wnext); - copy -= dist; - if (copy) { - //zmemcpy(state->window, end - copy, copy); - utils.arraySet(state.window,src, end - copy, copy, 0); - state.wnext = copy; - state.whave = state.wsize; - } - else { - state.wnext += dist; - if (state.wnext === state.wsize) { state.wnext = 0; } - if (state.whave < state.wsize) { state.whave += dist; } - } - } - return 0; -} - -function inflate(strm, flush) { - var state; - var input, output; // input/output buffers - var next; /* next input INDEX */ - var put; /* next output INDEX */ - var have, left; /* available input and output */ - var hold; /* bit buffer */ - var bits; /* bits in bit buffer */ - var _in, _out; /* save starting available input and output */ - var copy; /* number of stored or match bytes to copy */ - var from; /* where to copy match bytes from */ - var from_source; - var here = 0; /* current decoding table entry */ - var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) - //var last; /* parent table entry */ - var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) - var len; /* length to copy for repeats, bits to drop */ - var ret; /* return code */ - var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */ - var opts; - - var n; // temporary var for NEED_BITS - - var order = /* permutation of code lengths */ - [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; - - - if (!strm || !strm.state || !strm.output || - (!strm.input && strm.avail_in !== 0)) { - return Z_STREAM_ERROR; - } - - state = strm.state; - if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */ - - - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - _in = have; - _out = left; - ret = Z_OK; - - inf_leave: // goto emulation - for (;;) { - switch (state.mode) { - case HEAD: - if (state.wrap === 0) { - state.mode = TYPEDO; - break; - } - //=== NEEDBITS(16); - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ - state.check = 0/*crc32(0L, Z_NULL, 0)*/; - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = FLAGS; - break; - } - state.flags = 0; /* expect zlib header */ - if (state.head) { - state.head.done = false; - } - if (!(state.wrap & 1) || /* check if zlib header allowed */ - (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { - strm.msg = 'incorrect header check'; - state.mode = BAD; - break; - } - if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - len = (hold & 0x0f)/*BITS(4)*/ + 8; - if (state.wbits === 0) { - state.wbits = len; - } - else if (len > state.wbits) { - strm.msg = 'invalid window size'; - state.mode = BAD; - break; - } - state.dmax = 1 << len; - //Tracev((stderr, "inflate: zlib header ok\n")); - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = hold & 0x200 ? DICTID : TYPE; - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - break; - case FLAGS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.flags = hold; - if ((state.flags & 0xff) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - if (state.flags & 0xe000) { - strm.msg = 'unknown header flags set'; - state.mode = BAD; - break; - } - if (state.head) { - state.head.text = ((hold >> 8) & 1); - } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = TIME; - /* falls through */ - case TIME: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.time = hold; - } - if (state.flags & 0x0200) { - //=== CRC4(state.check, hold) - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - hbuf[2] = (hold >>> 16) & 0xff; - hbuf[3] = (hold >>> 24) & 0xff; - state.check = crc32(state.check, hbuf, 4, 0); - //=== - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = OS; - /* falls through */ - case OS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.xflags = (hold & 0xff); - state.head.os = (hold >> 8); - } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = EXLEN; - /* falls through */ - case EXLEN: - if (state.flags & 0x0400) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length = hold; - if (state.head) { - state.head.extra_len = hold; - } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - else if (state.head) { - state.head.extra = null/*Z_NULL*/; - } - state.mode = EXTRA; - /* falls through */ - case EXTRA: - if (state.flags & 0x0400) { - copy = state.length; - if (copy > have) { copy = have; } - if (copy) { - if (state.head) { - len = state.head.extra_len - state.length; - if (!state.head.extra) { - // Use untyped array for more conveniend processing later - state.head.extra = new Array(state.head.extra_len); - } - utils.arraySet( - state.head.extra, - input, - next, - // extra field is limited to 65536 bytes - // - no need for additional size check - copy, - /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ - len - ); - //zmemcpy(state.head.extra + len, next, - // len + copy > state.head.extra_max ? - // state.head.extra_max - len : copy); - } - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - state.length -= copy; - } - if (state.length) { break inf_leave; } - } - state.length = 0; - state.mode = NAME; - /* falls through */ - case NAME: - if (state.flags & 0x0800) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - // TODO: 2 or 1 bytes? - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.name_max*/)) { - state.head.name += String.fromCharCode(len); - } - } while (len && copy < have); - - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.name = null; - } - state.length = 0; - state.mode = COMMENT; - /* falls through */ - case COMMENT: - if (state.flags & 0x1000) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.comm_max*/)) { - state.head.comment += String.fromCharCode(len); - } - } while (len && copy < have); - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.comment = null; - } - state.mode = HCRC; - /* falls through */ - case HCRC: - if (state.flags & 0x0200) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (hold !== (state.check & 0xffff)) { - strm.msg = 'header crc mismatch'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - if (state.head) { - state.head.hcrc = ((state.flags >> 9) & 1); - state.head.done = true; - } - strm.adler = state.check = 0 /*crc32(0L, Z_NULL, 0)*/; - state.mode = TYPE; - break; - case DICTID: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - strm.adler = state.check = ZSWAP32(hold); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = DICT; - /* falls through */ - case DICT: - if (state.havedict === 0) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - return Z_NEED_DICT; - } - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = TYPE; - /* falls through */ - case TYPE: - if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } - /* falls through */ - case TYPEDO: - if (state.last) { - //--- BYTEBITS() ---// - hold >>>= bits & 7; - bits -= bits & 7; - //---// - state.mode = CHECK; - break; - } - //=== NEEDBITS(3); */ - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.last = (hold & 0x01)/*BITS(1)*/; - //--- DROPBITS(1) ---// - hold >>>= 1; - bits -= 1; - //---// - - switch ((hold & 0x03)/*BITS(2)*/) { - case 0: /* stored block */ - //Tracev((stderr, "inflate: stored block%s\n", - // state.last ? " (last)" : "")); - state.mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - //Tracev((stderr, "inflate: fixed codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = LEN_; /* decode codes */ - if (flush === Z_TREES) { - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break inf_leave; - } - break; - case 2: /* dynamic block */ - //Tracev((stderr, "inflate: dynamic codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = TABLE; - break; - case 3: - strm.msg = 'invalid block type'; - state.mode = BAD; - } - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break; - case STORED: - //--- BYTEBITS() ---// /* go to byte boundary */ - hold >>>= bits & 7; - bits -= bits & 7; - //---// - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { - strm.msg = 'invalid stored block lengths'; - state.mode = BAD; - break; - } - state.length = hold & 0xffff; - //Tracev((stderr, "inflate: stored length %u\n", - // state.length)); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = COPY_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case COPY_: - state.mode = COPY; - /* falls through */ - case COPY: - copy = state.length; - if (copy) { - if (copy > have) { copy = have; } - if (copy > left) { copy = left; } - if (copy === 0) { break inf_leave; } - //--- zmemcpy(put, next, copy); --- - utils.arraySet(output, input, next, copy, put); - //---// - have -= copy; - next += copy; - left -= copy; - put += copy; - state.length -= copy; - break; - } - //Tracev((stderr, "inflate: stored end\n")); - state.mode = TYPE; - break; - case TABLE: - //=== NEEDBITS(14); */ - while (bits < 14) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// -//#ifndef PKZIP_BUG_WORKAROUND - if (state.nlen > 286 || state.ndist > 30) { - strm.msg = 'too many length or distance symbols'; - state.mode = BAD; - break; - } -//#endif - //Tracev((stderr, "inflate: table sizes ok\n")); - state.have = 0; - state.mode = LENLENS; - /* falls through */ - case LENLENS: - while (state.have < state.ncode) { - //=== NEEDBITS(3); - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - while (state.have < 19) { - state.lens[order[state.have++]] = 0; - } - // We have separate tables & no pointers. 2 commented lines below not needed. - //state.next = state.codes; - //state.lencode = state.next; - // Switch to use dynamic table - state.lencode = state.lendyn; - state.lenbits = 7; - - opts = {bits: state.lenbits}; - ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); - state.lenbits = opts.bits; - - if (ret) { - strm.msg = 'invalid code lengths set'; - state.mode = BAD; - break; - } - //Tracev((stderr, "inflate: code lengths ok\n")); - state.have = 0; - state.mode = CODELENS; - /* falls through */ - case CODELENS: - while (state.have < state.nlen + state.ndist) { - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_val < 16) { - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.lens[state.have++] = here_val; - } - else { - if (here_val === 16) { - //=== NEEDBITS(here.bits + 2); - n = here_bits + 2; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - if (state.have === 0) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - len = state.lens[state.have - 1]; - copy = 3 + (hold & 0x03);//BITS(2); - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - } - else if (here_val === 17) { - //=== NEEDBITS(here.bits + 3); - n = here_bits + 3; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 3 + (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - else { - //=== NEEDBITS(here.bits + 7); - n = here_bits + 7; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 11 + (hold & 0x7f);//BITS(7); - //--- DROPBITS(7) ---// - hold >>>= 7; - bits -= 7; - //---// - } - if (state.have + copy > state.nlen + state.ndist) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - while (copy--) { - state.lens[state.have++] = len; - } - } - } - - /* handle error breaks in while */ - if (state.mode === BAD) { break; } - - /* check for end-of-block code (better have one) */ - if (state.lens[256] === 0) { - strm.msg = 'invalid code -- missing end-of-block'; - state.mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state.lenbits = 9; - - opts = {bits: state.lenbits}; - ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.lenbits = opts.bits; - // state.lencode = state.next; - - if (ret) { - strm.msg = 'invalid literal/lengths set'; - state.mode = BAD; - break; - } - - state.distbits = 6; - //state.distcode.copy(state.codes); - // Switch to use dynamic table - state.distcode = state.distdyn; - opts = {bits: state.distbits}; - ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.distbits = opts.bits; - // state.distcode = state.next; - - if (ret) { - strm.msg = 'invalid distances set'; - state.mode = BAD; - break; - } - //Tracev((stderr, 'inflate: codes ok\n')); - state.mode = LEN_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case LEN_: - state.mode = LEN; - /* falls through */ - case LEN: - if (have >= 6 && left >= 258) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - inflate_fast(strm, _out); - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - if (state.mode === TYPE) { - state.back = -1; - } - break; - } - state.back = 0; - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) -1)]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if (here_bits <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_op && (here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.lencode[last_val + - ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - state.length = here_val; - if (here_op === 0) { - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - state.mode = LIT; - break; - } - if (here_op & 32) { - //Tracevv((stderr, "inflate: end of block\n")); - state.back = -1; - state.mode = TYPE; - break; - } - if (here_op & 64) { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break; - } - state.extra = here_op & 15; - state.mode = LENEXT; - /* falls through */ - case LENEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //Tracevv((stderr, "inflate: length %u\n", state.length)); - state.was = state.length; - state.mode = DIST; - /* falls through */ - case DIST: - for (;;) { - here = state.distcode[hold & ((1 << state.distbits) -1)];/*BITS(state.distbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if ((here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.distcode[last_val + - ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - if (here_op & 64) { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break; - } - state.offset = here_val; - state.extra = (here_op) & 15; - state.mode = DISTEXT; - /* falls through */ - case DISTEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.offset += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } -//#ifdef INFLATE_STRICT - if (state.offset > state.dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } -//#endif - //Tracevv((stderr, "inflate: distance %u\n", state.offset)); - state.mode = MATCH; - /* falls through */ - case MATCH: - if (left === 0) { break inf_leave; } - copy = _out - left; - if (state.offset > copy) { /* copy from window */ - copy = state.offset - copy; - if (copy > state.whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } -// (!) This block is disabled in zlib defailts, -// don't enable it for binary compatibility -//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR -// Trace((stderr, "inflate.c too far\n")); -// copy -= state.whave; -// if (copy > state.length) { copy = state.length; } -// if (copy > left) { copy = left; } -// left -= copy; -// state.length -= copy; -// do { -// output[put++] = 0; -// } while (--copy); -// if (state.length === 0) { state.mode = LEN; } -// break; -//#endif - } - if (copy > state.wnext) { - copy -= state.wnext; - from = state.wsize - copy; - } - else { - from = state.wnext - copy; - } - if (copy > state.length) { copy = state.length; } - from_source = state.window; - } - else { /* copy from output */ - from_source = output; - from = put - state.offset; - copy = state.length; - } - if (copy > left) { copy = left; } - left -= copy; - state.length -= copy; - do { - output[put++] = from_source[from++]; - } while (--copy); - if (state.length === 0) { state.mode = LEN; } - break; - case LIT: - if (left === 0) { break inf_leave; } - output[put++] = state.length; - left--; - state.mode = LEN; - break; - case CHECK: - if (state.wrap) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - // Use '|' insdead of '+' to make sure that result is signed - hold |= input[next++] << bits; - bits += 8; - } - //===// - _out -= left; - strm.total_out += _out; - state.total += _out; - if (_out) { - strm.adler = state.check = - /*UPDATE(state.check, put - _out, _out);*/ - (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out)); - - } - _out = left; - // NB: crc32 stored as signed 32-bit int, ZSWAP32 returns signed too - if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) { - strm.msg = 'incorrect data check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: check matches trailer\n")); - } - state.mode = LENGTH; - /* falls through */ - case LENGTH: - if (state.wrap && state.flags) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (hold !== (state.total & 0xffffffff)) { - strm.msg = 'incorrect length check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: length matches trailer\n")); - } - state.mode = DONE; - /* falls through */ - case DONE: - ret = Z_STREAM_END; - break inf_leave; - case BAD: - ret = Z_DATA_ERROR; - break inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - /* falls through */ - default: - return Z_STREAM_ERROR; - } - } - - // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - - if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && - (state.mode < CHECK || flush !== Z_FINISH))) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { - state.mode = MEM; - return Z_MEM_ERROR; - } - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if (state.wrap && _out) { - strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ - (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + - (state.mode === TYPE ? 128 : 0) + - (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { - ret = Z_BUF_ERROR; - } - return ret; -} - -function inflateEnd(strm) { - - if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { - return Z_STREAM_ERROR; - } - - var state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK; -} - -function inflateGetHeader(strm, head) { - var state; - - /* check state */ - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } - - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK; -} - - -exports.inflateReset = inflateReset; -exports.inflateReset2 = inflateReset2; -exports.inflateResetKeep = inflateResetKeep; -exports.inflateInit = inflateInit; -exports.inflateInit2 = inflateInit2; -exports.inflate = inflate; -exports.inflateEnd = inflateEnd; -exports.inflateGetHeader = inflateGetHeader; -exports.inflateInfo = 'pako inflate (from Nodeca project)'; - -/* Not implemented -exports.inflateCopy = inflateCopy; -exports.inflateGetDictionary = inflateGetDictionary; -exports.inflateMark = inflateMark; -exports.inflatePrime = inflatePrime; -exports.inflateSetDictionary = inflateSetDictionary; -exports.inflateSync = inflateSync; -exports.inflateSyncPoint = inflateSyncPoint; -exports.inflateUndermine = inflateUndermine; -*/ -},{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(_dereq_,module,exports){ -'use strict'; - - -var utils = _dereq_('../utils/common'); - -var MAXBITS = 15; -var ENOUGH_LENS = 852; -var ENOUGH_DISTS = 592; -//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - -var CODES = 0; -var LENS = 1; -var DISTS = 2; - -var lbase = [ /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 -]; - -var lext = [ /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 -]; - -var dbase = [ /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0 -]; - -var dext = [ /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64 -]; - -module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) -{ - var bits = opts.bits; - //here = opts.here; /* table entry for duplication */ - - var len = 0; /* a code's length in bits */ - var sym = 0; /* index of code symbols */ - var min = 0, max = 0; /* minimum and maximum code lengths */ - var root = 0; /* number of index bits for root table */ - var curr = 0; /* number of index bits for current table */ - var drop = 0; /* code bits to drop for sub-table */ - var left = 0; /* number of prefix codes available */ - var used = 0; /* code entries in table used */ - var huff = 0; /* Huffman code */ - var incr; /* for incrementing code, index */ - var fill; /* index for replicating entries */ - var low; /* low bits for current root entry */ - var mask; /* mask for low root bits */ - var next; /* next available space in table */ - var base = null; /* base value table to use */ - var base_index = 0; -// var shoextra; /* extra bits table to use */ - var end; /* use base and extra for symbol > end */ - var count = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* number of codes of each length */ - var offs = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* offsets in table for each length */ - var extra = null; - var extra_index = 0; - - var here_bits, here_op, here_val; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; - } - - /* bound code lengths, force root to be within code lengths */ - root = bits; - for (max = MAXBITS; max >= 1; max--) { - if (count[max] !== 0) { break; } - } - if (root > max) { - root = max; - } - if (max === 0) { /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; - - - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; - - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) { - if (count[min] !== 0) { break; } - } - if (root < min) { - root = min; - } - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ - } - if (left > 0 && (type === CODES || max !== 1)) { - return -1; /* incomplete set */ - } - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; - } - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } - } - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES) { - base = extra = work; /* dummy value--not used */ - end = 19; - } else if (type === LENS) { - base = lbase; - base_index -= 257; - extra = lext; - extra_index -= 257; - end = 256; - } else { /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if ((type === LENS && used > ENOUGH_LENS) || - (type === DISTS && used > ENOUGH_DISTS)) { - return 1; - } - - var i=0; - /* process all codes and make table entries */ - for (;;) { - i++; - /* create table entry */ - here_bits = len - drop; - if (work[sym] < end) { - here_op = 0; - here_val = work[sym]; - } - else if (work[sym] > end) { - here_op = extra[extra_index + work[sym]]; - here_val = base[base_index + work[sym]]; - } - else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << (len - drop); - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; - } while (fill !== 0); - - /* backwards increment the len-bit code huff */ - incr = 1 << (len - 1); - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; - } - - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { break; } - len = lens[lens_index + work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { break; } - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1 << curr; - if ((type === LENS && used > ENOUGH_LENS) || - (type === DISTS && used > ENOUGH_DISTS)) { - return 1; - } - - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; - } - - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; -}; - -},{"../utils/common":27}],37:[function(_dereq_,module,exports){ -'use strict'; - -module.exports = { - '2': 'need dictionary', /* Z_NEED_DICT 2 */ - '1': 'stream end', /* Z_STREAM_END 1 */ - '0': '', /* Z_OK 0 */ - '-1': 'file error', /* Z_ERRNO (-1) */ - '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ -}; -},{}],38:[function(_dereq_,module,exports){ -'use strict'; - - -var utils = _dereq_('../utils/common'); - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - - -//var Z_FILTERED = 1; -//var Z_HUFFMAN_ONLY = 2; -//var Z_RLE = 3; -var Z_FIXED = 4; -//var Z_DEFAULT_STRATEGY = 0; - -/* Possible values of the data_type field (though see inflate()) */ -var Z_BINARY = 0; -var Z_TEXT = 1; -//var Z_ASCII = 1; // = Z_TEXT -var Z_UNKNOWN = 2; - -/*============================================================================*/ - - -function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } - -// From zutil.h - -var STORED_BLOCK = 0; -var STATIC_TREES = 1; -var DYN_TREES = 2; -/* The three kinds of block type */ - -var MIN_MATCH = 3; -var MAX_MATCH = 258; -/* The minimum and maximum match lengths */ - -// From deflate.h -/* =========================================================================== - * Internal compression state. - */ - -var LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ - -var LITERALS = 256; -/* number of literal bytes 0..255 */ - -var L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ - -var D_CODES = 30; -/* number of distance codes */ - -var BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ - -var HEAP_SIZE = 2*L_CODES + 1; -/* maximum heap size */ - -var MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ - -var Buf_size = 16; -/* size of bit buffer in bi_buf */ - - -/* =========================================================================== - * Constants - */ - -var MAX_BL_BITS = 7; -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -var END_BLOCK = 256; -/* end of block literal code */ - -var REP_3_6 = 16; -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -var REPZ_3_10 = 17; -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -var REPZ_11_138 = 18; -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -var extra_lbits = /* extra bits for each length code */ - [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; - -var extra_dbits = /* extra bits for each distance code */ - [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; - -var extra_blbits = /* extra bits for each bit length code */ - [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; - -var bl_order = - [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -// We pre-fill arrays with 0 to avoid uninitialized gaps - -var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ - -// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1 -var static_ltree = new Array((L_CODES+2) * 2); -zero(static_ltree); -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -var static_dtree = new Array(D_CODES * 2); -zero(static_dtree); -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -var _dist_code = new Array(DIST_CODE_LEN); -zero(_dist_code); -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -var _length_code = new Array(MAX_MATCH-MIN_MATCH+1); -zero(_length_code); -/* length code for each normalized match length (0 == MIN_MATCH) */ - -var base_length = new Array(LENGTH_CODES); -zero(base_length); -/* First normalized length for each code (0 = MIN_MATCH) */ - -var base_dist = new Array(D_CODES); -zero(base_dist); -/* First normalized distance for each code (0 = distance of 1) */ - - -var StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_length) { - - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ - - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; -}; - - -var static_l_desc; -var static_d_desc; -var static_bl_desc; - - -var TreeDesc = function(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ -}; - - - -function d_code(dist) { - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; -} - - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -function put_short (s, w) { -// put_byte(s, (uch)((w) & 0xff)); -// put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = (w) & 0xff; - s.pending_buf[s.pending++] = (w >>> 8) & 0xff; -} - - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -function send_bits(s, value, length) { - if (s.bi_valid > (Buf_size - length)) { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> (Buf_size - s.bi_valid); - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - s.bi_valid += length; - } -} - - -function send_code(s, c, tree) { - send_bits(s, tree[c*2]/*.Code*/, tree[c*2 + 1]/*.Len*/); -} - - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -function bi_reverse(code, len) { - var res = 0; - do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; -} - - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -function bi_flush(s) { - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; - - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } -} - - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -function gen_bitlen(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ -{ - var tree = desc.dyn_tree; - var max_code = desc.max_code; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var extra = desc.stat_desc.extra_bits; - var base = desc.stat_desc.extra_base; - var max_length = desc.stat_desc.max_length; - var h; /* heap index */ - var n, m; /* iterate over the tree elements */ - var bits; /* bit length */ - var xbits; /* extra bits */ - var f; /* frequency */ - var overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) { - s.bl_count[bits] = 0; - } - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max]*2 + 1]/*.Len*/ = 0; /* root of the heap */ - - for (h = s.heap_max+1; h < HEAP_SIZE; h++) { - n = s.heap[h]; - bits = tree[tree[n*2 +1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; - } - tree[n*2 + 1]/*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) { continue; } /* not a leaf node */ - - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n-base]; - } - f = tree[n * 2]/*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n*2 + 1]/*.Len*/ + xbits); - } - } - if (overflow === 0) { return; } - - // Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length-1; - while (s.bl_count[bits] === 0) { bits--; } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits+1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { continue; } - if (tree[m*2 + 1]/*.Len*/ !== bits) { - // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m*2 + 1]/*.Len*/)*tree[m*2]/*.Freq*/; - tree[m*2 + 1]/*.Len*/ = bits; - } - n--; - } - } -} - - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -function gen_codes(tree, max_code, bl_count) -// ct_data *tree; /* the tree to decorate */ -// int max_code; /* largest code with non zero frequency */ -// ushf *bl_count; /* number of codes at each bit length */ -{ - var next_code = new Array(MAX_BITS+1); /* next code value for each bit length */ - var code = 0; /* running code value */ - var bits; /* bit index */ - var n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES-1; code++) { - base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ - dist = 0; - for (code = 0 ; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ - for ( ; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { - _dist_code[256 + dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) { - bl_count[bits] = 0; - } - - n = 0; - while (n <= 143) { - static_ltree[n*2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n*2 + 1]/*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n*2 + 1]/*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n*2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES+1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n*2 + 1]/*.Len*/ = 5; - static_dtree[n*2]/*.Code*/ = bi_reverse(n, 5); - } - - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); - static_bl_desc =new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); - - //static_init_done = true; -} - - -/* =========================================================================== - * Initialize a new block. - */ -function init_block(s) { - var n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n*2]/*.Freq*/ = 0; } - for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n*2]/*.Freq*/ = 0; } - for (n = 0; n < BL_CODES; n++) { s.bl_tree[n*2]/*.Freq*/ = 0; } - - s.dyn_ltree[END_BLOCK*2]/*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.last_lit = s.matches = 0; -} - - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -function bi_windup(s) -{ - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; -} - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -function copy_block(s, buf, len, header) -//DeflateState *s; -//charf *buf; /* the input data */ -//unsigned len; /* its length */ -//int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - - if (header) { - put_short(s, len); - put_short(s, ~len); - } -// while (len--) { -// put_byte(s, *buf++); -// } - utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); - s.pending += len; -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -function smaller(tree, n, m, depth) { - var _n2 = n*2; - var _m2 = m*2; - return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || - (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); -} - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -function pqdownheap(s, tree, k) -// deflate_state *s; -// ct_data *tree; /* the tree to restore */ -// int k; /* node to move down */ -{ - var v = s.heap[k]; - var j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && - smaller(tree, s.heap[j+1], s.heap[j], s.depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { break; } - - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s.heap[k] = v; -} - - -// inlined manually -// var SMALLEST = 1; - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -function compress_block(s, ltree, dtree) -// deflate_state *s; -// const ct_data *ltree; /* literal tree */ -// const ct_data *dtree; /* distance tree */ -{ - var dist; /* distance of matched string */ - var lc; /* match length or unmatched char (if dist == 0) */ - var lx = 0; /* running index in l_buf */ - var code; /* the code to send */ - var extra; /* number of extra bits to send */ - - if (s.last_lit !== 0) { - do { - dist = (s.pending_buf[s.d_buf + lx*2] << 8) | (s.pending_buf[s.d_buf + lx*2 + 1]); - lc = s.pending_buf[s.l_buf + lx]; - lx++; - - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - // "pendingBuf overflow"); - - } while (lx < s.last_lit); - } - - send_code(s, END_BLOCK, ltree); -} - - -/* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ -function build_tree(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ -{ - var tree = desc.dyn_tree; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var elems = desc.stat_desc.elems; - var n, m; /* iterate over heap elements */ - var max_code = -1; /* largest code with non zero frequency */ - var node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) { - if (tree[n * 2]/*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - - } else { - tree[n*2 + 1]/*.Len*/ = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); - tree[node * 2]/*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; - - if (has_stree) { - s.static_len -= stree[node*2 + 1]/*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - desc.max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1/*SMALLEST*/]; - s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1/*SMALLEST*/); - /***/ - - m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ - - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; - - /* Create a new node father of n and m */ - tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n*2 + 1]/*.Dad*/ = tree[m*2 + 1]/*.Dad*/ = node; - - /* and insert the new node in the heap */ - s.heap[1/*SMALLEST*/] = node++; - pqdownheap(s, tree, 1/*SMALLEST*/); - - } while (s.heap_len >= 2); - - s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); -} - - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -function scan_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ - - var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */ - - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[(max_code+1)*2 + 1]/*.Len*/ = 0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n+1)*2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - s.bl_tree[curlen * 2]/*.Freq*/ += count; - - } else if (curlen !== 0) { - - if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } - s.bl_tree[REP_3_6*2]/*.Freq*/++; - - } else if (count <= 10) { - s.bl_tree[REPZ_3_10*2]/*.Freq*/++; - - } else { - s.bl_tree[REPZ_11_138*2]/*.Freq*/++; - } - - count = 0; - prevlen = curlen; - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } -} - - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -function send_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ - - var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */ - - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n+1)*2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); - - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count-3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count-3, 3); - - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count-11, 7); - } - - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } -} - - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -function build_bl_tree(s) { - var max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex]*2 + 1]/*.Len*/ !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3*(max_blindex+1) + 5+5+4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); - - return max_blindex; -} - - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -function send_all_trees(s, lcodes, dcodes, blcodes) -// deflate_state *s; -// int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - var rank; /* index in bl_order */ - - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank]*2 + 1]/*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_ltree, lcodes-1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_dtree, dcodes-1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -function detect_data_type(s) { - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - var black_mask = 0xf3ffc07f; - var n; - - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>>= 1) { - if ((black_mask & 1) && (s.dyn_ltree[n*2]/*.Freq*/ !== 0)) { - return Z_BINARY; - } - } - - /* Check for textual ("white-listed") bytes. */ - if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || - s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS; n++) { - if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - } - - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} - - -var static_init_done = false; - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -function _tr_init(s) -{ - - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } - - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); - - s.bi_buf = 0; - s.bi_valid = 0; - - /* Initialize the first block of the first file: */ - init_block(s); -} - - -/* =========================================================================== - * Send a stored block - */ -function _tr_stored_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK<<1)+(last ? 1 : 0), 3); /* send block type */ - copy_block(s, buf, stored_len, true); /* with header */ -} - - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ -function _tr_align(s) { - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); -} - - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -function _tr_flush_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block, or NULL if too old */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - var max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { - - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN) { - s.strm.data_type = detect_data_type(s); - } - - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s.opt_len+3+7) >>> 3; - static_lenb = (s.static_len+3+7) >>> 3; - - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->last_lit)); - - if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } - - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - - if ((stored_len+4 <= opt_lenb) && (buf !== -1)) { - /* 4: two words for the lengths */ - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, last); - - } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { - - send_bits(s, (STATIC_TREES<<1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); - - } else { - send_bits(s, (DYN_TREES<<1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code+1, s.d_desc.max_code+1, max_blindex+1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); - } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); - } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -function _tr_tally(s, dist, lc) -// deflate_state *s; -// unsigned dist; /* distance of matched string */ -// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - //var out_length, in_length, dcode; - - s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; - s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; - - s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; - s.last_lit++; - - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc*2]/*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s.dyn_ltree[(_length_code[lc]+LITERALS+1) * 2]/*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; - } - -// (!) This block is disabled in zlib defailts, -// don't enable it for binary compatibility - -//#ifdef TRUNCATE_BLOCK -// /* Try to guess if it is profitable to stop the current block here */ -// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { -// /* Compute an upper bound for the compressed length */ -// out_length = s.last_lit*8; -// in_length = s.strstart - s.block_start; -// -// for (dcode = 0; dcode < D_CODES; dcode++) { -// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); -// } -// out_length >>>= 3; -// //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", -// // s->last_lit, in_length, out_length, -// // 100L - out_length*100L/in_length)); -// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { -// return true; -// } -// } -//#endif - - return (s.last_lit === s.lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -exports._tr_init = _tr_init; -exports._tr_stored_block = _tr_stored_block; -exports._tr_flush_block = _tr_flush_block; -exports._tr_tally = _tr_tally; -exports._tr_align = _tr_align; -},{"../utils/common":27}],39:[function(_dereq_,module,exports){ -'use strict'; - - -function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = ''/*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2/*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; -} - -module.exports = ZStream; -},{}]},{},[9]) -(9) -})); diff --git a/docbits/80_parseopts.md b/docbits/80_parseopts.md index d0dc641..0fb657d 100644 --- a/docbits/80_parseopts.md +++ b/docbits/80_parseopts.md @@ -88,7 +88,7 @@ file but Excel will know how to handle it. This library applies similar logic: | `0xD0` | CFB Container | BIFF 5/8 or protected XLSX/XLSB or WQ3/QPW or XLR | | `0x09` | BIFF Stream | BIFF 2/3/4/5 | | `0x3C` | XML/HTML | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text | -| `0x50` | ZIP Archive | XLSB or XLSX/M or ODS or UOS2 or plain text | +| `0x50` | ZIP Archive | XLSB or XLSX/M or ODS or UOS2 or NUMBERS or text | | `0x49` | Plain Text | SYLK or plain text | | `0x54` | Plain Text | DIF or plain text | | `0xEF` | UTF8 Encoded | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text | diff --git a/docbits/85_filetype.md b/docbits/85_filetype.md index dc27ce5..1996264 100644 --- a/docbits/85_filetype.md +++ b/docbits/85_filetype.md @@ -20,6 +20,7 @@ Despite the library name `xlsx`, it supports numerous spreadsheet file formats: | Lotus Formatted Text (PRN) | ✔ | ✔ | | UTF-16 Unicode Text (TXT) | ✔ | ✔ | | **Other Workbook/Worksheet Formats** |:-----:|:-----:| +| Numbers 3.0+ / iWork 2013+ Spreadsheet (NUMBERS) | ✔ | | | OpenDocument Spreadsheet (ODS) | ✔ | ✔ | | Flat XML ODF Spreadsheet (FODS) | ✔ | ✔ | | Uniform Office Format Spreadsheet (标文通 UOS1/UOS2) | ✔ | | @@ -205,6 +206,21 @@ XLR also includes a `WksSSWorkBook` stream similar to Lotus FM3/FMT files. +#### Numbers 3.0+ / iWork 2013+ Spreadsheet (NUMBERS) + +
+ (click to show) + +iWork 2013 (Numbers 3.0 / Pages 5.0 / Keynote 6.0) switched from a proprietary +XML-based format to the current file format based on the iWork Archive (IWA). +This format has been used up through the current release (Numbers 11.2). + +The parser focuses on extracting raw data from tables. Numbers technically +supports multiple tables in a logical worksheet, including custom titles. This +parser will only extract the raw data from the first table from each worksheet. + +
+ #### OpenDocument Spreadsheet (ODS/FODS)
diff --git a/formats.png b/formats.png index 0e8c07271fa6d396642a5867ea0449973e3c5e73..0b2cad792c2aec91597591867b9d55ffad6cfaf8 100644 GIT binary patch literal 207722 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 WI2TT2!YP1+_`H)>2Uo~ig#14mR{l`{ literal 195182 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%0De_!1;ct)LFP*py?g#UE%Jb}A-pI4WS@iA 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

oW|IiG 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�@nxdMNMro8&0jMo`SkwSN6WXkiI4 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�y0fh>%q-Z3D(4}xl+(74E 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%0D{Ip4tV+CI#?Fz1ZCPNdwJ?EnWJThK-a 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 csf 123 -> csf qpw -> csf + nums -> csf } subgraph WORKSHEET { edge [color=aquamarine4]; diff --git a/modules/83_numbers.js b/modules/83_numbers.js index 792ca77..ca6342b 100644 --- a/modules/83_numbers.js +++ b/modules/83_numbers.js @@ -54,6 +54,11 @@ var NUMBERS = (function() { }); return out; }; + var popcnt = function(x) { + x -= x >> 1 & 1431655765; + x = (x & 858993459) + (x >> 2 & 858993459); + return (x + (x >> 4) & 252645135) * 16843009 >>> 24; + }; // src/proto.ts function parse_varint49(buf, ptr) { @@ -126,12 +131,16 @@ var NUMBERS = (function() { break; case 5: len = 4; + res = buf.slice(ptr[0], ptr[0] + len); + ptr[0] += len; + break; case 1: - if (!len) - len = 8; + len = 8; + res = buf.slice(ptr[0], ptr[0] + len); + ptr[0] += len; + break; case 2: - if (!len) - len = parse_varint49(buf, ptr); + len = parse_varint49(buf, ptr); res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; @@ -140,7 +149,7 @@ var NUMBERS = (function() { default: throw new Error("PB Type ".concat(type, " for Field ").concat(num, " at offset ").concat(off)); } - var v = { offset: off, data: res }; + var v = { offset: off, data: res, type: type }; if (out[num] == null) out[num] = [v]; else @@ -172,14 +181,14 @@ var NUMBERS = (function() { var t = buf[l++]; var len = buf[l] | buf[l + 1] << 8 | buf[l + 2] << 16; l += 3; - out.push(process_chunk(t, buf.slice(l, l + len))); + out.push(parse_snappy_chunk(t, buf.slice(l, l + len))); l += len; } if (l !== buf.length) throw new Error("data is not a valid framed stream!"); return u8concat(out); } - function process_chunk(type, buf) { + function parse_snappy_chunk(type, buf) { if (type != 0) throw new Error("Unexpected Snappy chunk type ".concat(type)); var ptr = [0]; @@ -270,6 +279,62 @@ var NUMBERS = (function() { return out; } + // src/prebnccell.ts + function parseit(buf, version) { + var dv = u8_to_dataview(buf); + var ctype = buf[version == 4 ? 1 : 2]; + var flags = dv.getUint32(4, true); + var data_offset = 12 + popcnt(flags & 16270) * 4; + var sidx = -1, ieee = NaN, dt = NaN; + if (flags & 16) { + sidx = dv.getUint32(data_offset, true); + data_offset += 4; + } + if (flags & 32) { + ieee = dv.getFloat64(data_offset, true); + data_offset += 8; + } + if (flags & 64) { + dt = dv.getFloat64(data_offset, true); + data_offset += 8; + } + var ret; + switch (ctype) { + case 0: + break; + case 2: + ret = { t: "n", v: ieee }; + break; + case 3: + ret = { t: "s", v: sidx }; + break; + case 5: + var dd = new Date(2001, 0, 1); + dd.setTime(dd.getTime() + dt * 1e3); + ret = { t: "d", v: dd }; + break; + case 6: + ret = { t: "b", v: ieee > 0 }; + break; + case 7: + ret = { t: "n", v: ieee }; + break; + default: + throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); + } + return ret; + } + function parse(buf) { + var version = buf[0]; + switch (version) { + case 3: + case 4: + return parseit(buf, version); + default: + throw new Error("Unsupported pre-BNC version ".concat(version)); + } + } + // src/numbers.ts var encode_col = function(C) { var s = ""; @@ -343,7 +408,7 @@ var NUMBERS = (function() { var pb = parse_shallow(root.data); var entries = pb[3]; var data = []; - entries == null ? void 0 : entries.forEach(function(entry) { + (entries || []).forEach(function(entry) { var le = parse_shallow(entry.data); var key = varint_to_i32(le[1][0].data) >>> 0; data[key] = u8str(le[3][0].data); @@ -405,50 +470,12 @@ var NUMBERS = (function() { tiles.forEach(function(tile2) { tile2.ref.forEach(function(row, R) { row.forEach(function(buf, C) { - var dv = u8_to_dataview(buf); - var ctype = buf[2]; var addr = encode_cell({ r: R, c: C }); - switch (ctype) { - case 0: - { - switch (buf[1]) { - case 3: - ws[addr] = { t: "s", v: sst[dv.getUint32(buf.length - 4, true)] }; - break; - case 2: - ws[addr] = { t: "n", v: dv.getFloat64(16, true) }; - break; - case 0: - break; - case 5: - break; - case 7: - break; - case 6: - ws[addr] = { t: "b", v: dv.getFloat64(buf.length - 8, true) > 0 }; - break; - default: - throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); - } - } - break; - case 3: - { - ws[addr] = { t: "s", v: sst[dv.getUint32(16, true)] }; - } - break; - case 2: - { - ws[addr] = { t: "n", v: dv.getFloat64(buf.length - 12, true) }; - } - break; - case 6: - { - ws[addr] = { t: "b", v: dv.getFloat64(16, true) > 0 }; - } - break; - default: - throw new Error("Unsupported cell type ".concat(ctype)); + var res = parse(buf); + if (res) { + ws[addr] = res; + if (res.t == "s" && typeof res.v == "number") + res.v = sst[res.v]; } }); }); diff --git a/modules/numbers_to_csv.node.ts b/modules/numbers_to_csv.node.ts index 69d2e2d..482139a 100644 --- a/modules/numbers_to_csv.node.ts +++ b/modules/numbers_to_csv.node.ts @@ -8,6 +8,10 @@ var f = process.argv[2]; var cfb = read(f, {type: "file"}); var wb = parse_numbers(cfb); var sn = process.argv[3]; -if(sn && !isNaN(+sn)) sn = wb.SheetNames[+sn]; -if(wb.SheetNames.indexOf(sn) == -1) sn = wb.SheetNames[0]; -console.log(utils.sheet_to_csv(wb.Sheets[sn])); \ No newline at end of file +if(typeof sn == "undefined") { + wb.SheetNames.forEach(sn => console.log(utils.sheet_to_csv(wb.Sheets[sn]))); +} else { + if(sn && !isNaN(+sn)) sn = wb.SheetNames[+sn]; + if(wb.SheetNames.indexOf(sn) == -1) sn = wb.SheetNames[0]; + console.log(utils.sheet_to_csv(wb.Sheets[sn])); +} diff --git a/modules/src/frame.ts b/modules/src/frame.ts index dba6789..e9ebdc6 100644 --- a/modules/src/frame.ts +++ b/modules/src/frame.ts @@ -1,5 +1,5 @@ /*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */ -import { Ptr, parse_varint49 } from './proto'; +import { Ptr, parse_varint49, write_varint49 } from './proto'; import { u8concat } from './util'; function is_framed(buf: Uint8Array): boolean { @@ -19,7 +19,7 @@ function deframe(buf: Uint8Array): Uint8Array { while(l < buf.length) { var t = buf[l++]; var len = buf[l] | (buf[l+1]<<8) | (buf[l+2] << 16); l += 3; - out.push(process_chunk(t, buf.slice(l, l + len))); + out.push(parse_snappy_chunk(t, buf.slice(l, l + len))); l += len; } if(l !== buf.length) throw new Error("data is not a valid framed stream!"); @@ -27,7 +27,34 @@ function deframe(buf: Uint8Array): Uint8Array { } export { deframe }; -function process_chunk(type: number, buf: Uint8Array): Uint8Array { +function reframe(buf: Uint8Array): Uint8Array { + var out: Uint8Array[] = []; + var l = 0; + while(l < buf.length) { + var c = Math.min(buf.length - l, 0xFFFFFFF); + var frame = new Uint8Array(4); + out.push(frame); + var usz = write_varint49(c); + var L = usz.length; + out.push(usz); + + if(c <= 60) { L++; out.push(new Uint8Array([(c - 1)<<2])); } + else if(c <= 0x100) { L += 2; out.push(new Uint8Array([0xF0, (c-1) & 0xFF])); } + else if(c <= 0x10000) { L += 3; out.push(new Uint8Array([0xF4, (c-1) & 0xFF, ((c-1) >> 8) & 0xFF])); } + else if(c <= 0x1000000) { L += 4; out.push(new Uint8Array([0xF8, (c-1) & 0xFF, ((c-1) >> 8) & 0xFF, ((c-1) >> 16) & 0xFF])); } + else if(c <= 0x100000000) { L += 5; out.push(new Uint8Array([0xFC, (c-1) & 0xFF, ((c-1) >> 8) & 0xFF, ((c-1) >> 16) & 0xFF, ((c-1) >>> 24) & 0xFF])); } + + out.push(buf.slice(l, l + c)); L += c; + + frame[0] = 0; + frame[1] = L & 0xFF; frame[2] = (L >> 8) & 0xFF; frame[3] = (L >> 16) & 0xFF; + l += c; + } + return u8concat(out); +} +export { reframe }; + +function parse_snappy_chunk(type: number, buf: Uint8Array): Uint8Array { if(type != 0) throw new Error(`Unexpected Snappy chunk type ${type}`); var ptr: Ptr = [0]; diff --git a/modules/src/numbers.ts b/modules/src/numbers.ts index 50d6f71..0b31e45 100644 --- a/modules/src/numbers.ts +++ b/modules/src/numbers.ts @@ -5,6 +5,7 @@ import { u8str, u8_to_dataview } from './util'; import { parse_shallow, varint_to_i32, parse_varint49, mappa } from './proto'; import { deframe } from './frame'; import { IWAArchiveInfo, IWAMessage, parse_iwa } from './iwa'; +import { parse as parse_bnc } from "./prebnccell"; /* written here to avoid a full import of the 'xlsx' library */ var encode_col = (C: number): string => { @@ -59,7 +60,7 @@ function parse_TST_TableDataList(M: IWAMessage[][], root: IWAMessage): string[] var pb = parse_shallow(root.data); var entries = pb[3]; var data = []; - entries?.forEach(entry => { + (entries||[]).forEach(entry => { var le = parse_shallow(entry.data); var key = varint_to_i32(le[1][0].data)>>>0; data[key] = u8str(le[3][0].data); @@ -129,33 +130,11 @@ function parse_TST_TableModelArchive(M: IWAMessage[][], root: IWAMessage, ws: Wo tiles.forEach((tile) => { tile.ref.forEach((row, R) => { row.forEach((buf, C) => { - var dv = u8_to_dataview(buf); - //var version = buf[0]; // numbers 3.x use "3", 6.x - 11.x use "4" - /* TODO: find the correct field position of the data type and value. */ - var ctype = buf[2]; var addr = encode_cell({r:R,c:C}); - switch(ctype) { - case 0: { // TODO: generic ?? - switch(buf[1]) { - case 3: ws[addr] = { t: "s", v: sst[dv.getUint32(buf.length - 4,true)] } as CellObject; break; - case 2: ws[addr] = { t: "n", v: dv.getFloat64(16, true) } as CellObject; break; - case 0: break; // ws[addr] = { t: "z" } as CellObject; // blank? - case 5: break; // date-time - case 7: break; // duration - case 6: ws[addr] = { t: "b", v: dv.getFloat64(buf.length - 8, true) > 0 } as CellObject; break; - default: throw new Error(`Unsupported cell type ${buf.slice(0,4)}`); - } - } break; - case 3: { // string - ws[addr] = { t: "s", v: sst[dv.getUint32(16,true)] } as CellObject; - } break; - case 2: { // number - ws[addr] = { t: "n", v: dv.getFloat64(buf.length - 12, true) } as CellObject; - } break; - case 6: { // boolean - ws[addr] = { t: "b", v: dv.getFloat64(16, true) > 0 } as CellObject; // 1 or 0 - } break; - default: throw new Error(`Unsupported cell type ${ctype}`); + var res = parse_bnc(buf); + if(res) { + ws[addr] = res as CellObject; + if(res.t == "s" && typeof res.v == "number") res.v = sst[res.v]; } }); }); diff --git a/modules/src/prebnccell.ts b/modules/src/prebnccell.ts new file mode 100644 index 0000000..7be2163 --- /dev/null +++ b/modules/src/prebnccell.ts @@ -0,0 +1,41 @@ +/*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */ +import { CellObject } from '../../'; +import { u8_to_dataview, popcnt } from './util'; + +function parseit(buf: Uint8Array, version: number): CellObject { + var dv = u8_to_dataview(buf); + var ctype = buf[version == 4 ? 1 : 2]; + + /* TODO: find the correct field position of number formats, formulae, etc */ + var flags = dv.getUint32(4, true); + var data_offset = 12 + popcnt(flags & 0x3F8E) * 4; + + var sidx = -1, ieee = NaN, dt = NaN; + if(flags & 0x10) { sidx = dv.getUint32(data_offset, true); data_offset += 4; } + if(flags & 0x20) { ieee = dv.getFloat64(data_offset, true); data_offset += 8; } + if(flags & 0x40) { dt = dv.getFloat64(data_offset, true); data_offset += 8; } + + var ret; + switch(ctype) { + case 0: break; // return { t: "z" }; // blank? + case 2: ret = { t: "n", v: ieee }; break; + case 3: ret = { t: "s", v: sidx }; break; + case 5: var dd = new Date(2001, 0, 1); dd.setTime(dd.getTime() + dt * 1000); ret = { t: "d", v: dd }; break; // date-time TODO: relative or absolute? + case 6: ret = { t: "b", v: ieee > 0 }; break; + case 7: ret = { t: "n", v: ieee }; break; // duration in seconds TODO: emit [hh]:[mm] style format with adjusted value + default: throw new Error(`Unsupported cell type ${buf.slice(0,4)}`); + } + /* TODO: Some fields appear after the cell data */ + + return ret; +} + +function parse(buf: Uint8Array): CellObject { + var version = buf[0]; // numbers 3.5 uses "3", 6.x - 11.x use "4" + switch(version) { + case 3: case 4: return parseit(buf, version); + default: throw new Error(`Unsupported pre-BNC version ${version}`); + } +} + +export { parse }; \ No newline at end of file diff --git a/modules/src/proto.ts b/modules/src/proto.ts index 9ddeea0..068cf96 100644 --- a/modules/src/proto.ts +++ b/modules/src/proto.ts @@ -1,4 +1,6 @@ /*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */ +import { u8concat } from "./util"; + type Ptr = [number]; export { Ptr }; @@ -18,6 +20,26 @@ function parse_varint49(buf: Uint8Array, ptr?: Ptr): number { return usz; } export { parse_varint49 }; +function write_varint49(v: number): Uint8Array { + var usz = new Uint8Array(7); + usz[0] = (v & 0x7F); + var L = 1; + sz: if(v > 0x7F) { + usz[L-1] |= 0x80; usz[L] = (v >> 7) & 0x7F; ++L; + if(v <= 0x3FFF) break sz; + usz[L-1] |= 0x80; usz[L] = (v >> 14) & 0x7F; ++L; + if(v <= 0x1FFFFF) break sz; + usz[L-1] |= 0x80; usz[L] = (v >> 21) & 0x7F; ++L; + if(v <= 0xFFFFFFF) break sz; + usz[L-1] |= 0x80; usz[L] = ((v/0x100) >>> 21) & 0x7F; ++L; + if(v <= 0x7FFFFFFFF) break sz; + usz[L-1] |= 0x80; usz[L] = ((v/0x10000) >>> 21) & 0x7F; ++L; + if(v <= 0x3FFFFFFFFFF) break sz; + usz[L-1] |= 0x80; usz[L] = ((v/0x1000000) >>> 21) & 0x7F; ++L; + } + return usz.slice(0, L); +} +export { write_varint49 }; /** Parse a 32-bit signed integer from the raw varint */ function varint_to_i32(buf: Uint8Array): number { @@ -33,12 +55,13 @@ function varint_to_i32(buf: Uint8Array): number { export { varint_to_i32 }; interface ProtoItem { - offset: number; + offset?: number; data: Uint8Array; + type: number; } type ProtoField = Array type ProtoMessage = Array; -export { ProtoItem, ProtoField, ProtoMessage } +export { ProtoItem, ProtoField, ProtoMessage }; /** Shallow parse of a message */ function parse_shallow(buf: Uint8Array): ProtoMessage { var out: ProtoMessage = [], ptr: Ptr = [0]; @@ -55,23 +78,32 @@ function parse_shallow(buf: Uint8Array): ProtoMessage { while(buf[ptr[0]++] >= 0x80); res = buf.slice(l, ptr[0]); } break; - case 5: len = 4; - /* falls through */ - case 1: if(!len) len = 8; - /* falls through */ - case 2: if(!len) len = parse_varint49(buf, ptr); - res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; + case 5: len = 4; res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; + case 1: len = 8; res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; + case 2: len = parse_varint49(buf, ptr); res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; case 3: // Start group case 4: // End group default: throw new Error(`PB Type ${type} for Field ${num} at offset ${off}`); } - var v: ProtoItem = { offset: off, data: res }; + var v: ProtoItem = { offset: off, data: res, type }; if(out[num] == null) out[num] = [v]; else out[num].push(v); } return out; } export { parse_shallow }; +/** Serialize a shallow parse */ +function write_shallow(proto: ProtoMessage): Uint8Array { + var out: Uint8Array[] = []; + proto.forEach((field, idx) => { + field.forEach(item => { + out.push(write_varint49(idx * 8 + item.type)); + out.push(item.data); + }); + }); + return u8concat(out); +} +export { write_shallow }; function mappa(data: ProtoField, cb:(Uint8Array) => U): U[] { if(!data) return []; diff --git a/modules/src/util.ts b/modules/src/util.ts index 6579367..c793e33 100644 --- a/modules/src/util.ts +++ b/modules/src/util.ts @@ -37,3 +37,11 @@ function u8indexOf(u8: Uint8Array, data: string | number | Uint8Array, byteOffse return -1; } export { u8indexOf }; + +/* Hopefully one day this will be added to the language */ +var popcnt = (x: number): number => { + x -= ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + return (((x + (x >> 4)) & 0x0F0F0F0F) * 0x01010101) >>> 24; +}; +export { popcnt }; diff --git a/packages/otorp/index.node.js b/packages/otorp/index.node.js index 0cdff6f..cd2c127 100644 --- a/packages/otorp/index.node.js +++ b/packages/otorp/index.node.js @@ -171,12 +171,16 @@ function parse_shallow(buf) { break; case 5: len = 4; + res = buf.slice(ptr[0], ptr[0] + len); + ptr[0] += len; + break; case 1: - if (!len) - len = 8; + len = 8; + res = buf.slice(ptr[0], ptr[0] + len); + ptr[0] += len; + break; case 2: - if (!len) - len = parse_varint49(buf, ptr); + len = parse_varint49(buf, ptr); res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; @@ -468,6 +472,9 @@ function otorp(buf, builtins = false) { var otorp_default = otorp; var is_referenced = (buf, pos) => { var dv = u8_to_dataview(buf); + for (var leaddr = 0; leaddr > -1 && leaddr < pos; leaddr = u8indexOf(buf, 141, leaddr + 1)) + if (dv.getUint32(leaddr + 2, true) == pos - leaddr - 6) + return true; try { var headers = parse_macho(buf); for (var i = 0; i < headers.length; ++i) { @@ -507,6 +514,7 @@ var proto_offsets = (buf) => { if (buf[--pos] != 10) continue; if (!is_referenced(buf, pos)) { + console.error(`Reference to ${name} not found`); continue; } var bin = meta.find((m) => m.offset <= pos && m.offset + m.size >= pos); diff --git a/packages/otorp/package.json b/packages/otorp/package.json index 6a0edd5..6494235 100644 --- a/packages/otorp/package.json +++ b/packages/otorp/package.json @@ -1,6 +1,6 @@ { "name": "otorp", - "version": "0.0.0", + "version": "0.0.1", "author": "sheetjs", "description": "Recover protobuf definitions from Mach-O binaries", "bin": { diff --git a/packages/otorp/src/otorp.ts b/packages/otorp/src/otorp.ts index 3c773e4..b4917df 100644 --- a/packages/otorp/src/otorp.ts +++ b/packages/otorp/src/otorp.ts @@ -55,6 +55,11 @@ export default otorp; var is_referenced = (buf: Uint8Array, pos: number): boolean => { var dv = u8_to_dataview(buf); + /* Search for LEA reference (x86) */ + for(var leaddr = 0; leaddr > -1 && leaddr < pos; leaddr = u8indexOf(buf, 0x8D, leaddr + 1)) + if(dv.getUint32(leaddr + 2, true) == pos - leaddr - 6) return true; + + /* Search for absolute reference to address */ try { var headers = parse_macho(buf); for(var i = 0; i < headers.length; ++i) { @@ -69,7 +74,6 @@ var is_referenced = (buf: Uint8Array, pos: number): boolean => { if(u8indexOf(b, ref, 0) > 0) return true; } } catch(e) {} - return false; }; @@ -90,7 +94,7 @@ var proto_offsets = (buf: Uint8Array): OffsetList => { if(off - pos > 250) continue; var name = u8str(buf.slice(pos + 1, off)); if(buf[--pos] != 0x0A) continue; - if(!is_referenced(buf, pos)) { /* console.error(`Reference to ${name} not found`); */ continue; } + if(!is_referenced(buf, pos)) { console.error(`Reference to ${name} not found`); continue; } var bin = meta.find(m => m.offset <= pos && m.offset + m.size >= pos); out.push([pos, name, bin?.type || -1, bin?.subtype || -1]); }