From 60e9f0d726fd28b960c5674a3c7beaf7015dbd34 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 7 Jun 2003 18:35:00 +0000 Subject: re PR libgcj/8738 (java.io.CharArrayWriter's write methods erroneously throw IOExceptions) 2002-06-06 James Clark Fix for PR libgcj/8738: * gnu/gcj/convert/UnicodeToBytes.java (havePendingBytes): New method. * gnu/gcj/convert/Output_SJIS.java (havePendingBytes): Likewise. * gnu/gcj/convert/Output_EUCJIS.java (havePendingBytes): Likewise. * gnu/gcj/convert/Output_UTF8.java (havePendingBytes): Likewise. (write): Always decrease avail when count is increased. * java/lang/natString.cc (getBytes): Check converter havePendingBytes() and whether output buffer is full before increasing size. 2002-06-06 Mark Wielaard * java/io/PrintStream.java (writeChars(char[],int, int)): Check converter.havePendingBytes(). (writeChars(String,int,int)): Likewise. * java/io/OutputStreamWriter.java (writeChars(char[], int, int)): Check converter.havePendingBytes() and flush buffer when stalled. From-SVN: r67595 --- libjava/java/io/OutputStreamWriter.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'libjava/java/io/OutputStreamWriter.java') diff --git a/libjava/java/io/OutputStreamWriter.java b/libjava/java/io/OutputStreamWriter.java index e4ecbdbab8f..8a47fdfc651 100644 --- a/libjava/java/io/OutputStreamWriter.java +++ b/libjava/java/io/OutputStreamWriter.java @@ -215,7 +215,7 @@ public class OutputStreamWriter extends Writer private void writeChars(char[] buf, int offset, int count) throws IOException { - while (count > 0) + while (count > 0 || converter.havePendingBytes()) { // We must flush if out.count == out.buf.length. // It is probably a good idea to flush if out.buf is almost full. @@ -228,6 +228,13 @@ public class OutputStreamWriter extends Writer } converter.setOutput(out.buf, out.count); int converted = converter.write(buf, offset, count); + // Flush if we cannot make progress. + if (converted == 0 && out.count == converter.count) + { + out.flush(); + if (out.count != 0) + throw new IOException("unable to flush output byte buffer"); + } offset += converted; count -= converted; out.count = converter.count; -- cgit v1.2.3