Imported Debian patch 0.63.0-6
[hcoop/debian/courier-authlib.git] / unicode / mkkoi8r.pl
diff --git a/unicode/mkkoi8r.pl b/unicode/mkkoi8r.pl
new file mode 100644 (file)
index 0000000..6a649b9
--- /dev/null
@@ -0,0 +1,191 @@
+# Copyright 2000-2002 Double Precision, Inc.
+# See COPYING for distribution information.
+#
+# $Id: mkkoi8r.pl,v 1.4 2003/08/19 02:25:23 mrsam Exp $
+#
+# Generate iso-8859* unicode tables
+
+open (U, "UnicodeData.txt") || die "$!\n";
+
+while (<U>)
+{
+       chomp;
+
+my @fields= split /;/;
+
+my ($code, $uc, $lc, $tc);
+
+       $code="0x$fields[0]";
+       eval "\$code=$code;";
+
+       $uc=$fields[12];
+       if ($uc ne "")
+       {
+               eval "\$uc=0x$uc;";
+               $UC{$code}=$uc;
+       }
+
+       $lc=$fields[13];
+       if ($lc ne "")
+       {
+               eval "\$lc=0x$lc;";
+               $LC{$code}=$lc;
+       }
+
+       $tc=$fields[14];
+       if ($tc ne "")
+       {
+               eval "\$tc=0x$tc;";
+               $TC{$code}=$tc;
+       }
+}
+
+close(U);
+
+my @fwd;
+
+my $rev;
+
+open (SET, "koi8-r.txt") || die "koi8-r.txt: $!\n";
+while (<SET>)
+{
+       chomp;
+       s/\#.*//;
+
+my ($code, $unicode)=split /[ \t]+/;
+
+       next unless $code ne "";
+
+       eval "\$code=$code;";
+       eval "\$unicode=$unicode;";
+
+       die if $code < 0 || $code > 255;
+
+       $fwd[$code]=$unicode;
+       $rev{$unicode}=$code;
+}
+close(SET);
+
+my $fwdname="koi8_tab";
+
+print '
+/*
+** Copyright 2000-2002 Double Precision, Inc.
+** See COPYING for distribution information.
+**
+** $Id: mkkoi8r.pl,v 1.4 2003/08/19 02:25:23 mrsam Exp $
+*/
+
+#include "unicode.h"
+';
+
+
+print "static const unicode_char $fwdname [128]={\n";
+for ($i=0; $i<128; $i++)
+{
+    die "Unicode map not US-ASCII: $i\n" unless $fwd[$i] == $i;
+}
+
+for ($i=128; $i<256; $i++)
+{
+my $n=$fwd[$i];
+
+       $n=0 unless $n;
+
+       print "$n";
+       print "," if $i < 255;
+       print "\n" if ($i % 16) == 15;
+}
+
+print "};\n";
+
+my $ucname="koi8_uc";
+
+print "static const char $ucname [256]={\n";
+
+for ($i=0; $i<256; $i++)
+{
+my $unicode=$fwd[$i];
+
+       $unicode=$UC{$unicode} && $rev{$UC{$unicode}} ? $rev{$UC{$unicode}}:$i;
+
+       printf("(char)0x%02x", $unicode);
+       print "," if $i < 255;
+       print "\n" if ($i % 8) == 7;
+}
+
+print "};\n";
+
+my $lcname="koi8_lc";
+
+print "static const char $lcname [256]={\n";
+
+for ($i=0; $i<256; $i++)
+{
+my $unicode=$fwd[$i];
+
+       $unicode=$LC{$unicode} && $rev{$LC{$unicode}} ? $rev{$LC{$unicode}}:$i;
+
+       printf("(char)0x%02x", $unicode);
+       print "," if $i < 255;
+       print "\n" if ($i % 8) == 7;
+}
+
+print "};\n";
+
+my $tcname="koi8_tc";
+
+print "static const char $tcname [256]={\n";
+
+for ($i=0; $i<256; $i++)
+{
+my $unicode=$fwd[$i];
+
+       $unicode=$TC{$unicode} && $rev{$TC{$unicode}} ? $rev{$TC{$unicode}}:$i;
+
+       printf("(char)0x%02x", $unicode);
+       print "," if $i < 255;
+       print "\n" if ($i % 8) == 7;
+}
+
+my $structname="unicode_KOI8R";
+my $chsetname="KOI8-R";
+
+print "};
+
+
+static unicode_char *c2u(const struct unicode_info *u, const char *cp, int *ip)
+{
+       return (unicode_iso8859_c2u(cp, ip, $fwdname));
+}
+
+static char *u2c(const struct unicode_info *u, const unicode_char *cp, int *ip)
+{
+       return (unicode_iso8859_u2c(cp, ip, $fwdname));
+}
+
+static char *toupper_func(const struct unicode_info *u, const char *cp, int *ip)
+{
+       return (unicode_iso8859_convert(cp, ip, $ucname));
+}
+
+static char *tolower_func(const struct unicode_info *u, const char *cp, int *ip)
+{
+       return (unicode_iso8859_convert(cp, ip, $lcname));
+}
+
+static char *totitle_func(const struct unicode_info *u, const char *cp, int *ip)
+{
+       return (unicode_iso8859_convert(cp, ip, $tcname));
+}
+
+const struct unicode_info $structname = {
+       \"$chsetname\",
+       UNICODE_USASCII,
+       c2u,
+       u2c,
+       toupper_func,
+       tolower_func,
+       totitle_func};
+";