PrintStream.avt

Переключить прокрутку окна
Загрузить этот исходный код

/*
    Реализация среды исполнения языка программирования
    Объектно-ориентированный продвинутый векторный транслятор

    Copyright © 2021, 2024 Малик Разработчик

    Это свободная программа: вы можете перераспространять ее и/или изменять
    ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
    в каком она была опубликована Фондом свободного программного обеспечения;
    либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.

    Эта программа распространяется в надежде, что она будет полезной,
    но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
    или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
    общественной лицензии GNU.

    Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
    вместе с этой программой. Если это не так, см.
    <https://www.gnu.org/licenses/>.
*/

package avt.io;

import avt.io.charset.*;
import avt.lang.array.*;

public class PrintStream(Object, Closeable, ByteWriter, Extendable)
{
    private boolean fldError;
    private CharEncoder fldEncoder;
    private final ByteWriter fldWriter;
    private final String fldLineSeparator;

    public (ByteWriter writer): this(writer, Charset.getDefault().newEncoder()) {  }

    public (ByteWriter writer, CharEncoder encoder) {
        fldEncoder = encoder != null ? encoder : Charset.getDefault().newEncoder();
        fldWriter = writer;
        fldLineSeparator = Platform.instance.lineSeparator;
    }

    public (CharOutputStream stream) {
        ByteWriter writer = null;
        CharEncoder encoder = null;
        if(stream != null)
        {
            writer = stream.writer;
            encoder = stream.encoder;
        }
        fldEncoder = encoder != null ? encoder : Charset.getDefault().newEncoder();
        fldWriter = writer;
        fldLineSeparator = Platform.instance.lineSeparator;
    }

    public void close() {
        try
        {
            fldWriter.close();
        }
        catch(Exception exception)
        {
            error();
        }
    }

    public void write(int byteData) {
        try
        {
            fldWriter.write(byteData);
        }
        catch(Exception exception)
        {
            error();
        }
    }

    public void write(byte[] src) {
        try
        {
            fldWriter.write(src);
        }
        catch(Exception exception)
        {
            error();
        }
    }

    public void write(byte[] src, int offset, int length) {
        try
        {
            fldWriter.write(src, offset, length);
        }
        catch(Exception exception)
        {
            error();
        }
    }

    public void flush() {
        try
        {
            fldWriter.flush();
        }
        catch(Exception exception)
        {
            error();
        }
    }

    public Extension[] getExtensions() {
        Extendable writer = fldWriter;
        return writer == null ? Extendable.super.getExtensions() : writer.getExtensions();
    }

    public Extension getExtension(Class type) {
        Extendable writer = fldWriter;
        return writer == null ? Extendable.super.getExtension(type) : writer.getExtension(type);
    }

    public void print(boolean src) { write(String.valueOf(src)); }

    public void print(char src) { write(new char[] { src }); }

    public void print(byte src) { write(String.valueOf(src)); }

    public void print(short src) { write(String.valueOf(src)); }

    public void print(int src) { write(String.valueOf(src)); }

    public void print(long src) { write(String.valueOf(src)); }

    public void print(float src) { write(String.valueOf(src)); }

    public void print(double src) { write(String.valueOf(src)); }

    public void print(real src) { write(String.valueOf(src)); }

    public void print(Object src) { write(String.valueOf(src)); }

    public void print(CharArray src, int offset, int length) {
        try
        {
            fldEncoder.encodeToWriter(fldWriter, src, offset, length);
        }
        catch(Exception exception)
        {
            error();
        }
    }

    public void printf(String form, ObjectArray data) { write(String.format(form, data)); }

    public void println() { write(fldLineSeparator); }

    public void println(boolean src) { write(String.valueOf(src) + fldLineSeparator); }

    public void println(char src) { write(String.valueOf(src) + fldLineSeparator); }

    public void println(byte src) { write(String.valueOf(src) + fldLineSeparator); }

    public void println(short src) { write(String.valueOf(src) + fldLineSeparator); }

    public void println(int src) { write(String.valueOf(src) + fldLineSeparator); }

    public void println(long src) { write(String.valueOf(src) + fldLineSeparator); }

    public void println(float src) { write(String.valueOf(src) + fldLineSeparator); }

    public void println(double src) { write(String.valueOf(src) + fldLineSeparator); }

    public void println(real src) { write(String.valueOf(src) + fldLineSeparator); }

    public void println(Object src) { write(String.valueOf(src) + fldLineSeparator); }

    public void println(CharArray src, int offset, int length) { write((new StringBuilder()).append(src, offset, length) + fldLineSeparator); }

    public void printlnf(String form, ObjectArray data) { write(String.format(form, data) + fldLineSeparator); }

    public final boolean isError() {
        if(setError(false))
        {
            errorCleared();
            return true;
        }
        return false;
    }

    public final ByteWriter writer { read = fldWriter }

    public final CharEncoder encoder { read = fldEncoder, write = setEncoder }

    protected void errorSet() {  }

    protected void errorCleared() {  }

    protected final void error() { if(!setError(true)) errorSet(); }

    private void write(CharArray src) {
        try
        {
            fldEncoder.encodeToWriter(fldWriter, src);
        }
        catch(Exception exception)
        {
            error();
        }
    }

    private void setEncoder(CharEncoder newEncoder) { fldEncoder = newEncoder != null ? newEncoder : Charset.getDefault().newEncoder(); }

    private native boolean setError(boolean newError);
}