#!/usr/bin/env php
<?php
#include 'ucs4lib.php';

function ucs4ord($c)
{
    return unpack('N*', $c);
}

function ucs4ord_1char($c)
{
    $u = ucs4ord($c);
    return $u[1];
}

function ucs4chr($u)
{
    return pack('N*', $u);
}

function print_ucs2mb_one_char($ucs, $mb)
{
    $mblen = strlen($mb);

    printf("<U%04X> ", $ucs);
    for ($i = 0; $i < $mblen; $i++) {
        printf("\\x%02X", ord(substr($mb, $i, 1)));
    }
    print "\n";
}

function dump_ucs2mb_iso2022_plane($codeset, $plane, $escseq)
{
    $state_ascii = 0;
    $dummy = mb_convert_encoding(ucs4chr(0x3000), $codeset, "UCS-4");
    $dummy = ereg_replace("\x1B\(B", "", $dummy);
    $skiplen = strlen($dummy);

    for ($u = 0; $u < 0x10000; $u++) {
        if ($plane == 0 && $u >= 0xD800 && $u <= 0xDFFF) {
            continue;
        }
        $ucs = "";
        if (ereg("\x1B\([BJ]", $escseq)) {
            $state_ascii = 1;
            $ucs = ucs4chr(0x3000);
        }
        $u |= $plane << 16;
        $ucs .= ucs4chr($u);
        $mb = mb_convert_encoding($ucs, $codeset, "UCS-4");
        if ($state_ascii) {
            $mb = substr($mb, $skiplen);
        }
        $outesc = substr($mb, 0, strlen($escseq));
        if (strcmp($outesc, $escseq) == 0) {
            $mb = substr($mb, strlen($escseq));
            if (!$state_ascii || ereg("\x1B\(J", $escseq)) {
                $mb = ereg_replace("\x1B\(B", "", $mb);
            }
//            if ($u == 0x003F || !(ord($mb) == 0x3F)) {
                print_ucs2mb_one_char($u, $mb);
//            }
        }
    }
}

function dump_ucs2mb_iso2022($codeset, $escseq)
{
    dump_ucs2mb_iso2022_plane($codeset, 0, $escseq);
//    dump_ucs2mb_iso2022_plane($codeset, 2, $escseq);
}

if ($argc != 3) {
    fputs(STDERR, "Usage: php_mb2ucs_iso2022 <codeset> <escape sequence>\n");
    exit(1);
}
$codeset = $argv[1];
if (ereg("^ESC", $argv[2])) {
    $escseq = $argv[2];
    $escseq = ereg_replace("ESC", "\x1B", $escseq);
} else {
   fputs(STDERR, "$argv[2]: Illegal format.\n");
   exit(1);
}

dump_ucs2mb_iso2022($codeset, $escseq);
exit(0);

?>
