package jp.metanest.tcu; class Converter { class HiLo { private final int hi, lo; HiLo(final int hi, final int lo) { this.hi = hi; this.lo = lo; } int getHi() { return hi; } int getLo() { return lo; } } HiLo linear2hilo(int pp) { assert (pp >= 0) && (pp < 48400); final int hi, lo; if (pp < 8836) { // 94 * 94 == 8836 (A Zone) hi = 0x21 + pp / 94; lo = 0x21 + pp % 94; } else if (pp < 20680) { // 94 * 94 + 94 * 126 == 20680 (B Zone) final int ppp = pp - 8836; hi = 0x80 + ppp / 94; lo = 0x21 + ppp % 94; } else if (pp < 32524) { // 94 * 94 + 94 * 126 + 126 * 94 == 32524 (C Zone) final int ppp = pp - 20680; hi = 0x21 + ppp / 126; lo = 0x80 + ppp % 126; } else { // (D Zone) final int ppp = pp - 32524; hi = 0x80 + ppp / 126; lo = 0x80 + ppp % 126; } return new HiLo(hi, lo); } TRONCode to_tc(final JISX0208_1990 cp) { final int hi = 0x20 + cp.getKu(); final int lo = 0x20 + cp.getTen(); final TRONCode tc = new TRONCode(1, (hi << 8) | lo); return tc; } TRONCode to_tc(final JISX0213_2000 cp) { int hi = 0; switch (cp.getMen()) { case 1: hi = 0x20 + cp.getKu(); break; case 2: final int ku = cp.getKu(); if (ku == 1) { hi = 0x87; } else if ((ku >= 3) && (ku <= 5)) { hi = 0x88 - 3 + ku; } else if (ku == 8) { hi = 0x8B; } else if ((ku >= 12) && (ku <= 15)) { hi = 0x8C - 12 + ku; } else if ((ku >= 78) && (ku <= 94)) { hi = 0x90 - 78 + ku; } else { assert false; } break; default: assert false; } assert hi != 0; final int lo = 0x20 + cp.getTen(); final TRONCode tc = new TRONCode(1, (hi << 8) | lo); return tc; } TRONCode to_tc(final JISX0212_1990 cp) { final int hi = 0xA0 + cp.getKu(); final int lo = 0x20 + cp.getTen(); final TRONCode tc = new TRONCode(1, (hi << 8) | lo); return tc; } TRONCode to_tc(final GB2312_1980 cp) { final int p = (cp.getKu() - 1) * 94 + (cp.getTen() - 1); final int hi = 0x21 + p / 126; final int lo = 0x80 + p % 126; final TRONCode tc = new TRONCode(1, (hi << 8) | lo); return tc; } TRONCode to_tc(final KSX1001_1997 cp) { final int p = (cp.getKu() - 1) * 94 + (cp.getTen() - 1); final int hi = 0xB7 + p / 126; final int lo = 0x80 + p % 126; final TRONCode tc = new TRONCode(1, (hi << 8) | lo); return tc; } TRONCode to_tc(final GT cp) { final int p = cp.getBangou() - 1; final int men = 2 + p / 48400; assert men <= 3; // may be extended final HiLo hilo = linear2hilo(p % 48400); final TRONCode tc = new TRONCode(men, (hilo.getHi() << 8) | hilo.getLo()); return tc; } TRONCode to_tc(final CNS11643_1992 cp) { final int jm = cp.getJimen(); int men = 0; int pp = 0; if ((jm >= 1) && (jm <= 3)) { men = 6; pp = (jm - 1) * 8836 + (cp.getKu() - 1) * 94 + (cp.getTen() - 1); } else if (jm == 4) { men = 6; pp = 26602 + (cp.getKu() - 1) * 94 + (cp.getTen() - 1); } else if (jm == 5) { men = 6; pp = 35548 + (cp.getKu() - 1) * 94 + (cp.getTen() - 1); } else if ((jm >= 6) && (jm <= 7)) { men = 7; pp = (jm - 6) * 8836 + (cp.getKu() - 1) * 94 + (cp.getTen() - 1); } else { assert false; // according to Chokanji V moji-kensaku } assert men != 0; final HiLo hilo = linear2hilo(pp); final TRONCode tc = new TRONCode(men, (hilo.getHi() << 8) | hilo.getLo()); return tc; } TRONCode to_tc(final Unicode_2 cp) { final int ucp = cp.getCp(); int men = 0; if (ucp < 44032) { men = 16; } else if (ucp < 65536) { men = 17; } else { assert false; // other than BMP } assert men != 0; final int pp = ucp % 44032; final HiLo hilo = linear2hilo(pp); final TRONCode tc = new TRONCode(men, (hilo.getHi() << 8) | hilo.getLo()); return tc; } }