Commit cfeb18db by Michael Koch Committed by Michael Koch

re PR libgcj/13176 (Revert PrintStream changes)

2003-12-08  Michael Koch  <konqueror@gmx.de>

	Fix for PR libgcj/13176.
	* java/io/PrintStream.java: Partly revert my previous patches to get
	(line_separator): New field.
	(converter): New field.
	(work): New field.
	(work_bytes): New field.
	(pw): Removed.
	(closed): Removed.
	(PrintStrean): Initialize converter and not pw.
	(checkError): Flush always, pw doesn't exist anymore.
	(close): Close underlying out stream.
	(print): New method.
	(writeChars): New method.
	(print): Use new internal print method.
	(println): Likewise.

From-SVN: r74419
parent de9315db
2003-12-08 Michael Koch <konqueror@gmx.de>
Fix for PR libgcj/13176.
* java/io/PrintStream.java: Partly revert my previous patches to get
(line_separator): New field.
(converter): New field.
(work): New field.
(work_bytes): New field.
(pw): Removed.
(closed): Removed.
(PrintStrean): Initialize converter and not pw.
(checkError): Flush always, pw doesn't exist anymore.
(close): Close underlying out stream.
(print): New method.
(writeChars): New method.
(print): Use new internal print method.
(println): Likewise.
2002-12-08 Bryce McKinlay <bryce@mckinlay.net.nz> 2002-12-08 Bryce McKinlay <bryce@mckinlay.net.nz>
* java/util/Hashtable.java (Hashtable(Map)): Use putAll, not putAllInternal. * java/util/Hashtable.java (Hashtable(Map)): Use putAll, not putAllInternal.
......
...@@ -38,6 +38,8 @@ exception statement from your version. */ ...@@ -38,6 +38,8 @@ exception statement from your version. */
package java.io; package java.io;
import gnu.gcj.convert.UnicodeToBytes;
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1 * "The Java Language Specification", ISBN 0-201-63451-1
* Status: Believed complete and correct to 1.3 * Status: Believed complete and correct to 1.3
...@@ -58,6 +60,21 @@ package java.io; ...@@ -58,6 +60,21 @@ package java.io;
*/ */
public class PrintStream extends FilterOutputStream public class PrintStream extends FilterOutputStream
{ {
/* Notice the implementation is quite similar to OutputStreamWriter.
* This leads to some minor duplication, because neither inherits
* from the other, and we want to maximize performance. */
// Line separator string.
private static final char[] line_separator
= System.getProperty("line.separator").toCharArray();
UnicodeToBytes converter;
// Work buffer of characters for converter.
char[] work = new char[100];
// Work buffer of bytes where we temporarily keep converter output.
byte[] work_bytes = new byte[100];
/** /**
* This boolean indicates whether or not an error has ever occurred * This boolean indicates whether or not an error has ever occurred
* on this stream. * on this stream.
...@@ -71,16 +88,6 @@ public class PrintStream extends FilterOutputStream ...@@ -71,16 +88,6 @@ public class PrintStream extends FilterOutputStream
private boolean auto_flush; private boolean auto_flush;
/** /**
* The PrintWriter instance this object writes to
*/
private PrintWriter pw;
/**
* Lets us know if the stream is closed
*/
private boolean closed;
/**
* This method intializes a new <code>PrintStream</code> object to write * This method intializes a new <code>PrintStream</code> object to write
* to the specified output sink. * to the specified output sink.
* *
...@@ -108,7 +115,7 @@ public class PrintStream extends FilterOutputStream ...@@ -108,7 +115,7 @@ public class PrintStream extends FilterOutputStream
{ {
super (out); super (out);
pw = new PrintWriter (out, auto_flush); converter = UnicodeToBytes.getDefaultEncoder();
this.auto_flush = auto_flush; this.auto_flush = auto_flush;
} }
...@@ -132,7 +139,7 @@ public class PrintStream extends FilterOutputStream ...@@ -132,7 +139,7 @@ public class PrintStream extends FilterOutputStream
{ {
super (out); super (out);
pw = new PrintWriter (new OutputStreamWriter (out, encoding), auto_flush); converter = UnicodeToBytes.getEncoder (encoding);
this.auto_flush = auto_flush; this.auto_flush = auto_flush;
} }
...@@ -147,10 +154,8 @@ public class PrintStream extends FilterOutputStream ...@@ -147,10 +154,8 @@ public class PrintStream extends FilterOutputStream
*/ */
public boolean checkError () public boolean checkError ()
{ {
if (!closed) flush ();
flush (); return error_occurred;
return error_occurred | pw.checkError ();
} }
/** /**
...@@ -167,8 +172,19 @@ public class PrintStream extends FilterOutputStream ...@@ -167,8 +172,19 @@ public class PrintStream extends FilterOutputStream
*/ */
public void close () public void close ()
{ {
pw.close (); try
closed = true; {
flush();
out.close();
}
catch (InterruptedIOException iioe)
{
Thread.currentThread().interrupt();
}
catch (IOException e)
{
setError ();
}
} }
/** /**
...@@ -177,7 +193,85 @@ public class PrintStream extends FilterOutputStream ...@@ -177,7 +193,85 @@ public class PrintStream extends FilterOutputStream
*/ */
public void flush () public void flush ()
{ {
pw.flush(); try
{
out.flush();
}
catch (InterruptedIOException iioe)
{
Thread.currentThread().interrupt();
}
catch (IOException e)
{
setError ();
}
}
private synchronized void print (String str, boolean println)
{
try
{
writeChars(str, 0, str.length());
if (println)
writeChars(line_separator, 0, line_separator.length);
if (auto_flush)
flush();
}
catch (InterruptedIOException iioe)
{
Thread.currentThread().interrupt();
}
catch (IOException e)
{
setError ();
}
}
private synchronized void print (char[] chars, int pos, int len,
boolean println)
{
try
{
writeChars(chars, pos, len);
if (println)
writeChars(line_separator, 0, line_separator.length);
if (auto_flush)
flush();
}
catch (InterruptedIOException iioe)
{
Thread.currentThread().interrupt();
}
catch (IOException e)
{
setError ();
}
}
private void writeChars(char[] buf, int offset, int count)
throws IOException
{
while (count > 0 || converter.havePendingBytes())
{
converter.setOutput(work_bytes, 0);
int converted = converter.write(buf, offset, count);
offset += converted;
count -= converted;
out.write(work_bytes, 0, converter.count);
}
}
private void writeChars(String str, int offset, int count)
throws IOException
{
while (count > 0 || converter.havePendingBytes())
{
converter.setOutput(work_bytes, 0);
int converted = converter.write(str, offset, count, work);
offset += converted;
count -= converted;
out.write(work_bytes, 0, converter.count);
}
} }
/** /**
...@@ -189,7 +283,7 @@ public class PrintStream extends FilterOutputStream ...@@ -189,7 +283,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void print (boolean bool) public void print (boolean bool)
{ {
print (String.valueOf (bool)); print(String.valueOf(bool), false);
} }
/** /**
...@@ -200,7 +294,7 @@ public class PrintStream extends FilterOutputStream ...@@ -200,7 +294,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void print (int inum) public void print (int inum)
{ {
print (String.valueOf (inum)); print(String.valueOf(inum), false);
} }
/** /**
...@@ -211,7 +305,7 @@ public class PrintStream extends FilterOutputStream ...@@ -211,7 +305,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void print (long lnum) public void print (long lnum)
{ {
print (String.valueOf (lnum)); print(String.valueOf(lnum), false);
} }
/** /**
...@@ -222,7 +316,7 @@ public class PrintStream extends FilterOutputStream ...@@ -222,7 +316,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void print (float fnum) public void print (float fnum)
{ {
print (String.valueOf (fnum)); print(String.valueOf(fnum), false);
} }
/** /**
...@@ -233,7 +327,7 @@ public class PrintStream extends FilterOutputStream ...@@ -233,7 +327,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void print (double dnum) public void print (double dnum)
{ {
print (String.valueOf (dnum)); print(String.valueOf(dnum), false);
} }
/** /**
...@@ -245,9 +339,7 @@ public class PrintStream extends FilterOutputStream ...@@ -245,9 +339,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void print (Object obj) public void print (Object obj)
{ {
// Don't call pw directly. Convert to String so we scan for newline print(obj == null ? "null" : obj.toString(), false);
// characters on auto-flush;
print (String.valueOf (obj));
} }
/** /**
...@@ -258,10 +350,7 @@ public class PrintStream extends FilterOutputStream ...@@ -258,10 +350,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void print (String str) public void print (String str)
{ {
pw.print (str); print(str == null ? "null" : str, false);
if (auto_flush)
flush ();
} }
/** /**
...@@ -270,9 +359,10 @@ public class PrintStream extends FilterOutputStream ...@@ -270,9 +359,10 @@ public class PrintStream extends FilterOutputStream
* *
* @param ch The <code>char</code> value to be printed * @param ch The <code>char</code> value to be printed
*/ */
public void print (char ch) public synchronized void print (char ch)
{ {
print (String.valueOf (ch)); work[0] = ch;
print(work, 0, 1, false);
} }
/** /**
...@@ -283,7 +373,7 @@ public class PrintStream extends FilterOutputStream ...@@ -283,7 +373,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void print (char[] charArray) public void print (char[] charArray)
{ {
pw.print (charArray); print(charArray, 0, charArray.length, false);
} }
/** /**
...@@ -293,7 +383,7 @@ public class PrintStream extends FilterOutputStream ...@@ -293,7 +383,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void println () public void println ()
{ {
pw.println(); print(line_separator, 0, line_separator.length, false);
} }
/** /**
...@@ -307,7 +397,7 @@ public class PrintStream extends FilterOutputStream ...@@ -307,7 +397,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void println (boolean bool) public void println (boolean bool)
{ {
println (String.valueOf (bool)); print(String.valueOf(bool), true);
} }
/** /**
...@@ -320,7 +410,7 @@ public class PrintStream extends FilterOutputStream ...@@ -320,7 +410,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void println (int inum) public void println (int inum)
{ {
println (String.valueOf (inum)); print(String.valueOf(inum), true);
} }
/** /**
...@@ -333,7 +423,7 @@ public class PrintStream extends FilterOutputStream ...@@ -333,7 +423,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void println (long lnum) public void println (long lnum)
{ {
println (String.valueOf (lnum)); print(String.valueOf(lnum), true);
} }
/** /**
...@@ -346,7 +436,7 @@ public class PrintStream extends FilterOutputStream ...@@ -346,7 +436,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void println (float fnum) public void println (float fnum)
{ {
println (String.valueOf (fnum)); print(String.valueOf(fnum), true);
} }
/** /**
...@@ -359,7 +449,7 @@ public class PrintStream extends FilterOutputStream ...@@ -359,7 +449,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void println (double dnum) public void println (double dnum)
{ {
println (String.valueOf (dnum)); print(String.valueOf(dnum), true);
} }
/** /**
...@@ -373,7 +463,7 @@ public class PrintStream extends FilterOutputStream ...@@ -373,7 +463,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void println (Object obj) public void println (Object obj)
{ {
println (String.valueOf (obj)); print(obj == null ? "null" : obj.toString(), true);
} }
/** /**
...@@ -386,7 +476,7 @@ public class PrintStream extends FilterOutputStream ...@@ -386,7 +476,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void println (String str) public void println (String str)
{ {
pw.println (str); print (str == null ? "null" : str, true);
} }
/** /**
...@@ -397,9 +487,10 @@ public class PrintStream extends FilterOutputStream ...@@ -397,9 +487,10 @@ public class PrintStream extends FilterOutputStream
* *
* @param ch The <code>char</code> value to be printed * @param ch The <code>char</code> value to be printed
*/ */
public void println (char ch) public synchronized void println (char ch)
{ {
println (String.valueOf (ch)); work[0] = ch;
print(work, 0, 1, true);
} }
/** /**
...@@ -412,7 +503,7 @@ public class PrintStream extends FilterOutputStream ...@@ -412,7 +503,7 @@ public class PrintStream extends FilterOutputStream
*/ */
public void println (char[] charArray) public void println (char[] charArray)
{ {
pw.println (charArray); print(charArray, 0, charArray.length, true);
} }
/** /**
...@@ -424,10 +515,6 @@ public class PrintStream extends FilterOutputStream ...@@ -424,10 +515,6 @@ public class PrintStream extends FilterOutputStream
*/ */
public void write (int oneByte) public void write (int oneByte)
{ {
// We actually have to implement this method. Flush first so that
// things get written in the right order.
flush();
try try
{ {
out.write (oneByte & 0xff); out.write (oneByte & 0xff);
...@@ -435,6 +522,10 @@ public class PrintStream extends FilterOutputStream ...@@ -435,6 +522,10 @@ public class PrintStream extends FilterOutputStream
if (auto_flush && (oneByte == '\n')) if (auto_flush && (oneByte == '\n'))
flush (); flush ();
} }
catch (InterruptedIOException iioe)
{
Thread.currentThread ().interrupt ();
}
catch (IOException e) catch (IOException e)
{ {
setError (); setError ();
...@@ -451,10 +542,6 @@ public class PrintStream extends FilterOutputStream ...@@ -451,10 +542,6 @@ public class PrintStream extends FilterOutputStream
*/ */
public void write (byte[] buffer, int offset, int len) public void write (byte[] buffer, int offset, int len)
{ {
// We actually have to implement this method too. Flush first so that
// things get written in the right order.
flush();
try try
{ {
out.write (buffer, offset, len); out.write (buffer, offset, len);
...@@ -462,6 +549,10 @@ public class PrintStream extends FilterOutputStream ...@@ -462,6 +549,10 @@ public class PrintStream extends FilterOutputStream
if (auto_flush) if (auto_flush)
flush (); flush ();
} }
catch (InterruptedIOException iioe)
{
Thread.currentThread ().interrupt ();
}
catch (IOException e) catch (IOException e)
{ {
setError (); setError ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment