#!/usr/bin/perl

use strict;

my $progname=$0; $progname = $& if $progname =~ m,[^/]+$,;

my %PREFIX;   # used to search for prefix numbers
my %ISOCODE;  # used to search for iso codes
my %LANGUAGE; # used to search for language names
my %RESOURCE; # used to search for resource name

#=======================================================================
# Initialisation code - map the DATA into the CODES hash
#=======================================================================
sub init {
    my $prefix;
    my $code;
    my $name;

    while (<DATA>) {
        next unless /\S/;
        chop;
        my ($prefix, $code, $resource, $name) = split(/:/, $_, 4);
        
        $PREFIX{$prefix} = $prefix;
        $PREFIX{$code} = $prefix;
        $PREFIX{$name} = $prefix;
        $PREFIX{$resource} = $prefix;

        $ISOCODE{$prefix} = $code;
        $ISOCODE{$code} = $code;
        $ISOCODE{$name} = $code;
        $ISOCODE{$resource} = $code;
    
        $LANGUAGE{$prefix} = $name;
        $LANGUAGE{$code} = $name;
        $LANGUAGE{$name} = $name;
        $LANGUAGE{$resource} = $name;

        $RESOURCE{$prefix} = $resource;
        $RESOURCE{$code} = $resource;
        $RESOURCE{$name} = $resource;
        $RESOURCE{$resource} = $resource;
    }
}


#=======================================================================
# Usage - error message
#=======================================================================
sub usage {
    my $errmsg = shift;
    my $errcode = shift;
    print STDERR "$progname: $errmsg\n\n" if $errmsg;
    print STDERR "Usage: $progname (-i|-l|-p|-r|-h) (<code>(,<code>)*|all)\n";
    print STDERR "  -h : print this help\n";
    print STDERR "  -i <code>: convert prefix to iso code (ex: 03 -> pt)\n";
    print STDERR "  -l <code>: convert iso code to language name (ex: pt -> Portuguese)\n";
    print STDERR "  -p <code>: convert iso code to prefix (ex: pt -> 03)\n";
    print STDERR "  -r <code>: convert iso code to resource name (ex: pt -> PORT)\n";
    print STDERR "  the code can either be an iso code, a prefix or even a language name\n";
    print STDERR "  The special code \"all\" asks for all possible values.\n\n";
    exit $errcode;
}

#=======================================================================
# Main
#=======================================================================
init();

my ($LanguageCode, $LanguageMap);

while ($ARGV[0] =~ /^-/) {
    $_ = shift;
    if (m/^-i/) {
        $LanguageMap = \%ISOCODE;
    }
    elsif (m/^-l/) {
        $LanguageMap = \%LANGUAGE;
    }
    elsif (m/^-p/) {
        $LanguageMap = \%PREFIX;
    }
    elsif (m/^-r/) {
        $LanguageMap = \%RESOURCE;
    }
    elsif (m/^-h/) {
        usage "", 0;
    }
    else {
        usage "unknown option $_", 1;
    }
}

usage ("no operation specified on command line",1)
    if (!$LanguageMap);

usage ("no language code specified on command line",1)
    if (!($LanguageCode = shift));

if ($LanguageCode =~ (m/^all$/)) {
    # Asked for all codes
    my $old="";
    foreach my $key (sort values %$LanguageMap) {
	if ($key ne $old) {
	    print "$key ";
	    $old=$key;
	}
    }
    print "\n";
    exit 0;
}

usage ("no mapping found for $LanguageCode\n",1)
	if (!(%$LanguageMap->{$LanguageCode}));

print $LanguageMap->{$LanguageCode}, "\n";

1;

__DATA__
01:en:ENUS:English (US)
03:pt:PORT:Portuguese
07:ru:RUSS:Russian
10:eu:BASQUE:Basque
26:ns:NORTHERNSOTHO:Northern Sotho
27:af:AFRIK:Afrikaans
28:zu:ZULU:Zulu
29:tn:TSWANA:Tswana
30:el:GREEK:Greek
31:nl:DTCH:Dutch
33:fr:FREN:French
34:es:SPAN:Spanish
35:fi:FINN:Finnish
36:hu:HUNG:Hungarian
37:ca:CAT:Catalan
38:gl:GALICIAN:Galician
39:it:ITAL:Italian
42:cs:CZECH:Czech
43:sk:SLOVAK:Slovak
45:da:DAN:Danish
46:sv:SWED:Swedish
47:nb:NORBOK:Norwegian Bokmal
48:pl:POL:Polish
49:de:GER:German
50:sl:SLOVENIAN:Slovenian
53:cy:WELSH:Welsh
55:pt-BR:PORTBR:Portuguese (Brazil)
58:lt:LITHUANIAN:Lithuanian
66:th:THAI:Thai
77:et:ESTONIAN:Estonian
79:nn:NORNYN:Norwegian Nynorsk
81:ja:JAPN:Japanese
82:ko:KOREAN:Korean
86:zh-CN:CHINSIM:Chinese Simplified
88:zh-TW:CHINTRAD:Chinese Traditional
90:tr:TURK:Turkish
91:hi:HINDI:Hindi
93:kn:KANNADA:Kannada
96:ar:ARAB:Arabic
97:he:HEBREW:Hebrew
