OutputStreamWriter.java (writeChars): Use a 'do' loop.

* java/io/OutputStreamWriter.java (writeChars): Use a 'do' loop.
	Set 'out.count' earlier.
	(close): Call setFinished on converter.
	(flush): Always write work buffer.
	* java/io/PrintStream.java (writeChars): Do 'do' loop.
	(close): Call setFinished on converter.  Write a 'flush' array.
	* java/lang/natString.cc (getBytes): Call setFinished on
	converter.
	* gnu/gcj/convert/CharsetToBytesAdaptor.java (hasBytes): New
	field.
	(write): Set hasBytes.  Changed 'finished' logic.
	(havePendingBytes): Rewrote.
	(setFinished): New method.
	* gnu/gcj/convert/UnicodeToBytes.java (setFinished): New method.
	* testsuite/libjava.lang/RH194522.java: New file.
	* testsuite/libjava.lang/RH194522.out: New file.

From-SVN: r115039
This commit is contained in:
Tom Tromey 2006-06-27 20:38:10 +00:00 committed by Tom Tromey
parent 80cd0e33d9
commit 9e01bff779
8 changed files with 85 additions and 23 deletions

View file

@ -1,5 +1,5 @@
/* OutputStreamWriter.java -- Writer that converts chars to bytes
Copyright (C) 1998, 1999, 2000, 2001, 2003, 2005 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000, 2001, 2003, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -168,6 +168,7 @@ public class OutputStreamWriter extends Writer
{
if (out != null)
{
converter.setFinished();
flush();
out.close();
out = null;
@ -200,11 +201,11 @@ public class OutputStreamWriter extends Writer
if (out == null)
throw new IOException("Stream closed");
if (wcount > 0)
{
writeChars(work, 0, wcount);
wcount = 0;
}
// Always write -- if we are close()ing then we want to make
// sure the converter is flushed.
writeChars(work, 0, wcount);
wcount = 0;
out.flush();
}
}
@ -243,7 +244,7 @@ public class OutputStreamWriter extends Writer
private void writeChars(char[] buf, int offset, int count)
throws IOException
{
while (count > 0 || converter.havePendingBytes())
do
{
// We must flush if out.count == out.buf.length.
// It is probably a good idea to flush if out.buf is almost full.
@ -256,6 +257,9 @@ public class OutputStreamWriter extends Writer
}
converter.setOutput(out.buf, out.count);
int converted = converter.write(buf, offset, count);
// Must set this before we flush the output stream, because
// flushing will reset 'out.count'.
out.count = converter.count;
// Flush if we cannot make progress.
if (converted == 0 && out.count == converter.count)
{
@ -265,8 +269,8 @@ public class OutputStreamWriter extends Writer
}
offset += converted;
count -= converted;
out.count = converter.count;
}
while (count > 0 || converter.havePendingBytes());
}
/**

View file

@ -1,5 +1,5 @@
/* PrintStream.java -- OutputStream for printing output
Copyright (C) 1998, 1999, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -174,6 +174,8 @@ public class PrintStream extends FilterOutputStream
{
try
{
converter.setFinished();
writeChars(new char[0], 0, 0);
flush();
out.close();
}
@ -251,7 +253,7 @@ public class PrintStream extends FilterOutputStream
private void writeChars(char[] buf, int offset, int count)
throws IOException
{
while (count > 0 || converter.havePendingBytes())
do
{
converter.setOutput(work_bytes, 0);
int converted = converter.write(buf, offset, count);
@ -259,12 +261,13 @@ public class PrintStream extends FilterOutputStream
count -= converted;
out.write(work_bytes, 0, converter.count);
}
while (count > 0 || converter.havePendingBytes());
}
private void writeChars(String str, int offset, int count)
throws IOException
{
while (count > 0 || converter.havePendingBytes())
do
{
converter.setOutput(work_bytes, 0);
int converted = converter.write(str, offset, count, work);
@ -272,6 +275,7 @@ public class PrintStream extends FilterOutputStream
count -= converted;
out.write(work_bytes, 0, converter.count);
}
while (count > 0 || converter.havePendingBytes());
}
/**