java/ch/wlkl/wsh/OutputStream2Write.java

package ch.wlkl.wsh;

import java.io.IOException;
import java.io.OutputStream;

public class OutputStream2Write extends OutputStream  {

        Write<String> out;
        StringBuffer buf = new StringBuffer();

        boolean bufUsed = false; 

        OutputStream2Write(Write<String> w) {
            out = w;
        }
        public void flush() {
            if (bufUsed) {
                out.write(buf.toString());
                buf.setLength(0);
                bufUsed = false;
            }
        }
        
        public void close() {
            flush();
        }

        public void write(int b) throws IOException {
            bufUsed = true;
            if (b == '\n' || b == '\r') 
                flush();
            else 
                buf.append((char) b);
        }

        public void write(byte[] b, int off, int len) throws IOException {
            int x = off;
            int end = off + len;
            while (x < end) {
                bufUsed = true;
                if (b[x] == '\n') { 
                    flush();
                    x ++;
                } else if (b[x] == '\r') { 
                    flush();
                    x += x+1<end && b[x+1] == '\n' ? 2 : 1;
                } else {
                    buf.append((char) b[x]);
                    x++;
                }
            }
//            len -= len <= 0 ? 0 : b[off+len-1] == '\r' ? 1 : b[off+len-1] != '\n' ? 0 : len > 1 && b[off+len-2] == '\r' ? 2 : 1;
//            prnt.println("write(bytes[], ," + len + ") " + new String(b, off, len));
        }

        public void write(String arg) {
            buf.append(arg);
            flush();
        }

        public void open(String opt) {
            close();
            if (! ("w".equals(opt) || "a".equals(opt)))
                Top.sFail("bad opt " + opt);
        }

        @SuppressWarnings("unchecked")
        public void reset(Object... args) {
            if (args.length > 0)
                out = (Write<String>) args[0];
        }


}