#!/usr/bin/env ruby

require 'nkf'

def print_ucs2mb_one_char(ucs, mb)
    ucslen = ucs.length
    mblen = mb.length
    for i in 0..(ucslen-1)
        printf("<U%04X>", ucs[i])
    end
    print " "
    for i in 0..(mblen-1)
        printf("\\x%02X", mb[i])
    end
    print "\n"
end

def dump_ucs2mb_iso2022_plane(nkf_opt, plane, escseq)
    state_ascii = 0

    dummy = NKF.nkf(nkf_opt, [0x3000].pack('U'))
    dummy = dummy.gsub(/\x1B\(B$/,'')

    skiplen = dummy.length

    for u in 0..0xFFFF
        if plane == 0 && u >= 0xD800 && u <= 0xDFFF
            next
        end
        if escseq =~ /^\x1B\([BJ]/
            state_ascii = 1
            ucs = [0x3000].pack('U')
            ucs = ucs + [ plane << 16 | u ].pack('U')
        else
            ucs = [ plane << 16 | u ].pack('U')
        end
        mb = NKF.nkf(nkf_opt, ucs)
        mbnkf = mb
        if state_ascii == 1
            mb = mb[skiplen, mb.length - skiplen]
        end
        outesc = mb[0, escseq.length]
        if outesc == escseq
            mb = mb[escseq.length, mb.length - escseq.length]
            if state_ascii == 0
                mb = mb.gsub(/\x1B\(B/,'')
            end
            if mb.length > 0
                print_ucs2mb_one_char([u], mb)
                #print_ucs2mb_one_char(ucs.unpack('U*'), mbnkf)
            end
        end
    end
end

def dump_ucs2mb_iso2022(codeset, escseq)
    nkf_opt = '--ic=UTF-8 --oc='+codeset+' -x'

    dump_ucs2mb_iso2022_plane(nkf_opt, 0, escseq);
#    dump_ucs2mb_iso2022_plane(nkf_opt, 2, escseq);
end

if ARGV.size != 2
    STDERR.print "Usage: mb2ucs_iso2022_ruby <codeset> <escape sequence>\n"
    exit 1
else
    codeset = ARGV[0]
    escseq  = ARGV[1]
    escseq = escseq.gsub(/ESC/,"\x1B")
    dump_ucs2mb_iso2022(codeset, escseq)
end

exit 0

