forked from LeenkxTeam/LNXSDK
Update Files
This commit is contained in:
42
Kha/Tools/linux_arm64/std/haxe/zip/Compress.hx
Normal file
42
Kha/Tools/linux_arm64/std/haxe/zip/Compress.hx
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package haxe.zip;
|
||||
|
||||
class Compress {
|
||||
public function new(level:Int) {
|
||||
throw new haxe.exceptions.NotImplementedException("Not implemented for this platform");
|
||||
}
|
||||
|
||||
public function execute(src:haxe.io.Bytes, srcPos:Int, dst:haxe.io.Bytes, dstPos:Int):{done:Bool, read:Int, write:Int} {
|
||||
return null;
|
||||
}
|
||||
|
||||
public function setFlushMode(f:FlushMode) {}
|
||||
|
||||
public function close() {}
|
||||
|
||||
public static function run(s:haxe.io.Bytes, level:Int):haxe.io.Bytes {
|
||||
throw new haxe.exceptions.NotImplementedException("Not implemented for this platform");
|
||||
return null;
|
||||
}
|
||||
}
|
42
Kha/Tools/linux_arm64/std/haxe/zip/Entry.hx
Normal file
42
Kha/Tools/linux_arm64/std/haxe/zip/Entry.hx
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package haxe.zip;
|
||||
|
||||
import haxe.ds.List;
|
||||
|
||||
enum ExtraField {
|
||||
FUnknown(tag:Int, bytes:haxe.io.Bytes);
|
||||
FInfoZipUnicodePath(name:String, crc:Int);
|
||||
FUtf8;
|
||||
}
|
||||
|
||||
typedef Entry = {
|
||||
var fileName:String;
|
||||
var fileSize:Int;
|
||||
var fileTime:Date;
|
||||
var compressed:Bool;
|
||||
var dataSize:Int;
|
||||
var data:Null<haxe.io.Bytes>;
|
||||
var crc32:Null<Int>;
|
||||
var ?extraFields:List<ExtraField>;
|
||||
}
|
31
Kha/Tools/linux_arm64/std/haxe/zip/FlushMode.hx
Normal file
31
Kha/Tools/linux_arm64/std/haxe/zip/FlushMode.hx
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package haxe.zip;
|
||||
|
||||
enum FlushMode {
|
||||
NO;
|
||||
SYNC;
|
||||
FULL;
|
||||
FINISH;
|
||||
BLOCK;
|
||||
}
|
120
Kha/Tools/linux_arm64/std/haxe/zip/Huffman.hx
Normal file
120
Kha/Tools/linux_arm64/std/haxe/zip/Huffman.hx
Normal file
@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package haxe.zip;
|
||||
|
||||
enum Huffman {
|
||||
Found(i:Int);
|
||||
NeedBit(left:Huffman, right:Huffman);
|
||||
NeedBits(n:Int, table:Array<Huffman>);
|
||||
}
|
||||
|
||||
class HuffTools {
|
||||
public function new() {}
|
||||
|
||||
function treeDepth(t) {
|
||||
return switch (t) {
|
||||
case Found(_): 0;
|
||||
case NeedBits(_, _): throw "assert";
|
||||
case NeedBit(a, b):
|
||||
var da = treeDepth(a);
|
||||
var db = treeDepth(b);
|
||||
1 + ((da < db) ? da : db);
|
||||
}
|
||||
}
|
||||
|
||||
function treeCompress(t) {
|
||||
var d = treeDepth(t);
|
||||
if (d == 0)
|
||||
return t;
|
||||
if (d == 1)
|
||||
return switch (t) {
|
||||
case NeedBit(a, b): NeedBit(treeCompress(a), treeCompress(b));
|
||||
default: throw "assert";
|
||||
}
|
||||
var size = 1 << d;
|
||||
var table = new Array();
|
||||
for (i in 0...size)
|
||||
table.push(Found(-1));
|
||||
treeWalk(table, 0, 0, d, t);
|
||||
return NeedBits(d, table);
|
||||
}
|
||||
|
||||
function treeWalk(table, p, cd, d, t) {
|
||||
switch (t) {
|
||||
case NeedBit(a, b):
|
||||
if (d > 0) {
|
||||
treeWalk(table, p, cd + 1, d - 1, a);
|
||||
treeWalk(table, p | (1 << cd), cd + 1, d - 1, b);
|
||||
} else
|
||||
table[p] = treeCompress(t);
|
||||
default:
|
||||
table[p] = treeCompress(t);
|
||||
}
|
||||
}
|
||||
|
||||
function treeMake(bits:haxe.ds.IntMap<Int>, maxbits:Int, v:Int, len:Int) {
|
||||
if (len > maxbits)
|
||||
throw "Invalid huffman";
|
||||
var idx = (v << 5) | len;
|
||||
if (bits.exists(idx))
|
||||
return Found(bits.get(idx));
|
||||
v <<= 1;
|
||||
len += 1;
|
||||
return NeedBit(treeMake(bits, maxbits, v, len), treeMake(bits, maxbits, v | 1, len));
|
||||
}
|
||||
|
||||
public function make(lengths, pos, nlengths, maxbits) {
|
||||
if (nlengths == 1) {
|
||||
return NeedBit(Found(0), Found(0));
|
||||
}
|
||||
var counts = new Array();
|
||||
var tmp = new Array();
|
||||
if (maxbits > 32)
|
||||
throw "Invalid huffman";
|
||||
for (i in 0...maxbits) {
|
||||
counts.push(0);
|
||||
tmp.push(0);
|
||||
}
|
||||
for (i in 0...nlengths) {
|
||||
var p = lengths[i + pos];
|
||||
if (p >= maxbits)
|
||||
throw "Invalid huffman";
|
||||
counts[p]++;
|
||||
}
|
||||
var code = 0;
|
||||
for (i in 1...maxbits - 1) {
|
||||
code = (code + counts[i]) << 1;
|
||||
tmp[i] = code;
|
||||
}
|
||||
var bits = new haxe.ds.IntMap();
|
||||
for (i in 0...nlengths) {
|
||||
var l = lengths[i + pos];
|
||||
if (l != 0) {
|
||||
var n = tmp[l - 1];
|
||||
tmp[l - 1] = n + 1;
|
||||
bits.set((n << 5) | l, i);
|
||||
}
|
||||
}
|
||||
return treeCompress(NeedBit(treeMake(bits, maxbits, 0, 1), treeMake(bits, maxbits, 1, 1)));
|
||||
}
|
||||
}
|
400
Kha/Tools/linux_arm64/std/haxe/zip/InflateImpl.hx
Normal file
400
Kha/Tools/linux_arm64/std/haxe/zip/InflateImpl.hx
Normal file
@ -0,0 +1,400 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package haxe.zip;
|
||||
|
||||
import haxe.zip.Huffman;
|
||||
import haxe.crypto.Adler32;
|
||||
|
||||
private class Window {
|
||||
public static inline var SIZE = 1 << 15;
|
||||
public static inline var BUFSIZE = 1 << 16;
|
||||
|
||||
public var buffer:haxe.io.Bytes;
|
||||
public var pos:Int;
|
||||
|
||||
var crc:Adler32;
|
||||
|
||||
public function new(hasCrc) {
|
||||
buffer = haxe.io.Bytes.alloc(BUFSIZE);
|
||||
pos = 0;
|
||||
if (hasCrc)
|
||||
crc = new Adler32();
|
||||
}
|
||||
|
||||
public function slide() {
|
||||
if (crc != null)
|
||||
crc.update(buffer, 0, SIZE);
|
||||
var b = haxe.io.Bytes.alloc(BUFSIZE);
|
||||
pos -= SIZE;
|
||||
b.blit(0, buffer, SIZE, pos);
|
||||
buffer = b;
|
||||
}
|
||||
|
||||
public function addBytes(b, p, len) {
|
||||
if (pos + len > BUFSIZE)
|
||||
slide();
|
||||
buffer.blit(pos, b, p, len);
|
||||
pos += len;
|
||||
}
|
||||
|
||||
public function addByte(c) {
|
||||
if (pos == BUFSIZE)
|
||||
slide();
|
||||
buffer.set(pos, c);
|
||||
pos++;
|
||||
}
|
||||
|
||||
public function getLastChar() {
|
||||
return buffer.get(pos - 1);
|
||||
}
|
||||
|
||||
public function available() {
|
||||
return pos;
|
||||
}
|
||||
|
||||
public function checksum() {
|
||||
if (crc != null)
|
||||
crc.update(buffer, 0, pos);
|
||||
return crc;
|
||||
}
|
||||
}
|
||||
|
||||
private enum State {
|
||||
Head;
|
||||
Block;
|
||||
CData;
|
||||
Flat;
|
||||
Crc;
|
||||
Dist;
|
||||
DistOne;
|
||||
Done;
|
||||
}
|
||||
|
||||
/**
|
||||
A pure Haxe implementation of the ZLIB Inflate algorithm which allows reading compressed data without any platform-specific support.
|
||||
**/
|
||||
class InflateImpl {
|
||||
static var LEN_EXTRA_BITS_TBL = [
|
||||
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, -1, -1
|
||||
];
|
||||
static var LEN_BASE_VAL_TBL = [
|
||||
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
|
||||
];
|
||||
static var DIST_EXTRA_BITS_TBL = [
|
||||
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, -1, -1
|
||||
];
|
||||
static var DIST_BASE_VAL_TBL = [
|
||||
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
|
||||
];
|
||||
static var CODE_LENGTHS_POS = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
|
||||
|
||||
var nbits:Int;
|
||||
var bits:Int;
|
||||
var state:State;
|
||||
var isFinal:Bool;
|
||||
var huffman:Huffman;
|
||||
var huffdist:Null<Huffman>;
|
||||
var htools:HuffTools;
|
||||
var len:Int;
|
||||
var dist:Int;
|
||||
var needed:Int;
|
||||
var output:haxe.io.Bytes;
|
||||
var outpos:Int;
|
||||
var input:haxe.io.Input;
|
||||
var lengths:Array<Int>;
|
||||
var window:Window;
|
||||
|
||||
static var FIXED_HUFFMAN = null;
|
||||
|
||||
public function new(i, ?header = true, ?crc = true) {
|
||||
isFinal = false;
|
||||
htools = new HuffTools();
|
||||
huffman = buildFixedHuffman();
|
||||
huffdist = null;
|
||||
len = 0;
|
||||
dist = 0;
|
||||
state = header ? Head : Block;
|
||||
input = i;
|
||||
bits = 0;
|
||||
nbits = 0;
|
||||
needed = 0;
|
||||
output = null;
|
||||
outpos = 0;
|
||||
lengths = new Array();
|
||||
for (i in 0...19)
|
||||
lengths.push(-1);
|
||||
window = new Window(crc);
|
||||
}
|
||||
|
||||
function buildFixedHuffman() {
|
||||
if (FIXED_HUFFMAN != null)
|
||||
return FIXED_HUFFMAN;
|
||||
var a = new Array();
|
||||
for (n in 0...288)
|
||||
a.push(if (n <= 143) 8 else if (n <= 255) 9 else if (n <= 279) 7 else 8);
|
||||
FIXED_HUFFMAN = htools.make(a, 0, 288, 10);
|
||||
return FIXED_HUFFMAN;
|
||||
}
|
||||
|
||||
public function readBytes(b, pos, len) {
|
||||
needed = len;
|
||||
outpos = pos;
|
||||
output = b;
|
||||
if (len > 0)
|
||||
while (inflateLoop()) {}
|
||||
return len - needed;
|
||||
}
|
||||
|
||||
function getBits(n) {
|
||||
while (nbits < n) {
|
||||
bits |= input.readByte() << nbits;
|
||||
nbits += 8;
|
||||
}
|
||||
var b = bits & ((1 << n) - 1);
|
||||
nbits -= n;
|
||||
bits >>= n;
|
||||
return b;
|
||||
}
|
||||
|
||||
function getBit() {
|
||||
if (nbits == 0) {
|
||||
nbits = 8;
|
||||
bits = input.readByte();
|
||||
}
|
||||
var b = bits & 1 == 1;
|
||||
nbits--;
|
||||
bits >>= 1;
|
||||
return b;
|
||||
}
|
||||
|
||||
function getRevBits(n) {
|
||||
return if (n == 0)
|
||||
0
|
||||
else if (getBit())
|
||||
(1 << (n - 1)) | getRevBits(n - 1)
|
||||
else
|
||||
getRevBits(n - 1);
|
||||
}
|
||||
|
||||
function resetBits() {
|
||||
bits = 0;
|
||||
nbits = 0;
|
||||
}
|
||||
|
||||
function addBytes(b, p, len) {
|
||||
window.addBytes(b, p, len);
|
||||
output.blit(outpos, b, p, len);
|
||||
needed -= len;
|
||||
outpos += len;
|
||||
}
|
||||
|
||||
function addByte(b) {
|
||||
window.addByte(b);
|
||||
output.set(outpos, b);
|
||||
needed--;
|
||||
outpos++;
|
||||
}
|
||||
|
||||
function addDistOne(n) {
|
||||
var c = window.getLastChar();
|
||||
for (i in 0...n)
|
||||
addByte(c);
|
||||
}
|
||||
|
||||
function addDist(d, len) {
|
||||
addBytes(window.buffer, window.pos - d, len);
|
||||
}
|
||||
|
||||
function applyHuffman(h) {
|
||||
return switch (h) {
|
||||
case Found(n): n;
|
||||
case NeedBit(a, b): applyHuffman(getBit() ? b : a);
|
||||
case NeedBits(n, tbl): applyHuffman(tbl[getBits(n)]);
|
||||
}
|
||||
}
|
||||
|
||||
function inflateLengths(a, max) {
|
||||
var i = 0;
|
||||
var prev = 0;
|
||||
while (i < max) {
|
||||
var n = applyHuffman(huffman);
|
||||
switch (n) {
|
||||
case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15:
|
||||
prev = n;
|
||||
a[i] = n;
|
||||
i++;
|
||||
case 16:
|
||||
var end = i + 3 + getBits(2);
|
||||
if (end > max)
|
||||
throw "Invalid data";
|
||||
while (i < end) {
|
||||
a[i] = prev;
|
||||
i++;
|
||||
}
|
||||
case 17:
|
||||
i += 3 + getBits(3);
|
||||
if (i > max)
|
||||
throw "Invalid data";
|
||||
case 18:
|
||||
i += 11 + getBits(7);
|
||||
if (i > max)
|
||||
throw "Invalid data";
|
||||
default:
|
||||
throw "Invalid data";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function inflateLoop() {
|
||||
switch (state) {
|
||||
case Head:
|
||||
var cmf = input.readByte();
|
||||
var cm = cmf & 15;
|
||||
var cinfo = cmf >> 4;
|
||||
if (cm != 8)
|
||||
throw "Invalid data";
|
||||
var flg = input.readByte();
|
||||
// var fcheck = flg & 31;
|
||||
var fdict = flg & 32 != 0;
|
||||
// var flevel = flg >> 6;
|
||||
if (((cmf << 8) + flg) % 31 != 0)
|
||||
throw "Invalid data";
|
||||
if (fdict)
|
||||
throw "Unsupported dictionary";
|
||||
state = Block;
|
||||
return true;
|
||||
case Crc:
|
||||
var calc = window.checksum();
|
||||
if (calc == null) {
|
||||
state = Done;
|
||||
return true;
|
||||
}
|
||||
var crc = Adler32.read(input);
|
||||
if (!calc.equals(crc))
|
||||
throw "Invalid CRC";
|
||||
state = Done;
|
||||
return true;
|
||||
case Done:
|
||||
// nothing
|
||||
return false;
|
||||
case Block:
|
||||
isFinal = getBit();
|
||||
switch (getBits(2)) {
|
||||
case 0: // no compression
|
||||
len = input.readUInt16();
|
||||
var nlen = input.readUInt16();
|
||||
if (nlen != 0xFFFF - len) throw "Invalid data";
|
||||
state = Flat;
|
||||
var r = inflateLoop();
|
||||
resetBits();
|
||||
return r;
|
||||
case 1: // fixed Huffman
|
||||
huffman = buildFixedHuffman();
|
||||
huffdist = null;
|
||||
state = CData;
|
||||
return true;
|
||||
case 2: // dynamic Huffman
|
||||
var hlit = getBits(5) + 257;
|
||||
var hdist = getBits(5) + 1;
|
||||
var hclen = getBits(4) + 4;
|
||||
for (i in 0...hclen)
|
||||
lengths[CODE_LENGTHS_POS[i]] = getBits(3);
|
||||
for (i in hclen...19)
|
||||
lengths[CODE_LENGTHS_POS[i]] = 0;
|
||||
huffman = htools.make(lengths, 0, 19, 8);
|
||||
var lengths = new Array();
|
||||
for (i in 0...hlit + hdist)
|
||||
lengths.push(0);
|
||||
inflateLengths(lengths, hlit + hdist);
|
||||
huffdist = htools.make(lengths, hlit, hdist, 16);
|
||||
huffman = htools.make(lengths, 0, hlit, 16);
|
||||
state = CData;
|
||||
return true;
|
||||
default:
|
||||
throw "Invalid data";
|
||||
}
|
||||
case Flat:
|
||||
var rlen = (len < needed) ? len : needed;
|
||||
var bytes = input.read(rlen);
|
||||
len -= rlen;
|
||||
addBytes(bytes, 0, rlen);
|
||||
if (len == 0)
|
||||
state = isFinal ? Crc : Block;
|
||||
return needed > 0;
|
||||
case DistOne:
|
||||
var rlen = (len < needed) ? len : needed;
|
||||
addDistOne(rlen);
|
||||
len -= rlen;
|
||||
if (len == 0)
|
||||
state = CData;
|
||||
return needed > 0;
|
||||
case Dist:
|
||||
while (len > 0 && needed > 0) {
|
||||
var rdist = (len < dist) ? len : dist;
|
||||
var rlen = (needed < rdist) ? needed : rdist;
|
||||
addDist(dist, rlen);
|
||||
len -= rlen;
|
||||
}
|
||||
if (len == 0)
|
||||
state = CData;
|
||||
return needed > 0;
|
||||
case CData:
|
||||
var n = applyHuffman(huffman);
|
||||
if (n < 256) {
|
||||
addByte(n);
|
||||
return needed > 0;
|
||||
} else if (n == 256) {
|
||||
state = isFinal ? Crc : Block;
|
||||
return true;
|
||||
} else {
|
||||
n -= 257;
|
||||
var extra_bits = LEN_EXTRA_BITS_TBL[n];
|
||||
if (extra_bits == -1)
|
||||
throw "Invalid data";
|
||||
len = LEN_BASE_VAL_TBL[n] + getBits(extra_bits);
|
||||
var dist_code = if (huffdist == null) getRevBits(5) else applyHuffman(huffdist);
|
||||
extra_bits = DIST_EXTRA_BITS_TBL[dist_code];
|
||||
if (extra_bits == -1)
|
||||
throw "Invalid data";
|
||||
dist = DIST_BASE_VAL_TBL[dist_code] + getBits(extra_bits);
|
||||
if (dist > window.available())
|
||||
throw "Invalid data";
|
||||
state = (dist == 1) ? DistOne : Dist;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function run(i:haxe.io.Input, ?bufsize = 65536) {
|
||||
var buf = haxe.io.Bytes.alloc(bufsize);
|
||||
var output = new haxe.io.BytesBuffer();
|
||||
var inflate = new InflateImpl(i);
|
||||
while (true) {
|
||||
var len = inflate.readBytes(buf, 0, bufsize);
|
||||
output.addBytes(buf, 0, len);
|
||||
if (len < bufsize)
|
||||
break;
|
||||
}
|
||||
return output.getBytes();
|
||||
}
|
||||
}
|
213
Kha/Tools/linux_arm64/std/haxe/zip/Reader.hx
Normal file
213
Kha/Tools/linux_arm64/std/haxe/zip/Reader.hx
Normal file
@ -0,0 +1,213 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package haxe.zip;
|
||||
|
||||
import haxe.zip.Entry;
|
||||
import haxe.ds.List;
|
||||
|
||||
// see http://www.pkware.com/documents/casestudies/APPNOTE.TXT
|
||||
class Reader {
|
||||
var i:haxe.io.Input;
|
||||
|
||||
public function new(i) {
|
||||
this.i = i;
|
||||
}
|
||||
|
||||
function readZipDate() {
|
||||
var t = i.readUInt16();
|
||||
var hour = (t >> 11) & 31;
|
||||
var min = (t >> 5) & 63;
|
||||
var sec = t & 31;
|
||||
var d = i.readUInt16();
|
||||
var year = d >> 9;
|
||||
var month = (d >> 5) & 15;
|
||||
var day = d & 31;
|
||||
return new Date(year + 1980, month - 1, day, hour, min, sec << 1);
|
||||
}
|
||||
|
||||
function readExtraFields(length) {
|
||||
var fields = new List();
|
||||
while (length > 0) {
|
||||
if (length < 4)
|
||||
throw "Invalid extra fields data";
|
||||
var tag = i.readUInt16();
|
||||
var len = i.readUInt16();
|
||||
if (length < len)
|
||||
throw "Invalid extra fields data";
|
||||
switch (tag) {
|
||||
case 0x7075:
|
||||
var version = i.readByte();
|
||||
if (version != 1) {
|
||||
var data = new haxe.io.BytesBuffer();
|
||||
data.addByte(version);
|
||||
data.add(i.read(len - 1));
|
||||
fields.add(FUnknown(tag, data.getBytes()));
|
||||
} else {
|
||||
var crc = i.readInt32();
|
||||
var name = i.read(len - 5).toString();
|
||||
fields.add(FInfoZipUnicodePath(name, crc));
|
||||
}
|
||||
default:
|
||||
fields.add(FUnknown(tag, i.read(len)));
|
||||
}
|
||||
length -= 4 + len;
|
||||
}
|
||||
return fields;
|
||||
}
|
||||
|
||||
public function readEntryHeader():Entry {
|
||||
var i = this.i;
|
||||
var h = i.readInt32();
|
||||
if (h == 0x02014B50 || h == 0x06054B50)
|
||||
return null;
|
||||
if (h != 0x04034B50)
|
||||
throw "Invalid Zip Data";
|
||||
var version = i.readUInt16();
|
||||
var flags = i.readUInt16();
|
||||
var utf8 = flags & 0x800 != 0;
|
||||
if ((flags & 0xF7F1) != 0)
|
||||
throw "Unsupported flags " + flags;
|
||||
var compression = i.readUInt16();
|
||||
var compressed = (compression != 0);
|
||||
if (compressed && compression != 8)
|
||||
throw "Unsupported compression " + compression;
|
||||
var mtime = readZipDate();
|
||||
var crc32:Null<Int> = i.readInt32();
|
||||
var csize = i.readInt32();
|
||||
var usize = i.readInt32();
|
||||
var fnamelen = i.readInt16();
|
||||
var elen = i.readInt16();
|
||||
var fname = i.readString(fnamelen);
|
||||
var fields = readExtraFields(elen);
|
||||
if (utf8)
|
||||
fields.push(FUtf8);
|
||||
var data = null;
|
||||
// we have a data descriptor that store the real crc/sizes
|
||||
// after the compressed data, let's wait for it
|
||||
if ((flags & 8) != 0)
|
||||
crc32 = null;
|
||||
return {
|
||||
fileName: fname,
|
||||
fileSize: usize,
|
||||
fileTime: mtime,
|
||||
compressed: compressed,
|
||||
dataSize: csize,
|
||||
data: data,
|
||||
crc32: crc32,
|
||||
extraFields: fields,
|
||||
};
|
||||
}
|
||||
|
||||
public function read():List<Entry> {
|
||||
var l = new List();
|
||||
var buf = null;
|
||||
var tmp = null;
|
||||
while (true) {
|
||||
var e = readEntryHeader();
|
||||
if (e == null)
|
||||
break;
|
||||
// do we have a data descriptor? (see readEntryHeader)
|
||||
if (e.crc32 == null) {
|
||||
if (e.compressed) {
|
||||
#if neko
|
||||
// enter progressive mode : we use a different input which has
|
||||
// a temporary buffer, this is necessary since we have to uncompress
|
||||
// progressively, and after that we might have pending read data
|
||||
// that needs to be processed
|
||||
var bufSize = 65536;
|
||||
if (buf == null) {
|
||||
buf = new haxe.io.BufferInput(i, haxe.io.Bytes.alloc(bufSize));
|
||||
tmp = haxe.io.Bytes.alloc(bufSize);
|
||||
i = buf;
|
||||
}
|
||||
var out = new haxe.io.BytesBuffer();
|
||||
var z = new neko.zip.Uncompress(-15);
|
||||
z.setFlushMode(neko.zip.Flush.SYNC);
|
||||
while (true) {
|
||||
if (buf.available == 0)
|
||||
buf.refill();
|
||||
var p = bufSize - buf.available;
|
||||
if (p != buf.pos) {
|
||||
// because of lack of "srcLen" in zip api, we need to always be stuck to the buffer end
|
||||
buf.buf.blit(p, buf.buf, buf.pos, buf.available);
|
||||
buf.pos = p;
|
||||
}
|
||||
var r = z.execute(buf.buf, buf.pos, tmp, 0);
|
||||
out.addBytes(tmp, 0, r.write);
|
||||
buf.pos += r.read;
|
||||
buf.available -= r.read;
|
||||
if (r.done)
|
||||
break;
|
||||
}
|
||||
e.data = out.getBytes();
|
||||
#else
|
||||
var bufSize = 65536;
|
||||
if (tmp == null)
|
||||
tmp = haxe.io.Bytes.alloc(bufSize);
|
||||
var out = new haxe.io.BytesBuffer();
|
||||
var z = new InflateImpl(i, false, false);
|
||||
while (true) {
|
||||
var n = z.readBytes(tmp, 0, bufSize);
|
||||
out.addBytes(tmp, 0, n);
|
||||
if (n < bufSize)
|
||||
break;
|
||||
}
|
||||
e.data = out.getBytes();
|
||||
#end
|
||||
} else
|
||||
e.data = i.read(e.dataSize);
|
||||
e.crc32 = i.readInt32();
|
||||
if (e.crc32 == 0x08074b50)
|
||||
e.crc32 = i.readInt32();
|
||||
e.dataSize = i.readInt32();
|
||||
e.fileSize = i.readInt32();
|
||||
// set data to uncompressed
|
||||
e.dataSize = e.fileSize;
|
||||
e.compressed = false;
|
||||
} else
|
||||
e.data = i.read(e.dataSize);
|
||||
l.add(e);
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
public static function readZip(i:haxe.io.Input) {
|
||||
var r = new Reader(i);
|
||||
return r.read();
|
||||
}
|
||||
|
||||
public static function unzip(f:Entry) {
|
||||
if (!f.compressed)
|
||||
return f.data;
|
||||
var c = new haxe.zip.Uncompress(-15);
|
||||
var s = haxe.io.Bytes.alloc(f.fileSize);
|
||||
var r = c.execute(f.data, 0, s, 0);
|
||||
c.close();
|
||||
if (!r.done || r.read != f.data.length || r.write != f.fileSize)
|
||||
throw "Invalid compressed data for " + f.fileName;
|
||||
f.compressed = false;
|
||||
f.dataSize = f.fileSize;
|
||||
f.data = s;
|
||||
return f.data;
|
||||
}
|
||||
}
|
52
Kha/Tools/linux_arm64/std/haxe/zip/Tools.hx
Normal file
52
Kha/Tools/linux_arm64/std/haxe/zip/Tools.hx
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package haxe.zip;
|
||||
|
||||
class Tools {
|
||||
public static function compress(f:Entry, level:Int) {
|
||||
if (f.compressed)
|
||||
return;
|
||||
// this should be optimized with a temp buffer
|
||||
// that would discard the first two bytes
|
||||
// (in order to prevent 2x mem usage for large files)
|
||||
var data = haxe.zip.Compress.run(f.data, level);
|
||||
f.compressed = true;
|
||||
f.data = data.sub(2, data.length - 6);
|
||||
f.dataSize = f.data.length;
|
||||
}
|
||||
|
||||
public static function uncompress(f:Entry) {
|
||||
if( !f.compressed )
|
||||
return;
|
||||
|
||||
var c = new Uncompress(-15);
|
||||
var s = haxe.io.Bytes.alloc(f.fileSize);
|
||||
var r = c.execute(f.data,0,s,0);
|
||||
c.close();
|
||||
if( !r.done || r.read != f.data.length || r.write != f.fileSize )
|
||||
throw "Invalid compressed data for "+f.fileName;
|
||||
f.compressed = false;
|
||||
f.dataSize = f.fileSize;
|
||||
f.data = s;
|
||||
}
|
||||
}
|
41
Kha/Tools/linux_arm64/std/haxe/zip/Uncompress.hx
Normal file
41
Kha/Tools/linux_arm64/std/haxe/zip/Uncompress.hx
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package haxe.zip;
|
||||
|
||||
class Uncompress {
|
||||
public function new(?windowBits:Int) {
|
||||
throw new haxe.exceptions.NotImplementedException("Not implemented for this platform");
|
||||
}
|
||||
|
||||
public function execute(src:haxe.io.Bytes, srcPos:Int, dst:haxe.io.Bytes, dstPos:Int):{done:Bool, read:Int, write:Int} {
|
||||
return null;
|
||||
}
|
||||
|
||||
public function setFlushMode(f:FlushMode) {}
|
||||
|
||||
public function close() {}
|
||||
|
||||
public static function run(src:haxe.io.Bytes, ?bufsize:Int):haxe.io.Bytes {
|
||||
return InflateImpl.run(new haxe.io.BytesInput(src), bufsize);
|
||||
}
|
||||
}
|
193
Kha/Tools/linux_arm64/std/haxe/zip/Writer.hx
Normal file
193
Kha/Tools/linux_arm64/std/haxe/zip/Writer.hx
Normal file
@ -0,0 +1,193 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package haxe.zip;
|
||||
|
||||
import haxe.ds.List;
|
||||
|
||||
class Writer {
|
||||
/**
|
||||
The next constant is required for computing the Central
|
||||
Directory Record(CDR) size. CDR consists of some fields
|
||||
of constant size and a filename. Constant represents
|
||||
total length of all fields with constant size for each
|
||||
file in archive
|
||||
**/
|
||||
inline static var CENTRAL_DIRECTORY_RECORD_FIELDS_SIZE = 46;
|
||||
|
||||
/**
|
||||
The following constant is the total size of all fields
|
||||
of Local File Header. It's required for calculating
|
||||
offset of start of central directory record
|
||||
**/
|
||||
inline static var LOCAL_FILE_HEADER_FIELDS_SIZE = 30;
|
||||
|
||||
var o:haxe.io.Output;
|
||||
var files:List<{
|
||||
name:String,
|
||||
compressed:Bool,
|
||||
clen:Int,
|
||||
size:Int,
|
||||
crc:Int,
|
||||
date:Date,
|
||||
fields:haxe.io.Bytes
|
||||
}>;
|
||||
|
||||
public function new(o:haxe.io.Output) {
|
||||
this.o = o;
|
||||
files = new List();
|
||||
}
|
||||
|
||||
function writeZipDate(date:Date) {
|
||||
var hour = date.getHours();
|
||||
var min = date.getMinutes();
|
||||
var sec = date.getSeconds() >> 1;
|
||||
o.writeUInt16((hour << 11) | (min << 5) | sec);
|
||||
var year = date.getFullYear() - 1980;
|
||||
var month = date.getMonth() + 1;
|
||||
var day = date.getDate();
|
||||
o.writeUInt16((year << 9) | (month << 5) | day);
|
||||
}
|
||||
|
||||
public function writeEntryHeader(f:Entry) {
|
||||
var o = this.o;
|
||||
var flags = 0;
|
||||
if (f.extraFields != null) {
|
||||
for (e in f.extraFields)
|
||||
switch (e) {
|
||||
case FUtf8:
|
||||
flags |= 0x800;
|
||||
default:
|
||||
}
|
||||
}
|
||||
o.writeInt32(0x04034B50);
|
||||
o.writeUInt16(0x0014); // version
|
||||
o.writeUInt16(flags); // flags
|
||||
if (f.data == null) {
|
||||
f.fileSize = 0;
|
||||
f.dataSize = 0;
|
||||
f.crc32 = 0;
|
||||
f.compressed = false;
|
||||
f.data = haxe.io.Bytes.alloc(0);
|
||||
} else {
|
||||
if (f.crc32 == null) {
|
||||
if (f.compressed)
|
||||
throw "CRC32 must be processed before compression";
|
||||
f.crc32 = haxe.crypto.Crc32.make(f.data);
|
||||
}
|
||||
if (!f.compressed)
|
||||
f.fileSize = f.data.length;
|
||||
f.dataSize = f.data.length;
|
||||
}
|
||||
o.writeUInt16(f.compressed ? 8 : 0);
|
||||
writeZipDate(f.fileTime);
|
||||
o.writeInt32(f.crc32);
|
||||
o.writeInt32(f.dataSize);
|
||||
o.writeInt32(f.fileSize);
|
||||
o.writeUInt16(f.fileName.length);
|
||||
var e = new haxe.io.BytesOutput();
|
||||
if (f.extraFields != null) {
|
||||
for (f in f.extraFields)
|
||||
switch (f) {
|
||||
case FInfoZipUnicodePath(name, crc):
|
||||
var namebytes = haxe.io.Bytes.ofString(name);
|
||||
e.writeUInt16(0x7075);
|
||||
e.writeUInt16(namebytes.length + 5);
|
||||
e.writeByte(1); // version
|
||||
e.writeInt32(crc);
|
||||
e.write(namebytes);
|
||||
case FUnknown(tag, bytes):
|
||||
e.writeUInt16(tag);
|
||||
e.writeUInt16(bytes.length);
|
||||
e.write(bytes);
|
||||
case FUtf8:
|
||||
// nothing
|
||||
}
|
||||
}
|
||||
var ebytes = e.getBytes();
|
||||
o.writeUInt16(ebytes.length);
|
||||
o.writeString(f.fileName);
|
||||
o.write(ebytes);
|
||||
files.add({
|
||||
name: f.fileName,
|
||||
compressed: f.compressed,
|
||||
clen: f.data.length,
|
||||
size: f.fileSize,
|
||||
crc: f.crc32,
|
||||
date: f.fileTime,
|
||||
fields: ebytes
|
||||
});
|
||||
}
|
||||
|
||||
public function write(files:List<Entry>) {
|
||||
for (f in files) {
|
||||
writeEntryHeader(f);
|
||||
o.writeFullBytes(f.data, 0, f.data.length);
|
||||
}
|
||||
writeCDR();
|
||||
}
|
||||
|
||||
public function writeCDR() {
|
||||
var cdr_size = 0;
|
||||
var cdr_offset = 0;
|
||||
for (f in files) {
|
||||
var namelen = f.name.length;
|
||||
var extraFieldsLength = f.fields.length;
|
||||
o.writeInt32(0x02014B50); // header
|
||||
o.writeUInt16(0x0014); // version made-by
|
||||
o.writeUInt16(0x0014); // version
|
||||
o.writeUInt16(0); // flags
|
||||
o.writeUInt16(f.compressed ? 8 : 0);
|
||||
writeZipDate(f.date);
|
||||
o.writeInt32(f.crc);
|
||||
o.writeInt32(f.clen);
|
||||
o.writeInt32(f.size);
|
||||
o.writeUInt16(namelen);
|
||||
o.writeUInt16(extraFieldsLength);
|
||||
o.writeUInt16(0); // comment length always 0
|
||||
o.writeUInt16(0); // disk number start
|
||||
o.writeUInt16(0); // internal file attributes
|
||||
o.writeInt32(0); // external file attributes
|
||||
o.writeInt32(cdr_offset); // relative offset of local header
|
||||
o.writeString(f.name);
|
||||
o.write(f.fields);
|
||||
cdr_size += CENTRAL_DIRECTORY_RECORD_FIELDS_SIZE + namelen + extraFieldsLength;
|
||||
cdr_offset += LOCAL_FILE_HEADER_FIELDS_SIZE + namelen + extraFieldsLength + f.clen;
|
||||
}
|
||||
// end of central dir signature
|
||||
o.writeInt32(0x06054B50);
|
||||
// number of this disk
|
||||
o.writeUInt16(0);
|
||||
// number of the disk with the start of the central directory
|
||||
o.writeUInt16(0);
|
||||
// total number of entries in the central directory on this disk
|
||||
o.writeUInt16(files.length);
|
||||
// total number of entries in the central directory
|
||||
o.writeUInt16(files.length);
|
||||
// size of the central directory record
|
||||
o.writeInt32(cdr_size);
|
||||
// offset of start of central directory with respect to the starting disk number
|
||||
o.writeInt32(cdr_offset);
|
||||
// .ZIP file comment length
|
||||
o.writeUInt16(0);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user