[kaffe] CVS kaffe (guilhem): Imported java.io from GNU Classpath (except encoding) + fixes

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Sun Nov 2 05:32:02 2003


PatchSet 4148 
Date: 2003/11/02 13:29:34
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Imported java.io from GNU Classpath (except encoding) + fixes

This checkin has also a small fix concerning java.util.zip against the
new implementation of FilterOutputStream.

Members: 
	ChangeLog:1.1740->1.1741 
	libraries/clib/zip/Deflater.c:1.11->1.12 
	libraries/javalib/java/io/BufferedInputStream.java:1.11->1.12 
	libraries/javalib/java/io/BufferedOutputStream.java:1.7->1.8 
	libraries/javalib/java/io/BufferedReader.java:1.11->1.12 
	libraries/javalib/java/io/BufferedWriter.java:1.6->1.7 
	libraries/javalib/java/io/CharArrayReader.java:1.5->1.6 
	libraries/javalib/java/io/CharArrayWriter.java:1.7->1.8 
	libraries/javalib/java/io/DataInput.java:1.5->1.6 
	libraries/javalib/java/io/DataInputStream.java:1.18->1.19 
	libraries/javalib/java/io/DataOutput.java:1.5->1.6 
	libraries/javalib/java/io/DataOutputStream.java:1.8->1.9 
	libraries/javalib/java/io/FileFilter.java:1.2->1.3 
	libraries/javalib/java/io/FilenameFilter.java:1.4->1.5 
	libraries/javalib/java/io/FilterInputStream.java:1.9->1.10 
	libraries/javalib/java/io/FilterOutputStream.java:1.1->1.2 
	libraries/javalib/java/io/FilterReader.java:1.2->1.3 
	libraries/javalib/java/io/FilterWriter.java:1.4->1.5 
	libraries/javalib/java/io/InterruptedIOException.java:1.5->1.6 
	libraries/javalib/java/io/InvalidClassException.java:1.8->1.9 
	libraries/javalib/java/io/LineNumberInputStream.java:1.4->1.5 
	libraries/javalib/java/io/LineNumberReader.java:1.4->1.5 
	libraries/javalib/java/io/OptionalDataException.java:1.5->1.6 
	libraries/javalib/java/io/PrintStream.java:1.14->1.15 
	libraries/javalib/java/io/PrintWriter.java:1.6->1.7 
	libraries/javalib/java/io/PushbackInputStream.java:1.5->1.6 
	libraries/javalib/java/io/PushbackReader.java:1.2->1.3 
	libraries/javalib/java/io/Reader.java:1.7->1.8 
	libraries/javalib/java/io/SequenceInputStream.java:1.4->1.5 
	libraries/javalib/java/io/StreamTokenizer.java:1.21->1.22 
	libraries/javalib/java/io/WriteAbortedException.java:1.4->1.5 
	libraries/javalib/java/io/Writer.java:1.6->1.7 
	libraries/javalib/java/net/DatagramSocket.java:1.17->1.18 
	libraries/javalib/java/util/zip/DeflaterOutputStream.java:1.6->1.7 
	libraries/javalib/java/util/zip/ZipOutputStream.java:1.14->1.15 
	test/regression/BufferedReaderTest.java:1.2->1.3 
	test/regression/CharArrayReaderTest.java:1.2->1.3 
	test/regression/InputStreamTest.java:1.1->1.2 
	test/regression/LineNumberReaderTest.java:1.2->1.3 
	test/regression/ReaderTest.java:1.1->1.2 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1740 kaffe/ChangeLog:1.1741
