Nicolas Cannasse 19 лет назад
Родитель
Сommit
3ab47023e1
4 измененных файлов с 257 добавлено и 0 удалено
  1. 63 0
      std/neko/zip/Compress.hx
  2. 92 0
      std/neko/zip/File.hx
  3. 33 0
      std/neko/zip/Flush.hx
  4. 69 0
      std/neko/zip/Uncompress.hx

+ 63 - 0
std/neko/zip/Compress.hx

@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2005, The haXe Project Contributors
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+package neko.zip;
+
+class Compress {
+
+	var s : Void;
+
+	public function new( level : Int ) {
+		s = _deflate_init(level);
+	}
+
+	public function run( src : String, srcPos : Int, dst : String, dstPos : Int ) : { done : Bool, read : Int, write : Int } {
+		return _deflate_buffer(s,untyped src.__s,srcPos,untyped dst.__s,dstPos);
+	}
+
+	public function setFlushMode( f : Flush ) {
+		_set_flush_mode(s,untyped Std.string(f).__s);
+	}
+
+	public function close() {
+		_deflate_end(s);
+	}
+
+	public static function run( s : String, level : Int ) : String {
+		var c = new Compress(level);
+		c.setFlushMode(Flush.FINISH);
+		var out = neko.Lib.makeString(_deflate_bound(c.s,s.length) + 10000);
+		var r = c.run(s,0,out,0);
+		if( !r.done || r.read != s.length )
+			throw "Compression failed";
+		return out.substr(0,r.write);
+	}
+
+	static var _deflate_init = neko.Lib.load("zlib","deflate_init",1);
+	static var _deflate_bound = neko.Lib.load("zlib","deflate_bound",2);
+	static var _deflate_buffer = neko.Lib.load("zlib","deflate_buffer",5);
+	static var _deflate_end = neko.Lib.load("zlib","deflate_end",1);
+	static var _set_flush_mode = neko.Lib.load("zlib","set_flush_mode",2);
+
+}

+ 92 - 0
std/neko/zip/File.hx

@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2005, The haXe Project Contributors
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+package neko.zip;
+
+signature ZipEntry {
+	var fileName : String;
+	var fileSize : Int;
+	var compressedSize : Int;
+	var compressedDataPos : Int;
+}
+
+class File {
+
+	static function int32( data : String, p : Int ) {
+		var c1 = data.charCodeAt(p);
+		var c2 = data.charCodeAt(p+1);
+		var c3 = data.charCodeAt(p+2);
+		var c4 = data.charCodeAt(p+3);
+		return c1 | (c2 << 8) | (c3 << 16) | (c4 << 24);
+	}
+
+	static function int16( data : String, p : Int ) {
+		var c1 = data.charCodeAt(p);
+		var c2 = data.charCodeAt(p+1);
+		return c1 | (c2 << 8);
+	}
+
+	public static function unzip( data : String, f : ZipEntry ) : String {
+		var c = new Uncompress(-15);
+		var s = neko.Lib.makeString(f.fileSize);
+		var r = c.run(data,f.compressedDataPos,s,0);
+		c.close();
+		if( !r.done || r.read != f.compressedSize || r.write != f.fileSize )
+			throw "Invalid compressed data for "+f.fileName;
+		return s;
+	}
+
+	public static function read( data : String ) : List<ZipEntry> {
+		var p = 0;
+		var l = new List();
+		while( true ) {
+			var h = int32(data,p);
+			if( h == 0x02014B50 || h == 0x06054B50 )
+				break;
+			if( h != 0x04034B50 )
+				throw "Invalid Zip Data";
+			p += 18;
+			var csize = int32(data,p);
+			p += 4;
+			var usize = int32(data,p);
+			p += 4;
+			var fnamelen = int16(data,p);
+			p += 2;
+			var elen = int16(data,p);
+			p += 2;
+			var fname = data.substr(p,fnamelen);
+			p += fnamelen;
+			p += elen;
+			l.add({
+				fileName : fname,
+				fileSize : usize,
+				compressedSize : csize,
+				compressedDataPos : p
+			});
+			p += csize;
+		}
+		return l;
+	}
+
+}

+ 33 - 0
std/neko/zip/Flush.hx

@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2005, The haXe Project Contributors
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+package neko.zip;
+
+enum Flush {
+	NO;
+	SYNC;
+	FULL;
+	FINISH;
+	BLOCK;
+}

+ 69 - 0
std/neko/zip/Uncompress.hx

@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2005, The haXe Project Contributors
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+package neko.zip;
+
+class Uncompress {
+
+	var s : Void;
+
+	public function new( windowBits : Int ) {
+		s = _inflate_init(windowBits);
+	}
+
+	public function run( src : String, srcPos : Int, dst : String, dstPos : Int ) : { done : Bool, read : Int, write : Int } {
+		return _inflate_buffer(s,untyped src.__s,srcPos,untyped dst.__s,dstPos);
+	}
+
+	public function setFlushMode( f : Flush ) {
+		_set_flush_mode(s,untyped Std.string(f).__s);
+	}
+
+	public function close() {
+		_inflate_end(s);
+	}
+
+	public static function run( src : String ) : String {
+		var u = new Uncompress(null);
+		var tmp = neko.Lib.makeString(1 << 16); // 64K
+		var b = new StringBuf();
+		var pos = 0;
+		u.setFlushMode(Flush.SYNC);
+		while( true ) {
+			var r = u.run(src,pos,tmp,0);
+			b.addSub(tmp,0,r.write);
+			pos += r.read;
+			if( r.done )
+				break;
+		}
+		u.close();
+		return b.toString();
+	}
+
+	static var _inflate_init = neko.Lib.load("zlib","inflate_init",1);
+	static var _inflate_buffer = neko.Lib.load("zlib","inflate_buffer",5);
+	static var _inflate_end = neko.Lib.load("zlib","inflate_end",1);
+	static var _set_flush_mode = neko.Lib.load("zlib","set_flush_mode",2);
+
+}