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