/*
Реализация среды исполнения языка программирования
Объектно-ориентированный продвинутый векторный транслятор
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);
}