diff -urN kaffe/ChangeLog kaffe-patched/ChangeLog
--- kaffe/ChangeLog	2003-01-09 16:15:42.000000000 +0100
+++ kaffe-patched/ChangeLog	2003-01-09 19:39:17.000000000 +0100
@@ -1,5 +1,35 @@
 2003-01-09 Dalibor Topic <robilad@yahoo.com>
 
+	* README: Added Linux 2.x for PARISC, PS2linux, and changed
+	PPC liux entry to Linux 2.x.
+	
+	* libraries/javalib/java/io/FilterInputStream.java:
+	(buffer) new field. Used by DataInputStream.
+	(BUFFER_EMPTY) new constant.
+	(available, read, skip) use buffered byte if buffer is not empty.
+	
+	* libraries/javalib/java/io/DataInputStream.java:
+	(DataInputStream) don't wrap input stream in a
+	PushbackInputStream. The jakarta BCEL verifier
+	wouldn't run because of it.
+	
+	(readLine) use internal buffer in FilterInputStream to
+	handle '\r\n' detection. Added more comments on the
+	history of failed attempts to fix this method.
+	
+2003-01-09 Jukka Santala <jsantala@nic.fi>
+	
+	* test/regression/InputStreamTest.java:
+	New file.
+
+	* test/regression/Makefile.am:
+	Added InputStreamTest.java.
+
+	* test/regression/Makefile.in:
+	regenerated.
+	
+2003-01-09 Dalibor Topic <robilad@yahoo.com>
+
 	* libraries/javalib/java/io/DataInputStream.java
 	Skipping of '\n' could corrupt reading from jars.
 	Jython 2.1 wouldn't run because of it.
