PrintStream.java (out): Removed field.
authorTom Tromey <tromey@redhat.com>
Mon, 2 Apr 2001 21:16:38 +0000 (21:16 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Mon, 2 Apr 2001 21:16:38 +0000 (21:16 +0000)
* java/io/PrintStream.java (out): Removed field.  Fixes PR
java/2449.
(write): Call flush, not out.flush, per spec.
(close): Flush output stream, per spec.  Handle
InterruptedIOException.
(checkError): Likewise.
(flush, print, write): Handle InterruptedIOException per spec.
(PrintStream): Don't create BufferedOutputStream.
(work_bytes): New field.
(writeChars): Use work_bytes.  Don't assume `out' is a
BufferedOutputStream.

From-SVN: r41014

libjava/ChangeLog
libjava/java/io/PrintStream.java

index 59225f559a8cdc06d0bfe72bbd1434625ce55795..2bc5aa8229899c361dea052c28b943c4851951fc 100644 (file)
@@ -1,3 +1,17 @@
+2001-04-02  Tom Tromey  <tromey@redhat.com>
+
+       * java/io/PrintStream.java (out): Removed field.  Fixes PR
+       java/2449.
+       (write): Call flush, not out.flush, per spec.
+       (close): Flush output stream, per spec.  Handle
+       InterruptedIOException.
+       (checkError): Likewise.
+       (flush, print, write): Handle InterruptedIOException per spec.
+       (PrintStream): Don't create BufferedOutputStream.
+       (work_bytes): New field.
+       (writeChars): Use work_bytes.  Don't assume `out' is a
+       BufferedOutputStream.
+
 2001-04-02  Torsten Rueger  <torsten.rueger@firsthop.com>
 
        * java/text/MessageFormat.java (setLocale): Added missing `else'.
index 4df8748e21745fe3d67a5dea1df0d235250f046d..621778da9d56df100756dfcb8f778f61b7f48aa3 100644 (file)
@@ -1,6 +1,6 @@
 // PrintStream.java - Print string representations
 
-/* Copyright (C) 1998, 1999  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2001  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -18,7 +18,7 @@ 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:  Not finished.
+ * Status:  Believed complete and correct to 1.3
  */
 
 public class PrintStream extends FilterOutputStream
@@ -29,6 +29,7 @@ public class PrintStream extends FilterOutputStream
 
   public boolean checkError ()
   {
+    flush();
     return error;
   }
 
@@ -36,8 +37,13 @@ public class PrintStream extends FilterOutputStream
   {
     try
       {
+       flush();
        out.close();
       }
+    catch (InterruptedIOException iioe)
+      {
+       Thread.currentThread().interrupt();
+      }
     catch (IOException e)
       {
        setError ();
@@ -50,6 +56,10 @@ public class PrintStream extends FilterOutputStream
       {
        out.flush();
       }
+    catch (InterruptedIOException iioe)
+      {
+       Thread.currentThread().interrupt();
+      }
     catch (IOException e)
       {
        setError ();
@@ -66,6 +76,10 @@ public class PrintStream extends FilterOutputStream
        if (auto_flush)
          flush();
       }
+    catch (InterruptedIOException iioe)
+      {
+       Thread.currentThread().interrupt();
+      }
     catch (IOException e)
       {
        setError ();
@@ -83,32 +97,26 @@ public class PrintStream extends FilterOutputStream
        if (auto_flush)
          flush();
       }
+    catch (InterruptedIOException iioe)
+      {
+       Thread.currentThread().interrupt();
+      }
     catch (IOException e)
       {
        setError ();
       }
   }
 
-  /** Writes characters through to the inferior BufferedOutputStream. */
   private void writeChars(char[] buf, int offset, int count)
     throws IOException
   {
     while (count > 0)
       {
-       // We must flush if out.count == out.buf.length.
-       // It is probably a good idea to flush if out.buf is almost full.
-       // This test is an approximation for "almost full".
-       if (out.count + count >= out.buf.length)
-         {
-           out.flush();
-           if (out.count != 0)
-             throw new IOException("unable to flush output byte buffer");
-         }
-       converter.setOutput(out.buf, out.count);
+       converter.setOutput(work_bytes, 0);
        int converted = converter.write(buf, offset, count);
        offset += converted;
        count -= converted;
-       out.count = converter.count;
+       out.write(work_bytes, 0, converter.count);
       }
   }
 
@@ -117,20 +125,11 @@ public class PrintStream extends FilterOutputStream
   {
     while (count > 0)
       {
-       // We must flush if out.count == out.buf.length.
-       // It is probably a good idea to flush if out.buf is almost full.
-       // This test is an approximation for "almost full".
-       if (out.count + count >= out.buf.length)
-         {
-           out.flush();
-           if (out.count != 0)
-             throw new IOException("unable to flush output byte buffer");
-         }
-       converter.setOutput(out.buf, out.count);
+       converter.setOutput(work_bytes, 0);
        int converted = converter.write(str, offset, count, work);
        offset += converted;
        count -= converted;
-       out.count = converter.count;
+       out.write(work_bytes, 0, converter.count);
       }
   }
 
@@ -239,15 +238,6 @@ public class PrintStream extends FilterOutputStream
   public PrintStream (OutputStream out, boolean af)
   {
     super(out);
-    if (out instanceof BufferedOutputStream)
-      this.out = (BufferedOutputStream) out;
-    else
-      {
-        this.out = new BufferedOutputStream(out, 250);
-       /* PrintStream redefines "out". Explicitly reset FilterOutputStream's
-        * "out" so that they're referring to the same thing. */
-       super.out = this.out;    
-      }
     converter = UnicodeToBytes.getDefaultEncoder();
     error = false;
     auto_flush = af;
@@ -264,7 +254,11 @@ public class PrintStream extends FilterOutputStream
       {
        out.write(oneByte);
        if (auto_flush && oneByte == '\n')
-         out.flush();
+         flush();
+      }
+    catch (InterruptedIOException iioe)
+      {
+       Thread.currentThread().interrupt();
       }
     catch (IOException e)
       {
@@ -278,7 +272,11 @@ public class PrintStream extends FilterOutputStream
       {
        out.write(buffer, offset, count);
        if (auto_flush)
-         out.flush();
+         flush();
+      }
+    catch (InterruptedIOException iioe)
+      {
+       Thread.currentThread().interrupt();
       }
     catch (IOException e)
       {
@@ -286,10 +284,12 @@ public class PrintStream extends FilterOutputStream
       }
   }
 
-  BufferedOutputStream out;
   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];
 
   // True if error occurred.
   private boolean error;