--- kaffe/ChangeLog:1.1740	Fri Oct 31 20:46:56 2003
+++ kaffe/ChangeLog	Sun Nov  2 13:29:34 2003
@@ -1,3 +1,56 @@
+2003-11-02  Guilhem Lavaux <guilhem@kaffe.org>
+
+	* libraries/javalib/java/io/BufferedInputStream.java,
+	libraries/javalib/java/io/BufferedOutputStream.java,
+	libraries/javalib/java/io/BufferedReader.java, 
+	libraries/javalib/java/io/BufferedWriter.java,
+	libraries/javalib/java/io/CharArrayReader.java,
+	libraries/javalib/java/io/CharArrayWriter.java,
+	libraries/javalib/java/io/DataInput.java,
+	libraries/javalib/java/io/DataInputStream.java,
+	libraries/javalib/java/io/DataOutput.java,
+	libraries/javalib/java/io/DataOutputStream.java,
+	libraries/javalib/java/io/FileFilter.java,
+	libraries/javalib/java/io/FilenameFilter.java,
+	libraries/javalib/java/io/FilterInputStream.java,
+	libraries/javalib/java/io/FilterOutputStream.java,
+	libraries/javalib/java/io/FilterReader.java,
+	libraries/javalib/java/io/FilterWriter.java,
+	libraries/javalib/java/io/InterruptedIOException.java,
+	libraries/javalib/java/io/InvalidClassException.java,
+	libraries/javalib/java/io/LineNumberInputStream.java,
+	libraries/javalib/java/io/LineNumberReader.java,
+	libraries/javalib/java/io/OptionalDataException.java,
+	libraries/javalib/java/io/PrintStream.java,
+	libraries/javalib/java/io/PrintWriter.java,
+	libraries/javalib/java/io/PushbackInputStream.java,
+	libraries/javalib/java/io/PushbackReader.java,
+	libraries/javalib/java/io/Reader.java,
+	libraries/javalib/java/io/SequenceInputStream.java,
+	libraries/javalib/java/io/StreamTokenizer.java,
+	libraries/javalib/java/io/WriteAbortedException.java,
+	libraries/javalib/java/io/Writer.java:
+
+	Imported classes from GNU Classpath. These classes have
+	been fixed to pass Kaffe's regression tests.
+	
+	* libraries/javalib/java/net/DatagramSocket.java:
+	(bind) When address is null, it should bind to an available
+	port.
+	
+	* libraries/javalib/java/util/zip/ZipOutputStream.java:
+	(deflate) Don't call super.write because it may cause
+	an infinite loop with the new classpath's implementation.
+	
+	* test/regression/BufferedReaderTest.java,
+	test/regression/CharArrayReaderTest.java,
+	test/regression/InputStreamTest.java,
+	test/regression/LineNumberReaderTest.java,
+	test/regression/ReaderTest.java:
+
+	Adapted the output of the classes (Exceptions precise
+	output) to match the current implementation.
+	
 2003-10-31  Helmer Kraemer <hkraemer@freenet.de>
 	    Dalibor Topic <robilad@kaffe.org>
 
Index: kaffe/libraries/clib/zip/Deflater.c
diff -u kaffe/libraries/clib/zip/Deflater.c:1.11 kaffe/libraries/clib/zip/Deflater.c:1.12
--- kaffe/libraries/clib/zip/Deflater.c:1.11	Mon Jun 19 11:46:46 2000
+++ kaffe/libraries/clib/zip/Deflater.c	Sun Nov  2 13:29:36 2003
@@ -8,8 +8,6 @@
  * of this file. 
  */
 
-#define	DBG(s)
-
 #include "config.h"
 #include "config-std.h"
 #include "config-mem.h"
@@ -58,7 +56,7 @@
 
 	r = deflate(dstream, unhand(this)->finish ? Z_FINISH : Z_NO_FLUSH);
 
