[kaffe] CVS kaffe (dalibor): Merged in java/util/zip/InflaterInputStream from GNU Classpath

Kaffe CVS cvs-commits at kaffe.org
Sun Sep 28 19:19:02 PDT 2003


PatchSet 4077 
Date: 2003/09/29 02:16:47
Author: dalibor
Branch: HEAD
Tag: (none) 
Log:
Merged in java/util/zip/InflaterInputStream from GNU Classpath

Members: 
	ChangeLog:1.1672->1.1673 
	libraries/javalib/java/util/zip/InflaterInputStream.java:1.5->1.6 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1672 kaffe/ChangeLog:1.1673
--- kaffe/ChangeLog:1.1672	Mon Sep 29 01:47:45 2003
+++ kaffe/ChangeLog	Mon Sep 29 02:16:47 2003
@@ -1,5 +1,10 @@
 2003-09-29  Dalibor Topic <robilad at kaffe.org>
 
+	* libraries/javalib/java/util/zip/InflaterInputStream.java:
+	Replaced by implementation from GNU Classpath.
+
+2003-09-29  Dalibor Topic <robilad at kaffe.org>
+
 	* libraries/javalib/java/util/zip/CheckedInputStream.java,
 	libraries/javalib/java/util/zip/CheckedOutputStream.java:
 	Replaced by implementation from GNU Classpath.
Index: kaffe/libraries/javalib/java/util/zip/InflaterInputStream.java
diff -u kaffe/libraries/javalib/java/util/zip/InflaterInputStream.java:1.5 kaffe/libraries/javalib/java/util/zip/InflaterInputStream.java:1.6
--- kaffe/libraries/javalib/java/util/zip/InflaterInputStream.java:1.5	Fri Aug 16 18:04:31 2002
+++ kaffe/libraries/javalib/java/util/zip/InflaterInputStream.java	Mon Sep 29 02:16:49 2003
@@ -1,108 +1,237 @@
+/* java.util.zip.InflaterInputStream
+   Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
 package java.util.zip;
 
 import java.io.FilterInputStream;
-import java.io.IOException;
 import java.io.InputStream;
+import java.io.IOException;
 
-/*
- * Java core library component.
+/**
+ * This filter stream is used to decompress data compressed in the "deflate"
+ * format. The "deflate" format is described in RFC 1951.
  *
- * Copyright (c) 1997, 1998
- *      Transvirtual Technologies, Inc.  All rights reserved.
+ * This stream may form the basis for other decompression filters, such
+ * as the <code>GZIPInputStream</code>.
  *
- * See the file "license.terms" for information on usage and redistribution
- * of this file.
+ * @author John Leuner
+ * @since 1.1
  */
