UTF16BE.avt

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

/*
    Исходный код среды исполнения ПВТ-ОО.

    Этот исходный код является частью проекта ПВТ-ОО.

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

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

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

    Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
    вместе с этой программой. Если это не так, см.
    <http://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); }
}

final class UTF16BEDecoder(CharDecoder)
{
    private boolean fldByteReaded;
    private int fldByteValue;

    public (Charset charset): super(charset) {  }

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

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

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