#! /usr/local/bin/perl -w

use strict;

my %ipa2uni = (
  101=>0x70,  102=>0x62,  103=>0x74,  104=>0x64,
  109=>0x6b,  110=>0x261,
  114=>0x6d,  116=>0x6e,  119=>0x14b,  124=>0x27e,
  128=>0x66,  129=>0x76,  130=>0x3b8,  131=>0xf0,
  132=>0x73,  133=>0x7a,  134=>0x283,  135=>0x292,
  146=>0x68,
  151=>0x279,  153=>0x6a,  155=>0x6c,
  169=>0x28d,  170=>0x77,
  213=>0x2a7,  214=>0x2a4,
  301=>0x69,  302=>0x65,  303=>0x25b,  304=>0x61,
  305=>0x251,  306=>0x254,  307=>0x6f,  308=>0x75,
  313=>0x252,  314=>0x28c,
  319=>0x26a,  320=>0x28f,  321=>0x28a,  322=>0x259,
  325=>0xe6,  326=>0x25c,  327=>0x25a,
  419=>0x2de,  431=>0x329,
  501=>0x2c8,  502=>0x2cc,  503=>0x2d0,  506=>0x2e,
);

my %htmlentities = (
  160=>"nbsp",  161=>"iexcl",  162=>"cent",  163=>"pound",
  164=>"curren",  165=>"yen",  166=>"brvbar",  167=>"sect",
  168=>"uml",  169=>"copy",  170=>"ordf",  171=>"laquo",
  172=>"not",  173=>"shy",  174=>"reg",  175=>"macr",
  176=>"deg",  177=>"plusmn",  178=>"sup2",  179=>"sup3",
  180=>"acute",  181=>"micro",  182=>"para",  183=>"middot",
  184=>"cedil",  185=>"sup1",  186=>"ordm",  187=>"raquo",
  188=>"frac14",  189=>"frac12",  190=>"frac34",  191=>"iquest",
  192=>"Agrave",  193=>"Aacute",  194=>"Acirc",  195=>"Atilde",
  196=>"Auml",  197=>"Aring",  198=>"AElig",  199=>"Ccedil",
  200=>"Egrave",  201=>"Eacute",  202=>"Ecirc",  203=>"Euml",
  204=>"Igrave",  205=>"Iacute",  206=>"Icirc",  207=>"Iuml",
  208=>"ETH",  209=>"Ntilde",  210=>"Ograve",  211=>"Oacute",
  212=>"Ocirc",  213=>"Otilde",  214=>"Ouml",  215=>"times",
  216=>"Oslash",  217=>"Ugrave",  218=>"Uacute",  219=>"Ucirc",
  220=>"Uuml",  221=>"Yacute",  222=>"THORN",  223=>"szlig",
  224=>"agrave",  225=>"aacute",  226=>"acirc",  227=>"atilde",
  228=>"auml",  229=>"aring",  230=>"aelig",  231=>"ccedil",
  232=>"egrave",  233=>"eacute",  234=>"ecirc",  235=>"euml",
  236=>"igrave",  237=>"iacute",  238=>"icirc",  239=>"iuml",
  240=>"eth",  241=>"ntilde",  242=>"ograve",  243=>"oacute",
  244=>"ocirc",  245=>"otilde",  246=>"ouml",  247=>"divide",
  248=>"oslash",  249=>"ugrave",  250=>"uacute",  251=>"ucirc",
  252=>"uuml",  253=>"yacute",  254=>"thorn",  255=>"yuml",
  338=>"OElig",  339=>"oelig",  352=>"Scaron",  353=>"scaron",
  376=>"Yuml",  710=>"circ",  732=>"tilde",  8194=>"ensp",
  8195=>"emsp",  8201=>"thinsp",  8204=>"zwnj",  8205=>"zwj",
  8206=>"lrm",  8207=>"rlm",  8211=>"ndash",  8212=>"mdash",
  8216=>"lsquo",  8217=>"rsquo",  8218=>"sbquo",  8220=>"ldquo",
  8221=>"rdquo",  8222=>"bdquo",  8224=>"dagger",  8225=>"Dagger",
  8240=>"permil",  8249=>"lsaquo",  8250=>"rsaquo",  8364=>"euro",
  402=>"fnof",  913=>"Alpha",  914=>"Beta",  915=>"Gamma",
  916=>"Delta",  917=>"Epsilon",  918=>"Zeta",  919=>"Eta",
  920=>"Theta",  921=>"Iota",  922=>"Kappa",  923=>"Lambda",
  924=>"Mu",  925=>"Nu",  926=>"Xi",  927=>"Omicron",
  928=>"Pi",  929=>"Rho",  931=>"Sigma",  932=>"Tau",
  933=>"Upsilon",  934=>"Phi",  935=>"Chi",  936=>"Psi",
  937=>"Omega",  945=>"alpha",  946=>"beta",  947=>"gamma",
  948=>"delta",  949=>"epsilon",  950=>"zeta",  951=>"eta",
  952=>"theta",  953=>"iota",  954=>"kappa",  955=>"lambda",
  956=>"mu",  957=>"nu",  958=>"xi",  959=>"omicron",
  960=>"pi",  961=>"rho",  962=>"sigmaf",  963=>"sigma",
  964=>"tau",  965=>"upsilon",  966=>"phi",  967=>"chi",
  968=>"psi",  969=>"omega",  977=>"thetasym",  978=>"upsih",
  982=>"piv",  8226=>"bull",  8230=>"hellip",  8242=>"prime",
  8243=>"Prime",  8254=>"oline",  8260=>"frasl",  8472=>"weierp",
  8465=>"image",  8476=>"real",  8482=>"trade",  8501=>"alefsym",
  8592=>"larr",  8593=>"uarr",  8594=>"rarr",  8595=>"darr",
  8596=>"harr",  8629=>"crarr",  8656=>"lArr",  8657=>"uArr",
  8658=>"rArr",  8659=>"dArr",  8660=>"hArr",  8704=>"forall",
  8706=>"part",  8707=>"exist",  8709=>"empty",  8711=>"nabla",
  8712=>"isin",  8713=>"notin",  8715=>"ni",  8719=>"prod",
  8721=>"sum",  8722=>"minus",  8727=>"lowast",  8730=>"radic",
  8733=>"prop",  8734=>"infin",  8736=>"ang",  8743=>"and",
  8744=>"or",  8745=>"cap",  8746=>"cup",  8747=>"int",
  8756=>"there4",  8764=>"sim",  8773=>"cong",  8776=>"asymp",
  8800=>"ne",  8801=>"equiv",  8804=>"le",  8805=>"ge",
  8834=>"sub",  8835=>"sup",  8836=>"nsub",  8838=>"sube",
  8839=>"supe",  8853=>"oplus",  8855=>"otimes",  8869=>"perp",
  8901=>"sdot",  8968=>"lceil",  8969=>"rceil",  8970=>"lfloor",
  8971=>"rfloor",  9001=>"lang",  9002=>"rang",  9674=>"loz",
  9824=>"spades",  9827=>"clubs",  9829=>"hearts",  9830=>"diams",
);

sub putunichar {
    my $n = shift;
    if ( ( $n >= 33 ) && ( $n < 127 ) ) {
	print chr($n);
    } elsif ( defined($htmlentities{$n}) ) {
	print "&$htmlentities{$n};";
    } else {
	print "&#$n;";
    }
};

while ( <> ) {
    while ( 1 ) {
	if ( /^$/ || /^\#.*$/ ) {
	    print "\n";
	    last;
	} elsif ( s/^\[326\]\[419\]// ) {
	    putunichar 0x25d;
	} elsif ( s/^\[(\d+)\]// ) {
	    if ( defined($ipa2uni{$1}) ) {
		putunichar $ipa2uni{$1};
	    } else {
		die "Unknown IPA code ($1)";
	    }
	} elsif ( s/^(\s+)// ) {
	    print $1;
	} elsif ( s/^(.)// ) {
	    print STDERR "Line remainder is $_";
	    die "Unrecognized character ($1)";
	}
    }
}
