#!/usr/bin/env python

import sys

def print_ucs2mb_one_char(ucs, mb):
    ucslen = len(ucs)
    mblen = len(mb)
    for i in range(0, ucslen):
      sys.stdout.write("<U%04X>" % ord(ucs[i]))
    sys.stdout.write(" ")
    for i in range(0, mblen):
      sys.stdout.write("\\x%02X" % ord(mb[i]))
    sys.stdout.write("\n")

def dump_ucs2mb_iso2022_plane(codeset, plane, escseq):
    state_ascii = 0
    skiplen = 0

    for u in range(0, 0x10000):
        ucs = ''
        if plane == 0 and u >= 0xD800 and u <= 0xDFFF:
            continue
        if escseq[0:3] == "\x1B(B" or escseq[0:3] == "\x1B(J":
            state_ascii = 1
            ucs = unichr(0x3000)
            dummy = ucs.encode(codeset)
            dummy = dummy.replace("\x1B(B", '')
            skiplen = len(dummy)
        ucs += unichr(plane << 16 | u)
        try:
            mb = ucs.encode(codeset)
        except:
            continue
        outesc = mb[skiplen:skiplen + len(escseq)]
        if escseq == outesc:
            if escseq == '\x0E':
                if mb[len(mb)-1] == '\x0F':
                    mb = mb[:len(mb)-1]
                elif ucs == unichr(0x000E):
                    continue
            print_ucs2mb_one_char(unichr(u), mb[skiplen:])

def dump_ucs2mb_iso2022(codeset, escseq):
    dump_ucs2mb_iso2022_plane(codeset, 0, escseq)

if len(sys.argv) != 3:
    print >> sys.stderr, "Usage: ucs2mb_iso2022 <codeset> <escape sequence>"
    sys.exit(1)

codeset = sys.argv[1]
if sys.argv[2][0:3] == "ESC":
    escseq = sys.argv[2]
    escseq = escseq.replace("ESC", "\x1B")
elif sys.argv[2] == "SOSI":
    escseq = "\x0E"
else:
    print >> sys.stderr, "%s: Illegal format.\n", sys.argv[2]
    sys.exit(1)

dump_ucs2mb_iso2022(codeset, escseq)

sys.exit(0)

