/*
Исходный код среды исполнения ПВТ-ОО.
Этот исходный код является частью проекта ПВТ-ОО.
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);
}
}
}