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
@@ -38,6 +38,11 @@ public class CharsetToBytesAdaptor extends UnicodeToBytes
*/
private boolean closedEncoder;
/**
* True if there are bytes pending in the encoder.
*/
private boolean hasBytes;
/**
* True if we're finished.
*/
@@ -112,20 +117,16 @@ public class CharsetToBytesAdaptor extends UnicodeToBytes
// Set the current position.
outBuf.position(count);
// If we've already said that there is no more input available,
// then we simply try to flush again.
// Do the conversion.
CoderResult result = encoder.encode(inBuf, outBuf, closedEncoder);
hasBytes = result == CoderResult.OVERFLOW;
if (closedEncoder)
{
CoderResult result = encoder.flush(outBuf);
result = encoder.flush(outBuf);
if (result == CoderResult.UNDERFLOW)
finished = true;
}
else
{
// Do the conversion. If there are no characters to write,
// then we are finished.
closedEncoder = ! inBuf.hasRemaining();
encoder.encode(inBuf, outBuf, closedEncoder);
else
hasBytes = true;
}
// Mark the new end of buf.
@@ -140,7 +141,12 @@ public class CharsetToBytesAdaptor extends UnicodeToBytes
*/
public boolean havePendingBytes()
{
return ! finished;
return hasBytes;
}
public void setFinished()
{
closedEncoder = true;
}
// These aren't cached.
+10 -1
View File
@@ -1,4 +1,4 @@
/* Copyright (C) 1999, 2000, 2001, 2003, 2005 Free Software Foundation
/* Copyright (C) 1999, 2000, 2001, 2003, 2005, 2006 Free Software Foundation
This file is part of libgcj.
@@ -172,6 +172,15 @@ public abstract class UnicodeToBytes extends IOConverter
return false;
}
/**
* Users should call this method when the input is coming to an
* end. This signals that the next write (which might be
* zero-length) ought to flush any internal state.
*/
public void setFinished()
{
}
/** Indicate that the converter is resuable.
* This class keeps track of converters on a per-encoding basis.
* When done with an encoder you may call this method to indicate