#!/usr/bin/env python

import sys

def print_mb2ucs_one_char(mb, ucs):
    mblen = len(mb)
    ucslen = len(ucs)

    if mblen == 0:
        mblen = 1
        ucslen = 1

    if ucslen == 0:
        for i in range(0, mblen):
            sys.stderr.write("\\x%02X" % ord(mb[i]))
        sys.stderr.write("\n")
        return
    if ucslen > 1:
        for i in range(0, mblen):
            sys.stderr.write("\\x%02X" % ord(mb[i]))
        sys.stderr.write(" ")
        for i in range(0, ucslen):
            sys.stderr.write("<U%04X>" % ord(ucs[i]))
        sys.stderr.write("\n")
        return

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

def dump_mb2ucs_iso2022_1(codeset, escseq):
    for c1 in range(0x00,0x80):
        if escseq[0] == '\x1B':
            mb = escseq + chr(c1)
        elif escseq[0] == '\x0E':
            mb = '\x0E' + chr(c1) + '\x0F'

        try:
            ucs = mb.decode(codeset)
        except:
            continue
        print_mb2ucs_one_char(mb, ucs)

def dump_mb2ucs_iso2022_2(codeset, escseq):
    for c1 in range(0x21,0x100):
        for c2 in range(0x21,0x7F):
            mb = escseq + chr(c1) + chr(c2)
            try:
                ucs = mb.decode(codeset)
            except:
                continue
            print_mb2ucs_one_char(mb, ucs)

def dump_mb2ucs_iso2022(codeset, escseq):
    if escseq[0] == '\x1B':
        if escseq[1] == '(':
            dump_mb2ucs_iso2022_1(codeset, escseq)
        elif escseq[1] == '$':
            dump_mb2ucs_iso2022_2(codeset, escseq)
        else:
            print >> sys.stderr, "Unknown escape sequence."
            sys.exit(1)
    elif escseq[0] == '\x0E':
        dump_mb2ucs_iso2022_1(codeset, escseq)

if len(sys.argv) != 3:
    print >> sys.stderr, "Usage: mb2ucs_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_mb2ucs_iso2022(codeset, escseq)

sys.exit(0)

