From cfeb18dbeca3b5d651152c183c68d4bdf9ae9b9f Mon Sep 17 00:00:00 2001 From: Michael Koch Date: Mon, 8 Dec 2003 12:45:59 +0000 Subject: [PATCH] re PR libgcj/13176 (Revert PrintStream changes) 2003-12-08 Michael Koch 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 --- libjava/ChangeLog | 18 +++ libjava/java/io/PrintStream.java | 197 ++++++++++++++++++++++--------- 2 files changed, 162 insertions(+), 53 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index fb762981c21..814a35066ac 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,21 @@ +2003-12-08 Michael Koch + + 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 * java/util/Hashtable.java (Hashtable(Map)): Use putAll, not putAllInternal. diff --git a/libjava/java/io/PrintStream.java b/libjava/java/io/PrintStream.java index d2a211744e2..2e9bfc4c22f 100644 --- a/libjava/java/io/PrintStream.java +++ b/libjava/java/io/PrintStream.java @@ -38,6 +38,8 @@ exception statement from your version. */ package java.io; +import gnu.gcj.convert.UnicodeToBytes; + /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Believed complete and correct to 1.3 @@ -58,6 +60,21 @@ package java.io; */ 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 * on this stream. @@ -70,16 +87,6 @@ public class PrintStream extends FilterOutputStream */ 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 PrintStream object to write * to the specified output sink. @@ -108,7 +115,7 @@ public class PrintStream extends FilterOutputStream { super (out); - pw = new PrintWriter (out, auto_flush); + converter = UnicodeToBytes.getDefaultEncoder(); this.auto_flush = auto_flush; } @@ -132,7 +139,7 @@ public class PrintStream extends FilterOutputStream { super (out); - pw = new PrintWriter (new OutputStreamWriter (out, encoding), auto_flush); + converter = UnicodeToBytes.getEncoder (encoding); this.auto_flush = auto_flush; } @@ -147,10 +154,8 @@ public class PrintStream extends FilterOutputStream */ public boolean checkError () { - if (!closed) - flush (); - - return error_occurred | pw.checkError (); + flush (); + return error_occurred; } /** @@ -167,8 +172,19 @@ public class PrintStream extends FilterOutputStream */ public void close () { - pw.close (); - closed = true; + try + { + flush(); + out.close(); + } + catch (InterruptedIOException iioe) + { + Thread.currentThread().interrupt(); + } + catch (IOException e) + { + setError (); + } } /** @@ -177,7 +193,85 @@ public class PrintStream extends FilterOutputStream */ 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 */ public void print (boolean bool) { - print (String.valueOf (bool)); + print(String.valueOf(bool), false); } /** @@ -200,7 +294,7 @@ public class PrintStream extends FilterOutputStream */ public void print (int inum) { - print (String.valueOf (inum)); + print(String.valueOf(inum), false); } /** @@ -211,7 +305,7 @@ public class PrintStream extends FilterOutputStream */ public void print (long lnum) { - print (String.valueOf (lnum)); + print(String.valueOf(lnum), false); } /** @@ -222,7 +316,7 @@ public class PrintStream extends FilterOutputStream */ public void print (float fnum) { - print (String.valueOf (fnum)); + print(String.valueOf(fnum), false); } /** @@ -233,7 +327,7 @@ public class PrintStream extends FilterOutputStream */ public void print (double dnum) { - print (String.valueOf (dnum)); + print(String.valueOf(dnum), false); } /** @@ -245,9 +339,7 @@ public class PrintStream extends FilterOutputStream */ public void print (Object obj) { - // Don't call pw directly. Convert to String so we scan for newline - // characters on auto-flush; - print (String.valueOf (obj)); + print(obj == null ? "null" : obj.toString(), false); } /** @@ -258,10 +350,7 @@ public class PrintStream extends FilterOutputStream */ public void print (String str) { - pw.print (str); - - if (auto_flush) - flush (); + print(str == null ? "null" : str, false); } /** @@ -270,9 +359,10 @@ public class PrintStream extends FilterOutputStream * * @param ch The char 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 */ public void print (char[] charArray) { - pw.print (charArray); + print(charArray, 0, charArray.length, false); } /** @@ -293,7 +383,7 @@ public class PrintStream extends FilterOutputStream */ public void println () { - pw.println(); + print(line_separator, 0, line_separator.length, false); } /** @@ -307,7 +397,7 @@ public class PrintStream extends FilterOutputStream */ public void println (boolean bool) { - println (String.valueOf (bool)); + print(String.valueOf(bool), true); } /** @@ -320,7 +410,7 @@ public class PrintStream extends FilterOutputStream */ public void println (int inum) { - println (String.valueOf (inum)); + print(String.valueOf(inum), true); } /** @@ -333,7 +423,7 @@ public class PrintStream extends FilterOutputStream */ public void println (long lnum) { - println (String.valueOf (lnum)); + print(String.valueOf(lnum), true); } /** @@ -346,7 +436,7 @@ public class PrintStream extends FilterOutputStream */ public void println (float fnum) { - println (String.valueOf (fnum)); + print(String.valueOf(fnum), true); } /** @@ -359,7 +449,7 @@ public class PrintStream extends FilterOutputStream */ public void println (double dnum) { - println (String.valueOf (dnum)); + print(String.valueOf(dnum), true); } /** @@ -373,7 +463,7 @@ public class PrintStream extends FilterOutputStream */ 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 */ public void println (String str) { - pw.println (str); + print (str == null ? "null" : str, true); } /** @@ -397,9 +487,10 @@ public class PrintStream extends FilterOutputStream * * @param ch The char 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 */ public void println (char[] charArray) { - pw.println (charArray); + print(charArray, 0, charArray.length, true); } /** @@ -424,10 +515,6 @@ public class PrintStream extends FilterOutputStream */ 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 { out.write (oneByte & 0xff); @@ -435,6 +522,10 @@ public class PrintStream extends FilterOutputStream if (auto_flush && (oneByte == '\n')) flush (); } + catch (InterruptedIOException iioe) + { + Thread.currentThread ().interrupt (); + } catch (IOException e) { setError (); @@ -451,10 +542,6 @@ public class PrintStream extends FilterOutputStream */ 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 { out.write (buffer, offset, len); @@ -462,6 +549,10 @@ public class PrintStream extends FilterOutputStream if (auto_flush) flush (); } + catch (InterruptedIOException iioe) + { + Thread.currentThread ().interrupt (); + } catch (IOException e) { setError (); -- 2.30.2