diff -urN kaffe/libraries/javalib/java/io/DataInputStream.java kaffe-patched/libraries/javalib/java/io/DataInputStream.java
--- kaffe/libraries/javalib/java/io/DataInputStream.java	2003-01-09 16:15:43.000000000 +0100
+++ kaffe-patched/libraries/javalib/java/io/DataInputStream.java	2003-01-09 19:03:16.000000000 +0100
@@ -15,7 +15,7 @@
 public class DataInputStream extends FilterInputStream implements DataInput {
 
 public DataInputStream(InputStream in) {
-	super(new PushbackInputStream(in));
+	super(in);
 }
 
 public final int read(byte b[]) throws IOException {
@@ -94,13 +94,41 @@
 				break;
 			}
 			if (ch == '\r') {
-				/* Since not all streams support marking
-				   and resetting, the underlying stream is
-				   wrapped in a PushbackInputStream. If
-				   there are bytes available for reading,
-				   we use its read() and unread() methods
-				   to skip the eventual '\n' character after
-				   a '\r' character.
+				/* The spec demands that we handle '\r\n'
+				   as a single end-of-line character. The
+				   core of the problem is: How do you unread
+				   the character following '\r' if it turns out
+				   not to be '\n'?
+
+				   There are several ways to do this, none
+				   of them have worked really great so far.
+
+				   *  Wrapping the input stream in the
+				   constructor with a PushbackInputStream:
+				   fails because classes extending DataInputStream
+				   can access the protected field in. Casting that 
+				   field to classes that don't extend PushbackInputStream
+				   will result in a ClassCastException at runtime.
+				   That bug prevented the jakarta BCEL verifier 
+				   from verifying anything when run on kaffe.
+
+				   * Using a boolean flag to decide if the
+				   next '\n' should be skipped:
+				   There is no way to skip it when the user uses
+				   read() to read a single character. The API spec
+				   says that DataInputStream doesn't override
+				   FilteredInputStream.read(). This can lead to
+				   input data curruption. That bug prevented jython
+				   from running on kaffe.
+
+				   * Mark and reset:
+				   Not all streams support marking and resetting.
+
+				   This is the current solution:
+
+				   We use an internal buffer in FilterInputStream.
+				   That's a clumsy workaround, but there doesn't seem
+				   to be a better method.
 
 				   Making sure bytes are available before
 				   reading should prevent hanging on a socket.
@@ -109,7 +137,7 @@
 					final int lf = read();
 
 					if (lf != -1 && lf != '\n') {
-						((PushbackInputStream) in).unread((byte) lf);
+						super.buffer = lf;
 					}
 				}
 
diff -urN kaffe/libraries/javalib/java/io/FilterInputStream.java kaffe-patched/libraries/javalib/java/io/FilterInputStream.java
--- kaffe/libraries/javalib/java/io/FilterInputStream.java	2002-09-04 06:21:53.000000000 +0200
+++ kaffe-patched/libraries/javalib/java/io/FilterInputStream.java	2003-01-09 18:27:22.000000000 +0100
@@ -15,12 +15,18 @@
 
 	protected InputStream in;
 
+	/* used by DataInputStream handle unreading of characters.
+	 * See DataInputStream.readLine() for a description.
+	 */
+	private static final int BUFFER_EMPTY = -1;
+	int buffer = BUFFER_EMPTY;
+
 protected FilterInputStream(InputStream in) {
 	this.in = in;
 }
 
 public int available() throws IOException {
-	return (in.available());
+	return in.available() + ((buffer == BUFFER_EMPTY) ? 0 : 1);
 }
 
 public void close() throws IOException {
@@ -39,18 +45,37 @@
 }
 
 public int read() throws IOException {
-	return (in.read());
+	if (buffer == BUFFER_EMPTY) {
+		return in.read();
+	}
+	else {
+		final int value = buffer;
+		buffer = BUFFER_EMPTY;
+		return value;
+	}
 }
 
 public int read(byte b[]) throws IOException {
     /* BufferedInputStream depends on this method
      * *not* reading directly from the stream.
      */
-	return (read(b, 0, b.length));
+	if (buffer == BUFFER_EMPTY) {
+		return (read(b, 0, b.length));
+	}
+	else {
+		b[0] = (byte) read();
+		return read(b, 1, b.length - 1);
+	}
 }
 
 public int read(byte b[], int off, int len) throws IOException {
-	return (in.read(b, off, len));
+	if (buffer == BUFFER_EMPTY) {
+		return (in.read(b, off, len));
+	}
+	else {
+		b[off] = (byte) read();
+		return in.read(b, off + 1, len - 1);
+	}		
 }
 
 public synchronized void reset() throws IOException {
@@ -58,6 +83,12 @@
 }
 
 public long skip(long n) throws IOException {
-	return (in.skip(n));
+	if (buffer == BUFFER_EMPTY) {
+		return (in.skip(n));
+	}
+	else {
+		buffer = BUFFER_EMPTY;
+		return (in.skip(n - 1));
+	}
 }
 }
Binary files kaffe/libraries/javalib/Klasses.jar.bootstrap.save and kaffe-patched/libraries/javalib/Klasses.jar.bootstrap.save differ
diff -urN kaffe/README kaffe-patched/README
--- kaffe/README	2002-07-07 22:19:29.000000000 +0200
+++ kaffe-patched/README	2003-01-09 13:10:06.000000000 +0100
@@ -45,15 +45,15 @@
   ARM       | J+I  |    Linux/Netwinder NetBSD 1.x
   ------------------------------------------------------------------------
   MIPS      | J+I  |    Linux/Cobalt    IRIX 5 & 6	NetBSD 1.x
-	    |	   |	Ultrix 4.2
+	    |	   |	Ultrix 4.2      PS2Linux
   ------------------------------------------------------------------------
   M68K      | J+I  |    AmigaOS         NeXTStep 3.x    NetBSD 1.x
             |      |    SunOS 4.x	Linux		AUX
             |      |    OpenBSD 2.x
   ------------------------------------------------------------------------
-  PARISC    | I    |    HPUX 10.x
+  PARISC    | I    |    HPUX 10.x       Linux 2.x
   ------------------------------------------------------------------------
-  PowerPC   | I    |    MkLinux         MachTen 4.0.3	AIX
+  PowerPC   | I    |    Linux 2.x       MachTen 4.0.3	AIX
 	    |	   |	Darwin		NetBSD1.x       Mac OS X
   ------------------------------------------------------------------------
   ia64	    | I	   |	Linux 2.x
diff -urN kaffe/test/regression/InputStreamTest.java kaffe-patched/test/regression/InputStreamTest.java
--- kaffe/test/regression/InputStreamTest.java	1970-01-01 01:00:00.000000000 +0100
+++ kaffe-patched/test/regression/InputStreamTest.java	2003-01-09 19:04:21.000000000 +0100
@@ -0,0 +1,29 @@
+import java.io.*;
+
+public class InputStreamTest {
+        static public void main (String args[]) {
+                try {
+                        StringBufferInputStream sbis =
+                                new
+StringBufferInputStream("foobar\r\nxbarfoo\rx");
+                        DataInputStream dis = new DataInputStream(sbis);
+
+                        System.out.println(dis.readLine());
+                        System.out.println(sbis.read());
+                        System.out.println(dis.readLine());
+                        System.out.println(sbis.read());
+			System.out.println(dis.read());
+
+                } catch (IOException ioe) {
+                }
+        }
+}
+
+/* Expected Output:
+foobar
+120
+barfoo
+-1
+120
+*/
+
diff -urN kaffe/test/regression/Makefile.am kaffe-patched/test/regression/Makefile.am
--- kaffe/test/regression/Makefile.am	2002-12-11 03:45:28.000000000 +0100
+++ kaffe-patched/test/regression/Makefile.am	2003-01-09 19:05:04.000000000 +0100
@@ -129,6 +129,7 @@
 	LineNumberReaderTest.java \
 	BufferedReaderTest.java \
 	ReaderReadVoidTest.java \
+	InputStreamTest.java \
 	PipeTest.java \
 	GetField.java \
 	LostTrampolineFrame.java 
diff -urN kaffe/test/regression/Makefile.in kaffe-patched/test/regression/Makefile.in
--- kaffe/test/regression/Makefile.in	2003-01-07 14:23:05.000000000 +0100
+++ kaffe-patched/test/regression/Makefile.in	2003-01-09 19:14:25.000000000 +0100
@@ -169,7 +169,7 @@
 TEST_SERIALIZATION =  	TestSerializable.java 	TestSerializable2.java 	SerializationCompatibility.java 	SerialPersistentFields.java 	TestSerialVersions.java 	TestSerialPersistent.java 	TestSerialFields.java 	TestObjectStreamField.java 
 
 
-TEST_MISC =  	ReflectInterfaces.java 	InnerTest.java 	SerialUID.java 	TestCasts.java 	Alias.java 	NullPointerTest.java 	NullInvoke.java 	TableSwitch.java 	LostFrame.java 	ConstructorTest.java 	burford.java 	IllegalInterface.java 	GetInterfaces.java 	IntfTest.java 	SignedShort.java 	CharCvt.java 	BadFloatTest.java 	ProcessTest.java 	UDPTest.java 	SoTimeout.java 	wc.java 	FileTest.java 	FileChecks.java 	finalexc.java 	finaltest.java 	finaltest2.java 	forNameTest.java 	LoaderTest.java 	ArrayForName.java 	KaffeVerifyBug.java 	Schtum.java 	Reflect.java 	MethodBug.java 	Bean.java 	SortTest.java 	HashTest.java 	MapTest.java 	URLTest.java 	PropertiesTest.java 	ReaderTest.java 	CharArrayReaderTest.java 	LineNumberReaderTest.java 	BufferedReaderTest.java 	ReaderReadVoidTest.java 	PipeTest.java 	GetField.java 	LostTrampolineFrame.java 
+TEST_MISC =  	ReflectInterfaces.java 	InnerTest.java 	SerialUID.java 	TestCasts.java 	Alias.java 	NullPointerTest.java 	NullInvoke.java 	TableSwitch.java 	LostFrame.java 	ConstructorTest.java 	burford.java 	IllegalInterface.java 	GetInterfaces.java 	IntfTest.java 	SignedShort.java 	CharCvt.java 	BadFloatTest.java 	ProcessTest.java 	UDPTest.java 	SoTimeout.java 	wc.java 	FileTest.java 	FileChecks.java 	finalexc.java 	finaltest.java 	finaltest2.java 	forNameTest.java 	LoaderTest.java 	ArrayForName.java 	KaffeVerifyBug.java 	Schtum.java 	Reflect.java 	MethodBug.java 	Bean.java 	SortTest.java 	HashTest.java 	MapTest.java 	URLTest.java 	PropertiesTest.java 	ReaderTest.java 	CharArrayReaderTest.java 	LineNumberReaderTest.java 	BufferedReaderTest.java 	ReaderReadVoidTest.java 	InputStreamTest.java 	PipeTest.java 	GetField.java 	LostTrampolineFrame.java 
 
 
 TEST_REFLECTION =  	ReflectInvoke.java 	InvTarExcTest.java 
