/*
    Реализация спецификаций CLDC версии 1.1 (JSR-139), MIDP версии 2.1 (JSR-118)
    и других спецификаций для функционирования компактных приложений на языке
    Java (мидлетов) в среде программного обеспечения Малик Эмулятор.

    Copyright © 2016–2017, 2019–2022 Малик Разработчик

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

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

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

package malik.emulator.i18n.encoding;

public class CP1251_Codec extends OneByteCodec
{
    public CP1251_Codec() {
    }

    public int decode(int byteValue) {
        if(byteValue >= 0x00 && byteValue <= 0x7f) return byteValue;
        if(byteValue >= 0xc0 && byteValue <= 0xff) return byteValue + 0x0350;
        switch(byteValue)
        {
        default:
            return 0x0000;
        case 0x80:
            return 0x0402;
        case 0x81:
            return 0x0403;
        case 0x82:
            return 0x201a;
        case 0x83:
            return 0x0453;
        case 0x84:
            return 0x201e;
        case 0x85:
            return 0x2026;
        case 0x86:
            return 0x2020;
        case 0x87:
            return 0x2021;
        case 0x88:
            return 0x20ac;
        case 0x89:
            return 0x2030;
        case 0x8a:
            return 0x0409;
        case 0x8b:
            return 0x2039;
        case 0x8c:
            return 0x040a;
        case 0x8d:
            return 0x040c;
        case 0x8e:
            return 0x040b;
        case 0x8f:
            return 0x040f;
        case 0x90:
            return 0x0452;
        case 0x91:
            return 0x2018;
        case 0x92:
            return 0x2019;
        case 0x93:
            return 0x201c;
        case 0x94:
            return 0x201d;
        case 0x95:
            return 0x2022;
        case 0x96:
            return 0x2013;
        case 0x97:
            return 0x2014;
        case 0x99:
            return 0x2122;
        case 0x9a:
            return 0x0459;
        case 0x9b:
            return 0x203a;
        case 0x9c:
            return 0x045a;
        case 0x9d:
            return 0x045c;
        case 0x9e:
            return 0x045b;
        case 0x9f:
            return 0x045f;
        case 0xa0:
            return 0x00a0;
        case 0xa1:
            return 0x040e;
        case 0xa2:
            return 0x045e;
        case 0xa3:
            return 0x0408;
        case 0xa4:
            return 0x00a4;
        case 0xa5:
            return 0x0490;
        case 0xa6:
            return 0x00a6;
        case 0xa7:
            return 0x00a7;
        case 0xa8:
            return 0x0401;
        case 0xa9:
            return 0x00a9;
        case 0xaa:
            return 0x0404;
        case 0xab:
            return 0x00ab;
        case 0xac:
            return 0x00ac;
        case 0xad:
            return 0x00ad;
        case 0xae:
            return 0x00ae;
        case 0xaf:
            return 0x0407;
        case 0xb0:
            return 0x00b0;
        case 0xb1:
            return 0x00b1;
        case 0xb2:
            return 0x0406;
        case 0xb3:
            return 0x0456;
        case 0xb4:
            return 0x0491;
        case 0xb5:
            return 0x00b5;
        case 0xb6:
            return 0x00b6;
        case 0xb7:
            return 0x00b7;
        case 0xb8:
            return 0x0451;
        case 0xb9:
            return 0x2116;
        case 0xba:
            return 0x0454;
        case 0xbb:
            return 0x00bb;
        case 0xbc:
            return 0x0458;
        case 0xbd:
            return 0x0405;
        case 0xbe:
            return 0x0455;
        case 0xbf:
            return 0x0457;
        }
    }

    public int encode(int charCode) {
        if(charCode >= 0x0000 && charCode <= 0x007f) return charCode;
        if(charCode >= 0x0410 && charCode <= 0x044f) return charCode - 0x0350;
        switch(charCode)
        {
        default:
            return '?';
        case 0x0402:
            return 0x80;
        case 0x0403:
            return 0x81;
        case 0x201a:
            return 0x82;
        case 0x0453:
            return 0x83;
        case 0x201e:
            return 0x84;
        case 0x2026:
            return 0x85;
        case 0x2020:
            return 0x86;
        case 0x2021:
            return 0x87;
        case 0x20ac:
            return 0x88;
        case 0x2030:
            return 0x89;
        case 0x0409:
            return 0x8a;
        case 0x2039:
            return 0x8b;
        case 0x040a:
            return 0x8c;
        case 0x040c:
            return 0x8d;
        case 0x040b:
            return 0x8e;
        case 0x040f:
            return 0x8f;
        case 0x0452:
            return 0x90;
        case 0x2018:
            return 0x91;
        case 0x2019:
            return 0x92;
        case 0x201c:
            return 0x93;
        case 0x201d:
            return 0x94;
        case 0x2022:
            return 0x95;
        case 0x2013:
            return 0x96;
        case 0x2014:
            return 0x97;
        case 0x2122:
            return 0x99;
        case 0x0459:
            return 0x9a;
        case 0x203a:
            return 0x9b;
        case 0x045a:
            return 0x9c;
        case 0x045c:
            return 0x9d;
        case 0x045b:
            return 0x9e;
        case 0x045f:
            return 0x9f;
        case 0x00a0:
            return 0xa0;
        case 0x040e:
            return 0xa1;
        case 0x045e:
            return 0xa2;
        case 0x0408:
            return 0xa3;
        case 0x00a4:
            return 0xa4;
        case 0x0490:
            return 0xa5;
        case 0x00a6:
            return 0xa6;
        case 0x00a7:
            return 0xa7;
        case 0x0401:
            return 0xa8;
        case 0x00a9:
            return 0xa9;
        case 0x0404:
            return 0xaa;
        case 0x00ab:
            return 0xab;
        case 0x00ac:
            return 0xac;
        case 0x00ad:
            return 0xad;
        case 0x00ae:
            return 0xae;
        case 0x0407:
            return 0xaf;
        case 0x00b0:
            return 0xb0;
        case 0x00b1:
            return 0xb1;
        case 0x0406:
            return 0xb2;
        case 0x0456:
            return 0xb3;
        case 0x0491:
            return 0xb4;
        case 0x00b5:
            return 0xb5;
        case 0x00b6:
            return 0xb6;
        case 0x00b7:
            return 0xb7;
        case 0x0451:
            return 0xb8;
        case 0x2116:
            return 0xb9;
        case 0x0454:
            return 0xba;
        case 0x00bb:
            return 0xbb;
        case 0x0458:
            return 0xbc;
        case 0x0405:
            return 0xbd;
        case 0x0455:
            return 0xbe;
        case 0x0457:
            return 0xbf;
        }
    }
}