-DBG(	dprintf("Deflate: in %d left %d out %d status %d\n", ilen, dstream->avail_in, len - dstream->avail_out, r);	)
+DBG(NATIVELIB,	dprintf("Deflate: in %d left %d out %d status %d\n", ilen, dstream->avail_in, len - dstream->avail_out, r);	)
 
 	switch (r) {
 	case Z_OK:
Index: kaffe/libraries/javalib/java/io/BufferedInputStream.java
diff -u kaffe/libraries/javalib/java/io/BufferedInputStream.java:1.11 kaffe/libraries/javalib/java/io/BufferedInputStream.java:1.12
--- kaffe/libraries/javalib/java/io/BufferedInputStream.java:1.11	Sat Jun  7 17:05:39 2003
+++ kaffe/libraries/javalib/java/io/BufferedInputStream.java	Sun Nov  2 13:29:36 2003
@@ -1,210 +1,360 @@
-/*
- * Java core library component.
- *
- * Copyright (c) 1997, 1998
- *      Transvirtual Technologies, Inc.  All rights reserved.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file.
- */
+/* BufferedInputStream.java -- An input stream that implements buffering
+   Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
 
-package java.io;
+This file is part of GNU Classpath.
 
-public class BufferedInputStream extends FilterInputStream
-{
-	protected byte[] buf;
-	protected int count;
-	protected int pos;
-	protected int markpos;
-	protected int marklimit;
-	private final byte[] single = new byte[1];
-	private static final int DEFAULTBUFFER = 2048;
+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. */
 
-/*
- * Invariant:
- *
- *   markpos <= pos <= count <= buf.length >= marklimit
- */
+ 
+package java.io;
 
-public BufferedInputStream(InputStream in) {
-	this(in, DEFAULTBUFFER);
-}
-
-public BufferedInputStream(InputStream in, int size) {
-	super(in);
-
-	if (size <= 0) {
-		throw new IllegalArgumentException("Buffer size <= 0");
-	}
-
-	buf = new byte[size];
-	marklimit = size;
-	markpos = -1;
-}
-
-public synchronized int available() throws IOException {
-	checkIfStillOpen();
-	return (count - pos) + in.available();
-}
-
-private void checkIfStillOpen() throws IOException {
-	if (in == null) {
-		throw new IOException("stream closed");
-	}
-}
-
-public synchronized void mark(int marklimit) {
-	if (marklimit > buf.length - pos) {		// not enough room
-		byte[] newbuf;
-
-		if (marklimit <= buf.length) {
-			newbuf = buf;			// just shift buffer
-		} else {
-			newbuf = new byte[marklimit];	// need a new buffer
-		}
-		System.arraycopy(buf, pos, newbuf, 0, count - pos);
-		buf = newbuf;
-		count -= pos;
-		pos = markpos = 0;
-	} else {
-		markpos = pos;
-	}
-	this.marklimit = marklimit;
-}
-
-public boolean markSupported() {
-	return true;
-}
-
-public synchronized int read() throws IOException {
-	if (_read(single, 0, 1) == -1) {
-		return (-1);
-	}
-	else {
-		return (single[0] & 0xFF);
-	}
-}
-
-public synchronized int read(byte b[], int off, int len) throws IOException {
-	return _read(b, off, len);
-}
-
-private int _read(byte b[], int off, int len) throws IOException {
-	if (off < 0 || len < 0 || off + len > b.length) {
-	   throw new IndexOutOfBoundsException();
-	}
-
-	checkIfStillOpen();
-
-	/* Common case short-cut */
-	if (len == 1 && pos < count) {
-		b[off] = buf[pos++];
-		return (1);
-	}
-
-	int total = 0;
-
-	do {
-		// If buffer fully consumed, invalidate mark & reset buffer
-		if (pos == buf.length) {
-			pos = count = 0;
-			markpos = -1;
-		}
-
-		// Buffer empty?
-		int nread;
-		if (pos == count) {
-
-			// If the amount requested is more than the size
-			// of the buffer, we might as well optimize with
-			// a direct read to avoid needless copying of data.
-			if (len >= buf.length) {
-				if ((nread = super.read(b, off, len)) == -1) {
-					return (total > 0) ? total : -1;
-				}
-				return total + nread;
-			}
-
-			// Read another buffer's worth of data
-			if (!fillBuffer()) {
-				return (total > 0) ? total : -1;
-			}
-		}
-
-		// Copy the next chunk of bytes from our buffer
-		nread = Math.min(count - pos, len);
-		System.arraycopy(buf, pos, b, off, nread);
-		total += nread;
-		pos += nread;
-		off += nread;
-		len -= nread;
-	} while (len > 0 && available() > 0);
-
-	return total;
-}
-
-public synchronized void reset() throws IOException {
-	checkIfStillOpen();
-
-	if (markpos == -1) {
-		throw new IOException(
-		    "Attempt to reset when no mark is valid"
-			+ " (marklimit=" + marklimit + ")");
-	}
-	pos = markpos;
-}
-
-/*
- * This version of skip() does not invalidate a mark if less
- * than marklimit total bytes are read and/or skipped.
- * Not sure if this is actually a requirement or not.
+/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
+ * "The Java Language Specification", ISBN 0-201-63451-1
+ * plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
+ * Status:  Believed complete and correct.
  */
-public synchronized long skip(long n) throws IOException {
-
-	checkIfStillOpen();
-
-	// Sanity check
-	if (n <= 0) {
-		return 0;
-	}
-
-	// Skip buffered data if there is any
-	if (pos < count) {
-		if (count - pos > n) {
-			pos += (int)n;		// narrowing cast OK
-		} else {
-			n = count - pos;
-			pos = count;
-		}
-		return n;
-	}
-
-	// If buffer fully consumed, invalidate mark & reset buffer
-	if (pos == buf.length) {
-		pos = count = 0;
-		markpos = -1;
-		return super.skip(n);
-	}
-
-	// Read data into buffer and try again
-	return fillBuffer() ? skip(n) : 0;
-}
-
-/*
- * Get more buffered data. This should only be called when:
+ 
+/**
+ * This subclass of <code>FilterInputStream</code> buffers input from an 
+ * underlying implementation to provide a possibly more efficient read
+ * mechanism.  It maintains the buffer and buffer state in instance 
+ * variables that are available to subclasses.  The default buffer size
+ * of 2048 bytes can be overridden by the creator of the stream.
+ * <p>
+ * This class also implements mark/reset functionality.  It is capable
+ * of remembering any number of input bytes, to the limits of
+ * system memory or the size of <code>Integer.MAX_VALUE</code>
+ * <p>
+ * Please note that this class does not properly handle character
+ * encodings.  Consider using the <code>BufferedReader</code> class which
+ * does.
  *
- *	1 pos == count
- *	2 count < buf.length
- *
- * Returns true if at least one byte was read.
+ * @author Aaron M. Renn (arenn@urbanophile.com)
+ * @author Warren Levy <warrenl@cygnus.com>
  */
-private boolean fillBuffer() throws IOException {
-	int nread;
+public class BufferedInputStream extends FilterInputStream
+{
 
-	if ((nread = super.read(buf, pos, buf.length - pos)) <= 0) {
-		return false;
-	}
-	count += nread;
-	return true;
-}
+  /**
+   * This is the default buffer size
+   */
+  private static final int DEFAULT_BUFFER_SIZE = 2048;
+
+  /**
+   * The buffer used for storing data from the underlying stream.
+   */
+  protected byte[] buf;
+
+  /**
+   * The number of valid bytes currently in the buffer.  It is also the index
+   * of the buffer position one byte past the end of the valid data.
+   */
+  protected int count = 0;
+
+  /**
+   * The index of the next character that will by read from the buffer.
+   * When <code>pos == count</code>, the buffer is empty.
+   */
+  protected int pos = 0;
+
+  /**
+   * The value of <code>pos</code> when the <code>mark()</code> method was
+   * called.  
+   * This is set to -1 if there is no mark set.
+   */
+  protected int markpos = -1;
+
+  /**
+   * This is the maximum number of bytes than can be read after a 
+   * call to <code>mark()</code> before the mark can be discarded.
+   * After this may bytes are read, the <code>reset()</code> method
+   * may not be called successfully.
+   */
+  protected int marklimit = 0;
+
+  /**
+   * This method initializes a new <code>BufferedInputStream</code> that will
+   * read from the specified subordinate stream with a default buffer size
+   * of 2048 bytes
+   *
+   * @param in The subordinate stream to read from
+   */
+  public BufferedInputStream(InputStream in)
+  {
+    this(in, DEFAULT_BUFFER_SIZE);
+  }
+
+  /**
+   * This method initializes a new <code>BufferedInputStream</code> that will
+   * read from the specified subordinate stream with a buffer size that
+   * is specified by the caller.
+   *
+   * @param in The subordinate stream to read from
+   * @param size The buffer size to use
+   *
+   * @exception IllegalArgumentException when size is smaller then 1
+   */
+  public BufferedInputStream(InputStream in, int size)
+  {
+    super(in);
+    if (size <= 0)
+      throw new IllegalArgumentException();
+    buf = new byte[size];
+  }
+
+  /**
+   * This method returns the number of bytes that can be read from this
+   * stream before a read can block.  A return of 0 indicates that blocking
+   * might (or might not) occur on the very next read attempt.
+   * <p>
+   * The number of available bytes will be the number of read ahead bytes 
+   * stored in the internal buffer plus the number of available bytes in
+   * the underlying stream.
+   *
+   * @return The number of bytes that can be read before blocking could occur
+   *
+   * @exception IOException If an error occurs
+   */
+  public synchronized int available() throws IOException
+  {
+    return count - pos + super.available();
+  }
+
+  /**
+   * This method closes the underlying input stream and frees any
+   * resources associated with it. Sets <code>buf</code> to <code>null</code>.
+   *
+   * @exception IOException If an error occurs.
+   */
+  public void close() throws IOException
+  {
+    // Free up the array memory.
+    buf = null;
+    super.close();
+  }
+
+  /**
+   * This method marks a position in the input to which the stream can be
+   * "reset" by calling the <code>reset()</code> method.  The parameter
+   * <code>readlimit</code> is the number of bytes that can be read from the 
+   * stream after setting the mark before the mark becomes invalid.  For
+   * example, if <code>mark()</code> is called with a read limit of 10, then
+   * when 11 bytes of data are read from the stream before the
+   * <code>reset()</code> method is called, then the mark is invalid and the
+   * stream object instance is not required to remember the mark.
+   * <p>
+   * Note that the number of bytes that can be remembered by this method
+   * can be greater than the size of the internal read buffer.  It is also
+   * not dependent on the subordinate stream supporting mark/reset
+   * functionality.
+   *
+   * @param readlimit The number of bytes that can be read before the mark
+   * becomes invalid
+   */
+  public synchronized void mark(int readlimit)
+  {
+    marklimit = readlimit;
+    markpos = pos;
+  }
+
+  /**
+   * This method returns <code>true</code> to indicate that this class
+   * supports mark/reset functionality.
+   *
+   * @return <code>true</code> to indicate that mark/reset functionality is
+   * supported
+   *
+   */
+  public boolean markSupported()
+  {
+    return true;
+  }
+
+  /**
+   * This method reads an unsigned byte from the input stream and returns it
+   * as an int in the range of 0-255.  This method also will return -1 if
+   * the end of the stream has been reached.
+   * <p>
+   * This method will block until the byte can be read.
+   *
+   * @return The byte read or -1 if end of stream
+   *
+   * @exception IOException If an error occurs
+   */
+  public synchronized int read() throws IOException
+  {
+    if (pos >= count && !refill())
+      return -1;	// EOF
+
+    if (markpos >= 0 && pos - markpos > marklimit)
+      markpos = -1;
+
+    return ((int) buf[pos++]) & 0xFF;
+  }
+
+  /**
+   * This method reads bytes from a stream and stores them into a caller
+   * supplied buffer.  It starts storing the data at index <code>off</code>
+   * into the buffer and attempts to read <code>len</code> bytes.  This method
+   * can return before reading the number of bytes requested.  The actual
+   * number of bytes read is returned as an int.  A -1 is returned to indicate
+   * the end of the stream.
+   * <p>
+   * This method will block until some data can be read.
+   *
+   * @param b The array into which the bytes read should be stored
+   * @param off The offset into the array to start storing bytes
+   * @param len The requested number of bytes to read
+   *
+   * @return The actual number of bytes read, or -1 if end of stream.
+   *
+   * @exception IOException If an error occurs.
+   * @exception IndexOutOfBoundsException when <code>off</code> or
+   *            <code>len</code> are negative, or when <code>off + len</code>
+   *            is larger then the size of <code>b</code>,
+   */
+  public synchronized int read(byte[] b, int off, int len) throws IOException
+  {
+    if (off < 0 || len < 0 || off + len > b.length)
+      throw new IndexOutOfBoundsException();
+
+    if (pos >= count && !refill())
+      return -1;		// No bytes were read before EOF.
+
+    int remain = Math.min(count - pos, len);
+    System.arraycopy(buf, pos, b, off, remain);
+    pos += remain;
+
+    if (markpos >= 0 && pos - markpos > marklimit)
+      markpos = -1;
+
+    return remain;
+  }
+
+  /**
+   * This method resets a stream to the point where the <code>mark()</code>
+   * method was called.  Any bytes that were read after the mark point was
+   * set will be re-read during subsequent reads.
+   * <p>
+   * This method will throw an IOException if the number of bytes read from
+   * the stream since the call to <code>mark()</code> exceeds the mark limit
+   * passed when establishing the mark.
+   *
+   * @exception IOException If <code>mark()</code> was never called or more
+   *            then <code>markLimit</code> bytes were read since the last
+   *            call to <code>mark()</code>
+   */
+  public synchronized void reset() throws IOException
+  {
+    if (markpos < 0)
+      throw new IOException();
+
+    pos = markpos;
+  }
+
+  /**
+   * This method skips the specified number of bytes in the stream.  It
+   * returns the actual number of bytes skipped, which may be less than the
+   * requested amount.
+   *
+   * @param n The requested number of bytes to skip
+   *
+   * @return The actual number of bytes skipped.
+   *
+   * @exception IOException If an error occurs
+   */
+  public synchronized long skip(long n) throws IOException
+  {
+    final long origN = n;
+
+    while (n > 0L)
+      {
+	if (pos >= count && !refill())
+	  if (n < origN)
+	    break;
+	  else
+	    return -1;	// No bytes were read before EOF.
+
+	int numread = (int) Math.min((long) (count - pos), n);
+	pos += numread;
+	n -= numread;
+
+        if (markpos >= 0 && pos - markpos > marklimit)
+          markpos = -1;
+      }
+
+    return origN - n;
+  }
+
+  /**
+   * Called to refill the buffer (when count is equal or greater the pos).
+   * Package local so BufferedReader can call it when needed.
+   *
+   * @return <code>true</code> when <code>buf</code> can be (partly) refilled,
+   *         <code>false</code> otherwise.
+   */
+  boolean refill() throws IOException
+  {
+    if (markpos < 0)
+      count = pos = 0;
+    else if (markpos > 0)
+      {
+        // Shift the marked bytes (if any) to the beginning of the array
+	// but don't grow it.  This saves space in case a reset is done
+	// before we reach the max capacity of this array.
+        System.arraycopy(buf, markpos, buf, 0, count - markpos);
+	count -= markpos;
+	pos -= markpos;
+	markpos = 0;
+      }
+    else if (marklimit >= buf.length)	// BTW, markpos == 0
+      {
+	// Need to grow the buffer now to have room for marklimit bytes.
+	// Note that the new buffer is one greater than marklimit.
+	// This is so that there will be one byte past marklimit to be read
+	// before having to call refill again, thus allowing marklimit to be
+	// invalidated.  That way refill doesn't have to check marklimit.
+	byte[] newbuf = new byte[marklimit + 1];
+	System.arraycopy(buf, 0, newbuf, 0, count);
+	buf = newbuf;
+      }
+
+    int numread = super.read(buf, count, buf.length - count);
+
+    if (numread < 0)	// EOF
+      return false;
+
+    count += numread;
+    return true;
+  }
 }
Index: kaffe/libraries/javalib/java/io/BufferedOutputStream.java
diff -u kaffe/libraries/javalib/java/io/BufferedOutputStream.java:1.7 kaffe/libraries/javalib/java/io/BufferedOutputStream.java:1.8
--- kaffe/libraries/javalib/java/io/BufferedOutputStream.java:1.7	Tue Sep  3 19:53:47 2002
+++ kaffe/libraries/javalib/java/io/BufferedOutputStream.java	Sun Nov  2 13:29:36 2003
@@ -1,97 +1,192 @@
-package java.io;
+/* BufferedOutputStream.java -- Buffer output into large blocks before writing
+   Copyright (C) 1998, 2000, 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. */
 
-/*
- * Java core library component.
- *
- * Copyright (c) 1997, 1998
- *      Transvirtual Technologies, Inc.  All rights reserved.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file.
- */
 
+package java.io;
+
+/**
+  * This class accumulates bytes written in a buffer instead of immediately
+  * writing the data to the underlying output sink. The bytes are instead
+  * as one large block when the buffer is filled, or when the stream is
+  * closed or explicitly flushed. This mode operation can provide a more
+  * efficient mechanism for writing versus doing numerous small unbuffered
+  * writes.
+  *
+  * @author Aaron M. Renn (arenn@urbanophile.com)
+  */
 public class BufferedOutputStream extends FilterOutputStream
 {
-	private static final int DEFAULTBUFFER = 2048;
-	protected byte[] buf;
-	protected int count;
-
-public BufferedOutputStream(OutputStream out) {
-	this(out, DEFAULTBUFFER);
-}
-
-public BufferedOutputStream(OutputStream out, int size) {
-	super(out);
-
-	if (size <= 0) {
-	        throw new IllegalArgumentException("Buffer size <= 0");
-	}
-
-	buf = new byte[size];
-	count = 0;
-}
-
-public synchronized void flush() throws IOException {
-	if (count > 0) {
-		try
-		{
-			out.write(buf, 0, count);
-			count = 0;
-		}
-		catch(InterruptedIOException e)
-		{
-			count -= e.bytesTransferred;
-			throw e;
-		}
-	}
-	out.flush();
-}
-
-public synchronized void write(byte b[], int off, int len) throws IOException {
-	if (off < 0 || len < 0 || off + len > b.length) {
-	   throw new IndexOutOfBoundsException();
-	}
-
-	// If no write will be necessary, just copy the new data to the buffer
-	if (count + len <= buf.length) {
-	    System.arraycopy(b, off, buf, count, len);
-	    count += len;
-	    return;
-	}
-
-	// Otherwise, first write out any old buffered data
-	if (count > 0) {
-		try
-		{
-			out.write(buf, 0, count);
-			count = 0;
-		}
-		catch(InterruptedIOException e)
-		{
-			count -= e.bytesTransferred;
-			throw e;
-		}
-	}
-
-	// Then write out the new data directly, without copying
-	out.write(b, off, len);
-}
-
-public synchronized void write(int b) throws IOException {
-	if (count == buf.length) {
-		try
-		{
-			out.write(buf, 0, buf.length);
-			count = 0;
-		}
-		catch(InterruptedIOException e)
-		{
-			count -= e.bytesTransferred;
-			throw e;
-		}
-	}
-	buf[count++] = (byte)b;
-}
+  /**
+   * This is the default buffer size
+   */
+  private static final int DEFAULT_BUFFER_SIZE = 512;
+
+  /**
+   * This is the internal byte array used for buffering output before
+   * writing it.
+   */
+  protected byte[] buf;
+
+  /**
+   * This is the number of bytes that are currently in the buffer and
+   * are waiting to be written to the underlying stream.  It always points to
+   * the index into the buffer where the next byte of data will be stored
+   */
+  protected int count;
+
+  /**
+   * This method initializes a new <code>BufferedOutputStream</code> instance
+   * that will write to the specified subordinate <code>OutputStream</code>
+   * and which will use a default buffer size of 512 bytes.
+   *
+   * @param out The underlying <code>OutputStream</code> to write data to
+   */
+  public BufferedOutputStream(OutputStream out)
+  {
+    this(out, DEFAULT_BUFFER_SIZE);
+  }
+
+  /**
+   * This method initializes a new <code>BufferedOutputStream</code> instance
+   * that will write to the specified subordinate <code>OutputStream</code>
+   * and which will use the specified buffer size
+   *
+   * @param out The underlying <code>OutputStream</code> to write data to
+   * @param size The size of the internal buffer
+   */
+  public BufferedOutputStream(OutputStream out, int size)
+  {
+    super(out);
+
+    buf = new byte[size];
+  }
+
+  /**
+   * This method causes any currently buffered bytes to be immediately
+   * written to the underlying output stream.
+   *
+   * @exception IOException If an error occurs
+   */
+  public synchronized void flush() throws IOException
+  {
+    if (count == 0)
+      return;
+
+    out.write(buf, 0, count);
+    count = 0;
+    out.flush();
+  }
+
+  /**
+   * This method flushes any remaining buffered bytes then closes the 
+   * underlying output stream.  Any further attempts to write to this stream
+   * may throw an exception
+   *
+  public synchronized void close() throws IOException
+  {
+    flush();
+    out.close();
+  }
+  */
+
+  /**
+   * This method runs when the object is garbage collected.  It is 
+   * responsible for ensuring that all buffered bytes are written and
+   * for closing the underlying stream.
+   *
+   * @exception IOException If an error occurs (ignored by the Java runtime)
+   *
+  protected void finalize() throws IOException
+  {
+    close();
+  }
+  */
+
+  /**
+   * This method writes a single byte of data.  This will be written to the
+   * buffer instead of the underlying data source.  However, if the buffer
+   * is filled as a result of this write request, it will be flushed to the
+   * underlying output stream.
+   *
+   * @param b The byte of data to be written, passed as an int
+   *
+   * @exception IOException If an error occurs
+   */
+  public synchronized void write(int b) throws IOException
+  {
+    if (count == buf.length)
+      flush();
+
+    buf[count] = (byte)(b & 0xFF);
+    ++count;
+  }
+
+  /**
+   * This method writes <code>len</code> bytes from the byte array 
+   * <code>buf</code> starting at position <code>offset</code> in the buffer. 
+   * These bytes will be written to the internal buffer.  However, if this
+   * write operation fills the buffer, the buffer will be flushed to the
+   * underlying output stream.
+   *
+   * @param buf The array of bytes to write.
+   * @param offset The index into the byte array to start writing from.
+   * @param len The number of bytes to write.
+   *
+   * @exception IOException If an error occurs
+   */
+  public synchronized void write(byte[] buf, int offset, int len) 
+    throws IOException
+  {
+    // Buffer can hold everything.  Note that the case where LEN < 0
+    // is automatically handled by the downstream write.
+    if (len < (this.buf.length - count))
+      {
+        System.arraycopy(buf, offset, this.buf, count, len);
+        count += len;
+      }
+    else
+      {
+        // The write was too big.  So flush the buffer and write the new
+        // bytes directly to the underlying stream, per the JDK 1.2
+        // docs.
+        flush();
+        out.write (buf, offset, len);
+      }
+  }
 
-}
+} // class BufferedOutputStream 
 
Index: kaffe/libraries/javalib/java/io/BufferedReader.java
diff -u kaffe/libraries/javalib/java/io/BufferedReader.java:1.11 kaffe/libraries/javalib/java/io/BufferedReader.java:1.12
--- kaffe/libraries/javalib/java/io/BufferedReader.java:1.11	Fri Jan  4 05:12:22 2002
+++ kaffe/libraries/javalib/java/io/BufferedReader.java	Sun Nov  2 13:29:36 2003
@@ -1,298 +1,571 @@
+/* BufferedReader.java
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 
+     Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.

*** Patch too long, truncated ***