-public class InflaterInputStream
-  extends FilterInputStream
+public class InflaterInputStream extends FilterInputStream
 {
-	final private static int DEFAULT = 512;
-	protected Inflater inf;
-	protected byte[] buf;
-	protected int len;
-
-public InflaterInputStream(InputStream in) {
-	this(in, new Inflater(), DEFAULT);
-}
-
-public InflaterInputStream(InputStream in, Inflater inf) {
-	this(in, inf, DEFAULT);
-}
-
-public InflaterInputStream(InputStream in, Inflater inf, int size) {
-	super(in);
-	if (in == null)
-	  throw new NullPointerException("in");
-	if (inf == null)
-	  throw new NullPointerException("inf");
-	this.inf = inf;
-	if (size < 1)
-	  throw new IllegalArgumentException("size < 1");
-	buf = new byte[size];
-}
-
-protected void fill() throws IOException {
-	len = super.read(buf, 0, buf.length);
-}
-
-public int read() throws IOException {
-	byte[] b = new byte[1];
-	int r = read(b, 0, 1);
-	if (r == -1) {
-		return (-1);
-	}
-	else {
-		return ((int)b[0]);
-	}
-}
-
-public int read(byte b[], int off, int lenx) throws IOException {
-	if (inf.finished()) {
-		return (-1);
-	}
-	if (inf.needsInput()) {
-		fill();
-		if (len == -1) {
-			return (-1);
-		}
-		inf.setInput(buf, 0, len);
-	}
-	try {
-		/* we have to call inflate until
-		 * it is finished or needs more input
-		 */
-		int inflated = 0;
-		do {
-			inflated += inf.inflate(b,
-						off + inflated,
-						lenx - inflated);
-		}
-		while (inflated < lenx && !inf.needsInput() && !inf.finished());
- 
-		/* recurse if only 0 bytes were inflated */
-		if (inflated == 0 && lenx != 0) {
-		    return read(b, off, lenx);
-		}
-
-		return inflated;
-	}
-	catch (DataFormatException _) {
-		throw new IOException("bad data format");
-	}
-}
-
-public long skip(long n) throws IOException {
-	// This is a terribly inefficient way to skip ...
-	long cnt;
-	byte[] b = new byte[1];
-
-	for (cnt = 0; cnt < n; cnt++) {
-		int r = read(b, 0, 1);
-		if (r == -1) {
-			break;
-		}
-	}
-	return (cnt);
-}
-
+  /**
+   * Decompressor for this filter 
+   */
+  protected Inflater inf;
+
+  /**
+   * Byte array used as a buffer 
+   */
+  protected byte[] buf;
+
+  /**
+   * Size of buffer   
+   */
+  protected int len;
+
+
+  /*
+   * We just use this if we are decoding one byte at a time with the read() call
+   */
+  private byte[] onebytebuffer = new byte[1];
+
+  /**
+   * Create an InflaterInputStream with the default decompresseor
+   * and a default buffer size.
+   *
+   * @param in the InputStream to read bytes from
+   */
+  public InflaterInputStream(InputStream in) 
+  {
+    this(in, new Inflater(), 4096);
+  }
+
+  /**
+   * Create an InflaterInputStream with the specified decompresseor
+   * and a default buffer size.
+   *
+   * @param in the InputStream to read bytes from
+   * @param inf the decompressor used to decompress data read from in
+   */
+  public InflaterInputStream(InputStream in, Inflater inf) 
+  {
+    this(in, inf, 4096);
+  }
+
+  /**
+   * Create an InflaterInputStream with the specified decompresseor
+   * and a specified buffer size.
+   *
+   * @param in the InputStream to read bytes from
+   * @param inf the decompressor used to decompress data read from in
+   * @param size size of the buffer to use
+   */
+  public InflaterInputStream(InputStream in, Inflater inf, int size) 
+  {
+    super(in);
+    this.inf = inf;
+    this.len = 0;
+    
+    if (size <= 0)
+      throw new IllegalArgumentException("size <= 0");
+    buf = new byte[size]; //Create the buffer
+
+    if (in == null)
+      throw new NullPointerException("InputStream null");
+    if (inf == null)
+      throw new NullPointerException("Inflater null");
+  }
+
+  /**
+   * Returns 0 once the end of the stream (EOF) has been reached.
+   * Otherwise returns 1.
+   */
+  public int available() throws IOException
+  {
+    return inf.finished() ? 0 : 1;
+  }
+
+  /**
+   * Closes the input stream
+   */
+  public synchronized void close() throws IOException
+  {
+    if (in != null)
+      in.close();
+    in = null;
+  }
+
+  /**
+   * Fills the buffer with more data to decompress.
+   */
+  protected void fill() throws IOException
+  {
+    if (in == null)
+      throw new ZipException ("InflaterInputStream is closed");
+    
+    len = in.read(buf, 0, buf.length);
+
+    if (len < 0)
+      throw new ZipException("Deflated stream ends early.");
+    
+    inf.setInput(buf, 0, len);
+  }
+
+  /**
+   * Reads one byte of decompressed data.
+   *
+   * The byte is in the lower 8 bits of the int.
+   */
+  public int read() throws IOException
+  { 
+    int nread = read(onebytebuffer, 0, 1); //read one byte
+    
+    if (nread > 0)
+      return onebytebuffer[0] & 0xff;
+    
+    return -1;
+  }
+
+  /**
+   * Decompresses data into the byte array
+   *
+   * @param b the array to read and decompress data into
+   * @param off the offset indicating where the data should be placed
+   * @param len the number of bytes to decompress
+   */
+  public int read(byte[] b, int off, int len) throws IOException
+  {
+    if (len == 0) return 0;
+
+    for (;;)
+      {
+	int count;
+	try
+	  {
+	    count = inf.inflate(b, off, len);
+	  } 
+	catch (DataFormatException dfe) 
+	  {
+	    throw new ZipException(dfe.getMessage());
+	  }
+
+	if (count > 0)
+	  return count;
+	
+	if (inf.needsDictionary()
+	    | inf.finished())
+	  return -1;
+	else if (inf.needsInput())
+	  fill();
+	else
+	  throw new InternalError("Don't know what to do");
+      }
+  }
+
+  /**
+   * Skip specified number of bytes of uncompressed data
+   *
+   * @param n number of bytes to skip
+   */
+  public long skip(long n) throws IOException
+  {
+    if (n < 0)
+      throw new IllegalArgumentException();
+    int len = 2048;
+    if (n < len)
+      len = (int) n;
+    byte[] tmp = new byte[len];
+    return (long) read(tmp);
+  }
+
+  /**
+   * Since this stream tends to buffer large (unpredictable?) amounts
+   * of stuff, it causes problems to the mark/reset mechanism.  Hence,
+   * it claims not to support mark.
+   *
+   * @return false
+   */
+  public boolean markSupported()
+  {
+    return false;
+  }
 }




More information about the kaffe mailing list