#!/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);
}

$singlebyte = array_fill(0,256,0);
$doublebyte_1st = array_fill(0,256,0);
$doublebyte_2nd = array_fill(0,256,0);

function is_singlebyte($c)
{
    global $singlebyte;
    return $singlebyte[$c];
}

function is_doublebyte($c1, $c2)
{
    global $doublebyte_1st, $doublebyte_2nd;
    return $doublebyte_1st[$c1] && $doublebyte_2nd[$c2];
}


function print_mb2ucs_one_char($mb, $ucs_bin)
{
    $mblen = strlen($mb);
    $ucs = ucs4ord($ucs_bin);
    $ucslen = count($ucs);
    if ($ucslen == 0) {
        return;
    }
    if ($mblen == 0) {
        $mblen = 1;
        $ucslen = 1;
    }

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

function dump_mb2ucs_iso2022_1($codeset, $escseq)
{
    global $singlebyte;
    $len = strlen($escseq);

    for ($c = 0; $c < 0x100; $c++) {
        $mb = $escseq . pack('C', $c);
        $ucs = mb_convert_encoding($mb, "UCS-4", $codeset);
        if (strlen($ucs) > 0 && ($c == 0x3F || ucs4ord_1char($ucs) != 0x3F)) {
            print_mb2ucs_one_char(substr($mb, $len), $ucs);
            $singlebyte[$c] = 1;
        }
    }
}

function dump_mb2ucs_iso2022_2($codeset, $escseq)
{
    $len = strlen($escseq);

    for ($c1 = 0x21; $c1 < 0x7F; $c1++) {
        if (is_singlebyte($c1)) {
            continue;
        }
        for ($c2 = 0x21; $c2 < 0x7F; $c2++) {
            $mb = $escseq . pack('CC', $c1, $c2);
            $ucs = mb_convert_encoding($mb, "UCS-4", $codeset);
            if (strlen($ucs) > 0 && ucs4ord_1char($ucs) != 0x3F) {
                print_mb2ucs_one_char(substr($mb, $len), $ucs);
            }
        }
    }
}

function dump_mb2ucs_iso2022($codeset, $escseq)
{
    if ($escseq[1] == "(") {
        dump_mb2ucs_iso2022_1($codeset, $escseq);
    } elseif ($escseq[1] == '$') {
        dump_mb2ucs_iso2022_1($codeset, $escseq);
        dump_mb2ucs_iso2022_2($codeset, $escseq);
    } else {
        fputs(STDERR, "Unknown escape sequence.\n");
        exit(1);
    }
}

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_mb2ucs_iso2022($codeset, $escseq);
exit(0);

?>
