UTF16BE.avt

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

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

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

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

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

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

package avt.io.charset.unicode;

import avt.io.*;
import avt.io.charset.*;

public final class UTF16BE(Charset)
{
    public (): super("UTF-16 BE", new String[] { "UTF-16BE", "UTF16 BE", "UTF16BE", "UCS-2 BE", "UCS-2BE", "UCS2 BE", "UCS2BE" }) {  }

    public CharDecoder newDecoder() { return new UTF16BEDecoder(this); }

    public CharEncoder newEncoder() { return new UTF16BEEncoder(this); }
}

class UTF16BEDecoder(CharDecoder)
{
    private boolean fldByteReaded;
    private int fldByteData;

    (Charset charset): super(charset) {  }

    protected void decode(ByteReader src, int length, CharWriter dst) throws IOException {
        while(length-- > 0)
        {
            int byteData = src.read();
            if(byteData < 0 || byteData > 0xff) break;
            if(fldByteReaded)
            {
                int b0 = byteData;
                int b1 = fldByteData;
                fldByteReaded = false;
                dst.write(b1 << 0o10 | b0);
                continue;
            }
            fldByteData = byteData;
            fldByteReaded = true;
        }
    }
}

class UTF16BEEncoder(CharEncoder)
{
    (Charset charset): super(charset) {  }

    protected void encode(CharReader src, int length, ByteWriter dst) throws IOException {
        while(length-- > 0)
        {
            int charData = src.read();
            if(charData < 0 || charData > 0xffff) break;
            dst.write(charData >> 0o10);
            dst.write(charData);
        }
    }
}