aboutsummaryrefslogtreecommitdiffstats
path: root/java/com/jcraft/jzlib
diff options
context:
space:
mode:
authorBrian P. Hinz <bphinz@users.sf.net>2015-12-26 21:48:11 -0500
committerBrian P. Hinz <bphinz@users.sf.net>2015-12-26 21:53:45 -0500
commitce48cc8962233d97a39d1f61d661d4e57b7eb1e4 (patch)
tree812a0c1d02173325415b014d8523bd46394a9e90 /java/com/jcraft/jzlib
parent928bd74249e737dc2d00d6fc95559f6a26dbb6ab (diff)
downloadtigervnc-ce48cc8962233d97a39d1f61d661d4e57b7eb1e4.tar.gz
tigervnc-ce48cc8962233d97a39d1f61d661d4e57b7eb1e4.zip
Upgrade in-tree jsch and jzlib to latest upstream versions
Diffstat (limited to 'java/com/jcraft/jzlib')
-rw-r--r--java/com/jcraft/jzlib/Deflate.java20
-rw-r--r--java/com/jcraft/jzlib/Deflater.java171
-rw-r--r--java/com/jcraft/jzlib/DeflaterOutputStream.java181
-rw-r--r--java/com/jcraft/jzlib/GZIPException.java44
-rw-r--r--java/com/jcraft/jzlib/GZIPInputStream.java145
-rw-r--r--java/com/jcraft/jzlib/GZIPOutputStream.java90
-rw-r--r--java/com/jcraft/jzlib/Inflate.java46
-rw-r--r--java/com/jcraft/jzlib/Inflater.java168
-rw-r--r--java/com/jcraft/jzlib/InflaterInputStream.java247
-rw-r--r--java/com/jcraft/jzlib/JZlib.java9
-rw-r--r--java/com/jcraft/jzlib/Tree.java15
-rw-r--r--java/com/jcraft/jzlib/ZInputStream.java2
-rw-r--r--java/com/jcraft/jzlib/ZStream.java36
-rw-r--r--java/com/jcraft/jzlib/ZStreamException.java88
14 files changed, 1199 insertions, 63 deletions
diff --git a/java/com/jcraft/jzlib/Deflate.java b/java/com/jcraft/jzlib/Deflate.java
index baaac9be..cfda0f0b 100644
--- a/java/com/jcraft/jzlib/Deflate.java
+++ b/java/com/jcraft/jzlib/Deflate.java
@@ -263,6 +263,8 @@ final class Deflate implements Cloneable {
// number of codes at each bit length for an optimal tree
short[] bl_count=new short[MAX_BITS+1];
+ // working area to be used in Tree#gen_codes()
+ short[] next_code=new short[MAX_BITS+1];
// heap used to build the Huffman trees
int[] heap=new int[2*L_CODES+1];
@@ -275,7 +277,7 @@ final class Deflate implements Cloneable {
// Depth of each subtree used as tie breaker for trees of equal frequency
byte[] depth=new byte[2*L_CODES+1];
- int l_buf; // index for literals or lengths */
+ byte[] l_buf; // index for literals or lengths */
// Size of match buffer for literals/lengths. There are 4 reasons for
// limiting lit_bufsize to 64K:
@@ -630,7 +632,7 @@ final class Deflate implements Cloneable {
pending_buf[d_buf+last_lit*2] = (byte)(dist>>>8);
pending_buf[d_buf+last_lit*2+1] = (byte)dist;
- pending_buf[l_buf+last_lit] = (byte)lc; last_lit++;
+ l_buf[last_lit] = (byte)lc; last_lit++;
if (dist == 0) {
// lc is the unmatched char
@@ -675,7 +677,7 @@ final class Deflate implements Cloneable {
do{
dist=((pending_buf[d_buf+lx*2]<<8)&0xff00)|
(pending_buf[d_buf+lx*2+1]&0xff);
- lc=(pending_buf[l_buf+lx])&0xff; lx++;
+ lc=(l_buf[lx])&0xff; lx++;
if(dist == 0){
send_code(lc, ltree); // send a literal byte
@@ -1379,11 +1381,11 @@ final class Deflate implements Cloneable {
// We overlay pending_buf and d_buf+l_buf. This works since the average
// output size for (length,distance) codes is <= 24 bits.
- pending_buf = new byte[lit_bufsize*4];
- pending_buf_size = lit_bufsize*4;
+ pending_buf = new byte[lit_bufsize*3];
+ pending_buf_size = lit_bufsize*3;
- d_buf = lit_bufsize/2;
- l_buf = (1+2)*lit_bufsize;
+ d_buf = lit_bufsize;
+ l_buf = new byte[lit_bufsize];
this.level = level;
@@ -1420,6 +1422,7 @@ final class Deflate implements Cloneable {
}
// Deallocate in reverse order of allocations:
pending_buf=null;
+ l_buf=null;
head=null;
prev=null;
window=null;
@@ -1697,6 +1700,8 @@ final class Deflate implements Cloneable {
Deflate dest = (Deflate)super.clone();
dest.pending_buf = dup(dest.pending_buf);
+ dest.d_buf = dest.d_buf;
+ dest.l_buf = dup(dest.l_buf);
dest.window = dup(dest.window);
dest.prev = dup(dest.prev);
@@ -1706,6 +1711,7 @@ final class Deflate implements Cloneable {
dest.bl_tree = dup(dest.bl_tree);
dest.bl_count = dup(dest.bl_count);
+ dest.next_code = dup(dest.next_code);
dest.heap = dup(dest.heap);
dest.depth = dup(dest.depth);
diff --git a/java/com/jcraft/jzlib/Deflater.java b/java/com/jcraft/jzlib/Deflater.java
new file mode 100644
index 00000000..ce0580dd
--- /dev/null
+++ b/java/com/jcraft/jzlib/Deflater.java
@@ -0,0 +1,171 @@
+/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
+/*
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. 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.
+
+ 3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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.
+ */
+/*
+ * This program is based on zlib-1.1.3, so all credit should go authors
+ * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
+ * and contributors of zlib.
+ */
+
+package com.jcraft.jzlib;
+
+final public class Deflater extends ZStream{
+
+ static final private int MAX_WBITS=15; // 32K LZ77 window
+ static final private int DEF_WBITS=MAX_WBITS;
+
+ static final private int Z_NO_FLUSH=0;
+ static final private int Z_PARTIAL_FLUSH=1;
+ static final private int Z_SYNC_FLUSH=2;
+ static final private int Z_FULL_FLUSH=3;
+ static final private int Z_FINISH=4;
+
+ static final private int MAX_MEM_LEVEL=9;
+
+ static final private int Z_OK=0;
+ static final private int Z_STREAM_END=1;
+ static final private int Z_NEED_DICT=2;
+ static final private int Z_ERRNO=-1;
+ static final private int Z_STREAM_ERROR=-2;
+ static final private int Z_DATA_ERROR=-3;
+ static final private int Z_MEM_ERROR=-4;
+ static final private int Z_BUF_ERROR=-5;
+ static final private int Z_VERSION_ERROR=-6;
+
+ private boolean finished = false;
+
+ public Deflater(){
+ super();
+ }
+
+ public Deflater(int level) throws GZIPException {
+ this(level, MAX_WBITS);
+ }
+
+ public Deflater(int level, boolean nowrap) throws GZIPException {
+ this(level, MAX_WBITS, nowrap);
+ }
+
+ public Deflater(int level, int bits) throws GZIPException {
+ this(level, bits, false);
+ }
+
+ public Deflater(int level, int bits, boolean nowrap) throws GZIPException {
+ super();
+ int ret = init(level, bits, nowrap);
+ if(ret!=Z_OK)
+ throw new GZIPException(ret+": "+msg);
+ }
+
+ public Deflater(int level, int bits, int memlevel, JZlib.WrapperType wrapperType) throws GZIPException {
+ super();
+ int ret = init(level, bits, memlevel, wrapperType);
+ if(ret!=Z_OK)
+ throw new GZIPException(ret+": "+msg);
+ }
+
+ public Deflater(int level, int bits, int memlevel) throws GZIPException {
+ super();
+ int ret = init(level, bits, memlevel);
+ if(ret!=Z_OK)
+ throw new GZIPException(ret+": "+msg);
+ }
+
+ public int init(int level){
+ return init(level, MAX_WBITS);
+ }
+ public int init(int level, boolean nowrap){
+ return init(level, MAX_WBITS, nowrap);
+ }
+ public int init(int level, int bits){
+ return init(level, bits, false);
+ }
+ public int init(int level, int bits, int memlevel, JZlib.WrapperType wrapperType){
+ if(bits < 9 || bits > 15){
+ return Z_STREAM_ERROR;
+ }
+ if(wrapperType == JZlib.W_NONE) {
+ bits *= -1;
+ }
+ else if(wrapperType == JZlib.W_GZIP) {
+ bits += 16;
+ }
+ else if(wrapperType == JZlib.W_ANY) {
+ return Z_STREAM_ERROR;
+ }
+ else if(wrapperType == JZlib.W_ZLIB) {
+ }
+ return init(level, bits, memlevel);
+ }
+ public int init(int level, int bits, int memlevel){
+ finished = false;
+ dstate=new Deflate(this);
+ return dstate.deflateInit(level, bits, memlevel);
+ }
+ public int init(int level, int bits, boolean nowrap){
+ finished = false;
+ dstate=new Deflate(this);
+ return dstate.deflateInit(level, nowrap?-bits:bits);
+ }
+
+ public int deflate(int flush){
+ if(dstate==null){
+ return Z_STREAM_ERROR;
+ }
+ int ret = dstate.deflate(flush);
+ if(ret == Z_STREAM_END)
+ finished = true;
+ return ret;
+ }
+ public int end(){
+ finished = true;
+ if(dstate==null) return Z_STREAM_ERROR;
+ int ret=dstate.deflateEnd();
+ dstate=null;
+ free();
+ return ret;
+ }
+ public int params(int level, int strategy){
+ if(dstate==null) return Z_STREAM_ERROR;
+ return dstate.deflateParams(level, strategy);
+ }
+ public int setDictionary (byte[] dictionary, int dictLength){
+ if(dstate == null)
+ return Z_STREAM_ERROR;
+ return dstate.deflateSetDictionary(dictionary, dictLength);
+ }
+
+ public boolean finished(){
+ return finished;
+ }
+
+ public int copy(Deflater src){
+ this.finished = src.finished;
+ return Deflate.deflateCopy(this, src);
+ }
+}
diff --git a/java/com/jcraft/jzlib/DeflaterOutputStream.java b/java/com/jcraft/jzlib/DeflaterOutputStream.java
new file mode 100644
index 00000000..4c9f0d25
--- /dev/null
+++ b/java/com/jcraft/jzlib/DeflaterOutputStream.java
@@ -0,0 +1,181 @@
+/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
+/*
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. 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.
+
+ 3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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 com.jcraft.jzlib;
+import java.io.*;
+
+public class DeflaterOutputStream extends FilterOutputStream {
+
+ protected final Deflater deflater;
+
+ protected byte[] buffer;
+
+ private boolean closed = false;
+
+ private boolean syncFlush = false;
+
+ private final byte[] buf1 = new byte[1];
+
+ protected boolean mydeflater = false;
+
+ private boolean close_out = true;
+
+ protected static final int DEFAULT_BUFSIZE = 512;
+
+ public DeflaterOutputStream(OutputStream out) throws IOException {
+ this(out,
+ new Deflater(JZlib.Z_DEFAULT_COMPRESSION),
+ DEFAULT_BUFSIZE, true);
+ mydeflater = true;
+ }
+
+ public DeflaterOutputStream(OutputStream out, Deflater def) throws IOException {
+ this(out, def, DEFAULT_BUFSIZE, true);
+ }
+
+ public DeflaterOutputStream(OutputStream out,
+ Deflater deflater,
+ int size) throws IOException {
+ this(out, deflater, size, true);
+ }
+ public DeflaterOutputStream(OutputStream out,
+ Deflater deflater,
+ int size,
+ boolean close_out) throws IOException {
+ super(out);
+ if (out == null || deflater == null) {
+ throw new NullPointerException();
+ }
+ else if (size <= 0) {
+ throw new IllegalArgumentException("buffer size must be greater than 0");
+ }
+ this.deflater = deflater;
+ buffer = new byte[size];
+ this.close_out = close_out;
+ }
+
+ public void write(int b) throws IOException {
+ buf1[0] = (byte)(b & 0xff);
+ write(buf1, 0, 1);
+ }
+
+ public void write(byte[] b, int off, int len) throws IOException {
+ if (deflater.finished()) {
+ throw new IOException("finished");
+ }
+ else if (off<0 | len<0 | off+len>b.length) {
+ throw new IndexOutOfBoundsException();
+ }
+ else if (len == 0) {
+ return;
+ }
+ else {
+ int flush = syncFlush ? JZlib.Z_SYNC_FLUSH : JZlib.Z_NO_FLUSH;
+ deflater.setInput(b, off, len, true);
+ while (deflater.avail_in>0) {
+ int err = deflate(flush);
+ if (err == JZlib.Z_STREAM_END)
+ break;
+ }
+ }
+ }
+
+ public void finish() throws IOException {
+ while (!deflater.finished()) {
+ deflate(JZlib.Z_FINISH);
+ }
+ }
+
+ public void close() throws IOException {
+ if (!closed) {
+ finish();
+ if (mydeflater){
+ deflater.end();
+ }
+ if(close_out)
+ out.close();
+ closed = true;
+ }
+ }
+
+ protected int deflate(int flush) throws IOException {
+ deflater.setOutput(buffer, 0, buffer.length);
+ int err = deflater.deflate(flush);
+ switch(err) {
+ case JZlib.Z_OK:
+ case JZlib.Z_STREAM_END:
+ break;
+ case JZlib.Z_BUF_ERROR:
+ if(deflater.avail_in<=0 && flush!=JZlib.Z_FINISH){
+ // flush() without any data
+ break;
+ }
+ default:
+ throw new IOException("failed to deflate");
+ }
+ int len = deflater.next_out_index;
+ if (len > 0) {
+ out.write(buffer, 0, len);
+ }
+ return err;
+ }
+
+ public void flush() throws IOException {
+ if (syncFlush && !deflater.finished()) {
+ while (true) {
+ int err = deflate(JZlib.Z_SYNC_FLUSH);
+ if (deflater.next_out_index < buffer.length)
+ break;
+ if (err == JZlib.Z_STREAM_END)
+ break;
+ }
+ }
+ out.flush();
+ }
+
+ public long getTotalIn() {
+ return deflater.getTotalIn();
+ }
+
+ public long getTotalOut() {
+ return deflater.getTotalOut();
+ }
+
+ public void setSyncFlush(boolean syncFlush){
+ this.syncFlush = syncFlush;
+ }
+
+ public boolean getSyncFlush(){
+ return this.syncFlush;
+ }
+
+ public Deflater getDeflater(){
+ return deflater;
+ }
+}
diff --git a/java/com/jcraft/jzlib/GZIPException.java b/java/com/jcraft/jzlib/GZIPException.java
new file mode 100644
index 00000000..0beef40d
--- /dev/null
+++ b/java/com/jcraft/jzlib/GZIPException.java
@@ -0,0 +1,44 @@
+/* -*-mode:java; c-basic-offset:2; -*- */
+/*
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. 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.
+
+ 3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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.
+ */
+/*
+ * This program is based on zlib-1.1.3, so all credit should go authors
+ * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
+ * and contributors of zlib.
+ */
+
+package com.jcraft.jzlib;
+
+public class GZIPException extends java.io.IOException {
+ public GZIPException() {
+ super();
+ }
+ public GZIPException(String s) {
+ super(s);
+ }
+}
diff --git a/java/com/jcraft/jzlib/GZIPInputStream.java b/java/com/jcraft/jzlib/GZIPInputStream.java
new file mode 100644
index 00000000..5d29dca7
--- /dev/null
+++ b/java/com/jcraft/jzlib/GZIPInputStream.java
@@ -0,0 +1,145 @@
+/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
+/*
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. 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.
+
+ 3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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 com.jcraft.jzlib;
+import java.io.*;
+
+public class GZIPInputStream extends InflaterInputStream {
+
+ public GZIPInputStream(InputStream in) throws IOException {
+ this(in, DEFAULT_BUFSIZE, true);
+ }
+
+ public GZIPInputStream(InputStream in,
+ int size,
+ boolean close_in) throws IOException {
+ this(in, new Inflater(15+16), size, close_in);
+ myinflater = true;
+ }
+
+ public GZIPInputStream(InputStream in,
+ Inflater inflater,
+ int size,
+ boolean close_in) throws IOException {
+ super(in, inflater, size, close_in);
+ }
+
+ public long getModifiedtime() {
+ return inflater.istate.getGZIPHeader().getModifiedTime();
+ }
+
+ public int getOS() {
+ return inflater.istate.getGZIPHeader().getOS();
+ }
+
+ public String getName() {
+ return inflater.istate.getGZIPHeader().getName();
+ }
+
+ public String getComment() {
+ return inflater.istate.getGZIPHeader().getComment();
+ }
+
+ public long getCRC() throws GZIPException {
+ if(inflater.istate.mode != 12 /*DONE*/)
+ throw new GZIPException("checksum is not calculated yet.");
+ return inflater.istate.getGZIPHeader().getCRC();
+ }
+
+ public void readHeader() throws IOException {
+
+ byte[] empty = "".getBytes();
+ inflater.setOutput(empty, 0, 0);
+ inflater.setInput(empty, 0, 0, false);
+
+ byte[] b = new byte[10];
+
+ int n = fill(b);
+ if(n!=10){
+ if(n>0){
+ inflater.setInput(b, 0, n, false);
+ //inflater.next_in_index = n;
+ inflater.next_in_index = 0;
+ inflater.avail_in = n;
+ }
+ throw new IOException("no input");
+ }
+
+ inflater.setInput(b, 0, n, false);
+
+ byte[] b1 = new byte[1];
+ do{
+ if(inflater.avail_in<=0){
+ int i = in.read(b1);
+ if(i<=0)
+ throw new IOException("no input");
+ inflater.setInput(b1, 0, 1, true);
+ }
+
+ int err = inflater.inflate(JZlib.Z_NO_FLUSH);
+
+ if(err!=0/*Z_OK*/){
+ int len = 2048-inflater.next_in.length;
+ if(len>0){
+ byte[] tmp = new byte[len];
+ n = fill(tmp);
+ if(n>0){
+ inflater.avail_in += inflater.next_in_index;
+ inflater.next_in_index = 0;
+ inflater.setInput(tmp, 0, n, true);
+ }
+ }
+ //inflater.next_in_index = inflater.next_in.length;
+ inflater.avail_in += inflater.next_in_index;
+ inflater.next_in_index = 0;
+ throw new IOException(inflater.msg);
+ }
+ }
+ while(inflater.istate.inParsingHeader());
+ }
+
+ private int fill(byte[] buf) {
+ int len = buf.length;
+ int n = 0;
+ do{
+ int i = -1;
+ try {
+ i = in.read(buf, n, buf.length - n);
+ }
+ catch(IOException e){
+ }
+ if(i == -1){
+ break;
+ }
+ n+=i;
+ }
+ while(n<len);
+ return n;
+ }
+} \ No newline at end of file
diff --git a/java/com/jcraft/jzlib/GZIPOutputStream.java b/java/com/jcraft/jzlib/GZIPOutputStream.java
new file mode 100644
index 00000000..54dcf8ec
--- /dev/null
+++ b/java/com/jcraft/jzlib/GZIPOutputStream.java
@@ -0,0 +1,90 @@
+/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
+/*
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. 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.
+
+ 3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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 com.jcraft.jzlib;
+import java.io.*;
+
+public class GZIPOutputStream extends DeflaterOutputStream {
+
+ public GZIPOutputStream(OutputStream out) throws IOException {
+ this(out, DEFAULT_BUFSIZE);
+ }
+
+ public GZIPOutputStream(OutputStream out, int size) throws IOException {
+ this(out, size, true);
+ }
+
+ public GZIPOutputStream(OutputStream out,
+ int size,
+ boolean close_out) throws IOException {
+ this(out,
+ new Deflater(JZlib.Z_DEFAULT_COMPRESSION, 15+16),
+ size, close_out);
+ mydeflater=true;
+ }
+
+ public GZIPOutputStream(OutputStream out,
+ Deflater deflater,
+ int size,
+ boolean close_out) throws IOException{
+ super(out, deflater, size, close_out);
+ }
+
+
+ private void check() throws GZIPException {
+ if(deflater.dstate.status != 42 /*INIT_STATUS*/)
+ throw new GZIPException("header is already written.");
+ }
+
+ public void setModifiedTime(long mtime) throws GZIPException {
+ check();
+ deflater.dstate.getGZIPHeader().setModifiedTime(mtime);
+ }
+
+ public void setOS(int os) throws GZIPException {
+ check();
+ deflater.dstate.getGZIPHeader().setOS(os);
+ }
+
+ public void setName(String name) throws GZIPException {
+ check();
+ deflater.dstate.getGZIPHeader().setName(name);
+ }
+
+ public void setComment(String comment) throws GZIPException {
+ check();
+ deflater.dstate.getGZIPHeader().setComment(comment);
+ }
+
+ public long getCRC() throws GZIPException {
+ if(deflater.dstate.status != 666 /*FINISH_STATE*/)
+ throw new GZIPException("checksum is not calculated yet.");
+ return deflater.dstate.getGZIPHeader().getCRC();
+ }
+}
diff --git a/java/com/jcraft/jzlib/Inflate.java b/java/com/jcraft/jzlib/Inflate.java
index 6aa6240c..a9693325 100644
--- a/java/com/jcraft/jzlib/Inflate.java
+++ b/java/com/jcraft/jzlib/Inflate.java
@@ -85,6 +85,8 @@ final class Inflate{
static final private int HCRC=22;
static final private int FLAGS=23;
+ static final int INFLATE_ANY=0x40000000;
+
int mode; // current inflate mode
// mode dependent information
@@ -99,6 +101,11 @@ final class Inflate{
// mode independent information
int wrap; // flag for no wrapper
+ // 0: no wrapper
+ // 1: zlib header
+ // 2: gzip header
+ // 4: auto detection
+
int wbits; // log2(window size) (8..15, defaults to 15)
InfBlocks blocks; // current inflate_blocks state
@@ -143,6 +150,16 @@ final class Inflate{
if(w < 0){
w = - w;
}
+ else if((w&INFLATE_ANY) != 0){
+ wrap = 4;
+ w &= ~INFLATE_ANY;
+ if(w < 48)
+ w &= 15;
+ }
+ else if((w & ~31) != 0) { // for example, DEF_WBITS + 32
+ wrap = 4; // zlib and gzip wrapped data should be accepted.
+ w &= 15;
+ }
else {
wrap = (w >> 4) + 1;
if(w < 48)
@@ -195,7 +212,11 @@ final class Inflate{
try { r=readBytes(2, r, f); }
catch(Return e){ return e.r; }
- if((wrap&2)!=0 && this.need == 0x8b1fL) { // gzip header
+ if((wrap == 4 || (wrap&2)!=0) &&
+ this.need == 0x8b1fL) { // gzip header
+ if(wrap == 4){
+ wrap = 2;
+ }
z.adler=new CRC32();
checksum(2, this.need);
@@ -206,13 +227,28 @@ final class Inflate{
break;
}
+ if((wrap&2) != 0){
+ this.mode = BAD;
+ z.msg = "incorrect header check";
+ break;
+ }
+
flags = 0;
this.method = ((int)this.need)&0xff;
b=((int)(this.need>>8))&0xff;
- if((wrap&1)==0 || // check if zlib header allowed
- (((this.method << 8)+b) % 31)!=0){
+ if(((wrap&1)==0 || // check if zlib header allowed
+ (((this.method << 8)+b) % 31)!=0) &&
+ (this.method&0xf)!=Z_DEFLATED){
+ if(wrap == 4){
+ z.next_in_index -= 2;
+ z.avail_in += 2;
+ z.total_in -= 2;
+ wrap = 0;
+ this.mode = BLOCKS;
+ break;
+ }
this.mode = BAD;
z.msg = "incorrect header check";
// since zlib 1.2, it is allowted to inflateSync for this case.
@@ -231,6 +267,10 @@ final class Inflate{
*/
break;
}
+
+ if(wrap == 4){
+ wrap = 1;
+ }
if((this.method>>4)+8>this.wbits){
this.mode = BAD;
diff --git a/java/com/jcraft/jzlib/Inflater.java b/java/com/jcraft/jzlib/Inflater.java
new file mode 100644
index 00000000..0fb0b098
--- /dev/null
+++ b/java/com/jcraft/jzlib/Inflater.java
@@ -0,0 +1,168 @@
+/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
+/*
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. 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.
+
+ 3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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.
+ */
+/*
+ * This program is based on zlib-1.1.3, so all credit should go authors
+ * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
+ * and contributors of zlib.
+ */
+
+package com.jcraft.jzlib;
+
+final public class Inflater extends ZStream{
+
+ static final private int MAX_WBITS=15; // 32K LZ77 window
+ static final private int DEF_WBITS=MAX_WBITS;
+
+ static final private int Z_NO_FLUSH=0;
+ static final private int Z_PARTIAL_FLUSH=1;
+ static final private int Z_SYNC_FLUSH=2;
+ static final private int Z_FULL_FLUSH=3;
+ static final private int Z_FINISH=4;
+
+ static final private int MAX_MEM_LEVEL=9;
+
+ static final private int Z_OK=0;
+ static final private int Z_STREAM_END=1;
+ static final private int Z_NEED_DICT=2;
+ static final private int Z_ERRNO=-1;
+ static final private int Z_STREAM_ERROR=-2;
+ static final private int Z_DATA_ERROR=-3;
+ static final private int Z_MEM_ERROR=-4;
+ static final private int Z_BUF_ERROR=-5;
+ static final private int Z_VERSION_ERROR=-6;
+
+ public Inflater() {
+ super();
+ init();
+ }
+
+ public Inflater(JZlib.WrapperType wrapperType) throws GZIPException {
+ this(DEF_WBITS, wrapperType);
+ }
+
+ public Inflater(int w, JZlib.WrapperType wrapperType) throws GZIPException {
+ super();
+ int ret = init(w, wrapperType);
+ if(ret!=Z_OK)
+ throw new GZIPException(ret+": "+msg);
+ }
+
+ public Inflater(int w) throws GZIPException {
+ this(w, false);
+ }
+
+ public Inflater(boolean nowrap) throws GZIPException {
+ this(DEF_WBITS, nowrap);
+ }
+
+ public Inflater(int w, boolean nowrap) throws GZIPException {
+ super();
+ int ret = init(w, nowrap);
+ if(ret!=Z_OK)
+ throw new GZIPException(ret+": "+msg);
+ }
+
+ private boolean finished = false;
+
+ public int init(){
+ return init(DEF_WBITS);
+ }
+
+ public int init(JZlib.WrapperType wrapperType){
+ return init(DEF_WBITS, wrapperType);
+ }
+
+ public int init(int w, JZlib.WrapperType wrapperType) {
+ boolean nowrap = false;
+ if(wrapperType == JZlib.W_NONE){
+ nowrap = true;
+ }
+ else if(wrapperType == JZlib.W_GZIP) {
+ w += 16;
+ }
+ else if(wrapperType == JZlib.W_ANY) {
+ w |= Inflate.INFLATE_ANY;
+ }
+ else if(wrapperType == JZlib.W_ZLIB) {
+ }
+ return init(w, nowrap);
+ }
+
+ public int init(boolean nowrap){
+ return init(DEF_WBITS, nowrap);
+ }
+
+ public int init(int w){
+ return init(w, false);
+ }
+
+ public int init(int w, boolean nowrap){
+ finished = false;
+ istate=new Inflate(this);
+ return istate.inflateInit(nowrap?-w:w);
+ }
+
+ public int inflate(int f){
+ if(istate==null) return Z_STREAM_ERROR;
+ int ret = istate.inflate(f);
+ if(ret == Z_STREAM_END)
+ finished = true;
+ return ret;
+ }
+
+ public int end(){
+ finished = true;
+ if(istate==null) return Z_STREAM_ERROR;
+ int ret=istate.inflateEnd();
+// istate = null;
+ return ret;
+ }
+
+ public int sync(){
+ if(istate == null)
+ return Z_STREAM_ERROR;
+ return istate.inflateSync();
+ }
+
+ public int syncPoint(){
+ if(istate == null)
+ return Z_STREAM_ERROR;
+ return istate.inflateSyncPoint();
+ }
+
+ public int setDictionary(byte[] dictionary, int dictLength){
+ if(istate == null)
+ return Z_STREAM_ERROR;
+ return istate.inflateSetDictionary(dictionary, dictLength);
+ }
+
+ public boolean finished(){
+ return istate.mode==12 /*DONE*/;
+ }
+}
diff --git a/java/com/jcraft/jzlib/InflaterInputStream.java b/java/com/jcraft/jzlib/InflaterInputStream.java
new file mode 100644
index 00000000..0420582a
--- /dev/null
+++ b/java/com/jcraft/jzlib/InflaterInputStream.java
@@ -0,0 +1,247 @@
+/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
+/*
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. 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.
+
+ 3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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 com.jcraft.jzlib;
+import java.io.*;
+
+public class InflaterInputStream extends FilterInputStream {
+ protected final Inflater inflater;
+ protected byte[] buf;
+
+ private boolean closed = false;
+
+ private boolean eof = false;
+
+ private boolean close_in = true;
+
+ protected static final int DEFAULT_BUFSIZE = 512;
+
+ public InflaterInputStream(InputStream in) throws IOException {
+ this(in, false);
+ }
+
+ public InflaterInputStream(InputStream in, boolean nowrap) throws IOException {
+ this(in, new Inflater(nowrap));
+ myinflater = true;
+ }
+
+ public InflaterInputStream(InputStream in, Inflater inflater) throws IOException {
+ this(in, inflater, DEFAULT_BUFSIZE);
+ }
+
+ public InflaterInputStream(InputStream in,
+ Inflater inflater, int size) throws IOException {
+ this(in, inflater, size, true);
+ }
+
+ public InflaterInputStream(InputStream in,
+ Inflater inflater,
+ int size, boolean close_in) throws IOException {
+ super(in);
+ if (in == null || inflater == null) {
+ throw new NullPointerException();
+ }
+ else if (size <= 0) {
+ throw new IllegalArgumentException("buffer size must be greater than 0");
+ }
+ this.inflater = inflater;
+ buf = new byte[size];
+ this.close_in = close_in;
+ }
+
+ protected boolean myinflater = false;
+
+ private byte[] byte1 = new byte[1];
+
+ public int read() throws IOException {
+ if (closed) { throw new IOException("Stream closed"); }
+ return read(byte1, 0, 1) == -1 ? -1 : byte1[0] & 0xff;
+ }
+
+ public int read(byte[] b, int off, int len) throws IOException {
+ if (closed) { throw new IOException("Stream closed"); }
+ if (b == null) {
+ throw new NullPointerException();
+ }
+ else if (off < 0 || len < 0 || len > b.length - off) {
+ throw new IndexOutOfBoundsException();
+ }
+ else if (len == 0) {
+ return 0;
+ }
+ else if (eof) {
+ return -1;
+ }
+
+ int n = 0;
+ inflater.setOutput(b, off, len);
+ while(!eof) {
+ if(inflater.avail_in==0)
+ fill();
+ int err = inflater.inflate(JZlib.Z_NO_FLUSH);
+ n += inflater.next_out_index - off;
+ off = inflater.next_out_index;
+ switch(err) {
+ case JZlib.Z_DATA_ERROR:
+ throw new IOException(inflater.msg);
+ case JZlib.Z_STREAM_END:
+ case JZlib.Z_NEED_DICT:
+ eof = true;
+ if(err == JZlib.Z_NEED_DICT)
+ return -1;
+ break;
+ default:
+ }
+ if(inflater.avail_out==0)
+ break;
+ }
+ return n;
+ }
+
+ public int available() throws IOException {
+ if (closed) { throw new IOException("Stream closed"); }
+ if (eof) {
+ return 0;
+ }
+ else {
+ return 1;
+ }
+ }
+
+ private byte[] b = new byte[512];
+
+ public long skip(long n) throws IOException {
+ if (n < 0) {
+ throw new IllegalArgumentException("negative skip length");
+ }
+
+ if (closed) { throw new IOException("Stream closed"); }
+
+ int max = (int)Math.min(n, Integer.MAX_VALUE);
+ int total = 0;
+ while (total < max) {
+ int len = max - total;
+ if (len > b.length) {
+ len = b.length;
+ }
+ len = read(b, 0, len);
+ if (len == -1) {
+ eof = true;
+ break;
+ }
+ total += len;
+ }
+ return total;
+ }
+
+ public void close() throws IOException {
+ if (!closed) {
+ if (myinflater)
+ inflater.end();
+ if(close_in)
+ in.close();
+ closed = true;
+ }
+ }
+
+ protected void fill() throws IOException {
+ if (closed) { throw new IOException("Stream closed"); }
+ int len = in.read(buf, 0, buf.length);
+ if (len == -1) {
+ if(inflater.istate.wrap == 0 &&
+ !inflater.finished()){
+ buf[0]=0;
+ len=1;
+ }
+ else if(inflater.istate.was != -1){ // in reading trailer
+ throw new IOException("footer is not found");
+ }
+ else{
+ throw new EOFException("Unexpected end of ZLIB input stream");
+ }
+ }
+ inflater.setInput(buf, 0, len, true);
+ }
+
+ public boolean markSupported() {
+ return false;
+ }
+
+ public synchronized void mark(int readlimit) {
+ }
+
+ public synchronized void reset() throws IOException {
+ throw new IOException("mark/reset not supported");
+ }
+
+ public long getTotalIn() {
+ return inflater.getTotalIn();
+ }
+
+ public long getTotalOut() {
+ return inflater.getTotalOut();
+ }
+
+ public byte[] getAvailIn() {
+ if(inflater.avail_in<=0)
+ return null;
+ byte[] tmp = new byte[inflater.avail_in];
+ System.arraycopy(inflater.next_in, inflater.next_in_index,
+ tmp, 0, inflater.avail_in);
+ return tmp;
+ }
+
+ public void readHeader() throws IOException {
+
+ byte[] empty = "".getBytes();
+ inflater.setInput(empty, 0, 0, false);
+ inflater.setOutput(empty, 0, 0);
+
+ int err = inflater.inflate(JZlib.Z_NO_FLUSH);
+ if(!inflater.istate.inParsingHeader()){
+ return;
+ }
+
+ byte[] b1 = new byte[1];
+ do{
+ int i = in.read(b1);
+ if(i<=0)
+ throw new IOException("no input");
+ inflater.setInput(b1);
+ err = inflater.inflate(JZlib.Z_NO_FLUSH);
+ if(err!=0/*Z_OK*/)
+ throw new IOException(inflater.msg);
+ }
+ while(inflater.istate.inParsingHeader());
+ }
+
+ public Inflater getInflater(){
+ return inflater;
+ }
+} \ No newline at end of file
diff --git a/java/com/jcraft/jzlib/JZlib.java b/java/com/jcraft/jzlib/JZlib.java
index 8fd98ea7..a4bb3410 100644
--- a/java/com/jcraft/jzlib/JZlib.java
+++ b/java/com/jcraft/jzlib/JZlib.java
@@ -41,6 +41,15 @@ final public class JZlib{
static final public int MAX_WBITS=15; // 32K LZ77 window
static final public int DEF_WBITS=MAX_WBITS;
+ public enum WrapperType {
+ NONE, ZLIB, GZIP, ANY
+ }
+
+ public static final WrapperType W_NONE = WrapperType.NONE;
+ public static final WrapperType W_ZLIB = WrapperType.ZLIB;
+ public static final WrapperType W_GZIP = WrapperType.GZIP;
+ public static final WrapperType W_ANY = WrapperType.ANY;
+
// compression levels
static final public int Z_NO_COMPRESSION=0;
static final public int Z_BEST_SPEED=1;
diff --git a/java/com/jcraft/jzlib/Tree.java b/java/com/jcraft/jzlib/Tree.java
index 40b6ba87..38cb40f2 100644
--- a/java/com/jcraft/jzlib/Tree.java
+++ b/java/com/jcraft/jzlib/Tree.java
@@ -308,7 +308,7 @@ final class Tree{
gen_bitlen(s);
// The field len is now set, we can generate the bit codes
- gen_codes(tree, max_code, s.bl_count);
+ gen_codes(tree, max_code, s.bl_count, s.next_code);
}
// Generate the codes for a given tree and bit counts (which need not be
@@ -317,11 +317,11 @@ final class Tree{
// 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.
- static short[] next_code=new short[MAX_BITS+1]; // next code value for each bit length
- synchronized static void gen_codes(short[] tree, // the tree to decorate
- int max_code, // largest code with non zero frequency
- short[] bl_count // number of codes at each bit length
- ){
+ private final static void gen_codes(
+ short[] tree, // the tree to decorate
+ int max_code, // largest code with non zero frequency
+ short[] bl_count, // number of codes at each bit length
+ short[] next_code){
short code = 0; // running code value
int bits; // bit index
int n; // code index
@@ -350,7 +350,8 @@ final class Tree{
// Reverse the first len bits of a code, using straightforward code (a faster
// method would use a table)
// IN assertion: 1 <= len <= 15
- static int bi_reverse(int code, // the value to invert
+ private final static int bi_reverse(
+ int code, // the value to invert
int len // its bit length
){
int res = 0;
diff --git a/java/com/jcraft/jzlib/ZInputStream.java b/java/com/jcraft/jzlib/ZInputStream.java
index 0054645e..cbd38e15 100644
--- a/java/com/jcraft/jzlib/ZInputStream.java
+++ b/java/com/jcraft/jzlib/ZInputStream.java
@@ -50,7 +50,7 @@ public class ZInputStream extends FilterInputStream {
}
public ZInputStream(InputStream in, boolean nowrap) throws IOException {
super(in);
- iis = new InflaterInputStream(in);
+ iis = new InflaterInputStream(in, nowrap);
compress=false;
}
diff --git a/java/com/jcraft/jzlib/ZStream.java b/java/com/jcraft/jzlib/ZStream.java
index dd0a5256..0afa4fd0 100644
--- a/java/com/jcraft/jzlib/ZStream.java
+++ b/java/com/jcraft/jzlib/ZStream.java
@@ -99,7 +99,24 @@ public class ZStream{
public int inflateInit(int w){
return inflateInit(w, false);
}
-
+ public int inflateInit(JZlib.WrapperType wrapperType) {
+ return inflateInit(DEF_WBITS, wrapperType);
+ }
+ public int inflateInit(int w, JZlib.WrapperType wrapperType) {
+ boolean nowrap = false;
+ if(wrapperType == JZlib.W_NONE){
+ nowrap = true;
+ }
+ else if(wrapperType == JZlib.W_GZIP) {
+ w += 16;
+ }
+ else if(wrapperType == JZlib.W_ANY) {
+ w |= Inflate.INFLATE_ANY;
+ }
+ else if(wrapperType == JZlib.W_ZLIB) {
+ }
+ return inflateInit(w, nowrap);
+ }
public int inflateInit(int w, boolean nowrap){
istate=new Inflate(this);
return istate.inflateInit(nowrap?-w:w);
@@ -143,6 +160,23 @@ public class ZStream{
public int deflateInit(int level, int bits){
return deflateInit(level, bits, false);
}
+ public int deflateInit(int level, int bits, int memlevel, JZlib.WrapperType wrapperType){
+ if(bits < 9 || bits > 15){
+ return Z_STREAM_ERROR;
+ }
+ if(wrapperType == JZlib.W_NONE) {
+ bits *= -1;
+ }
+ else if(wrapperType == JZlib.W_GZIP) {
+ bits += 16;
+ }
+ else if(wrapperType == JZlib.W_ANY) {
+ return Z_STREAM_ERROR;
+ }
+ else if(wrapperType == JZlib.W_ZLIB) {
+ }
+ return this.deflateInit(level, bits, memlevel);
+ }
public int deflateInit(int level, int bits, int memlevel){
dstate=new Deflate(this);
return dstate.deflateInit(level, bits, memlevel);
diff --git a/java/com/jcraft/jzlib/ZStreamException.java b/java/com/jcraft/jzlib/ZStreamException.java
index 308bb8a1..424b74b7 100644
--- a/java/com/jcraft/jzlib/ZStreamException.java
+++ b/java/com/jcraft/jzlib/ZStreamException.java
@@ -1,44 +1,44 @@
-/* -*-mode:java; c-basic-offset:2; -*- */
-/*
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. 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.
-
- 3. The names of the authors may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT,
-INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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.
- */
-/*
- * This program is based on zlib-1.1.3, so all credit should go authors
- * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
- * and contributors of zlib.
- */
-
-package com.jcraft.jzlib;
-
-public class ZStreamException extends java.io.IOException {
- public ZStreamException() {
- super();
- }
- public ZStreamException(String s) {
- super(s);
- }
-}
+/* -*-mode:java; c-basic-offset:2; -*- */
+/*
+Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. 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.
+
+ 3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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.
+ */
+/*
+ * This program is based on zlib-1.1.3, so all credit should go authors
+ * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
+ * and contributors of zlib.
+ */
+
+package com.jcraft.jzlib;
+
+public class ZStreamException extends java.io.IOException {
+ public ZStreamException() {
+ super();
+ }
+ public ZStreamException(String s) {
+ super(s);
+ }
+}