jis2sjis

頭使わずに実装した系なので何か変なことしてるかもしれませんが、まあ動きます。
我ながら何やってるかわかりにくいコードです。

const char[] ESC_KANA = [0x1B, 0x24, 0x42];
const char[] ESC_ASCII = [0x1B, 0x28, 0x42];
const char[] ESC_ROMAN = [0x1B, 0x28, 0x4A];

enum MODE{
    ONE = 1,
    TWO = 2,
    ESC = 0
}

char[] jis2sjis(char[] jis){
    char[] sjis;
    sjis.length = jis.length;

    char[] esc;

    int l = 0;
    MODE mode = MODE.ONE;
    bool f_kana = true;

    for (int i = 0; i < jis.length; i++){
        if (jis[i] == 0x1B){
            mode = MODE.ESC;
            esc.length = 0;
        }
        if (mode == MODE.ONE){
            sjis[l++] = jis[i];
        } else if (mode == MODE.TWO){
            if (f_kana){
                if (jis[i] < 0x5f){
                    sjis[l] = ((jis[i] + 1) / 2) + 0x70;
                } else {
                    sjis[l] = ((jis[i] + 1) / 2) + 0xb0;
                }
            } else {
                if (jis[i-1] & 1){
                    sjis[l] = jis[i] + 0x1f;
                } else {
                    sjis[l] = jis[i] + 0x7d;
                }
                if (sjis[l] > 0x7e){
                    sjis[l]++;
                }
            }
            l++;
            f_kana = !f_kana;
        } else if (mode == MODE.ESC){
            esc ~= jis[i];
            if (esc == ESC_KANA){
                mode = MODE.TWO;
                f_kana = true;
            } else if (esc == ESC_ASCII || esc == ESC_ROMAN){
                mode = MODE.ONE;
            }
        }
    }
    sjis.length = l;
    return sjis;
}

はじめ「else if (MODE.ESC)」とかになってたおかげで随分困らせられました。
動いちゃうバグなんて死ねばいいのに!