First draft of Unicode support in pterm. It's pretty complete: it
[sgt/putty] / charset / sbcsgen.pl
diff --git a/charset/sbcsgen.pl b/charset/sbcsgen.pl
new file mode 100644 (file)
index 0000000..0d6ebc9
--- /dev/null
@@ -0,0 +1,95 @@
+#!/usr/bin/env perl -w
+
+# This script generates sbcsdat.c (the data for all the SBCSes) from its
+# source form sbcs.dat.
+
+$infile = "sbcs.dat";
+$outfile = "sbcsdat.c";
+
+open FOO, $infile;
+open BAR, ">$outfile";
+select BAR;
+
+print "/*\n";
+print " * sbcsdat.c - data definitions for single-byte character sets.\n";
+print " *\n";
+print " * Generated by sbcsgen.pl from sbcs.dat.\n";
+print " * You should edit those files rather than editing this one.\n";
+print " */\n";
+print "\n";
+print "#ifndef ENUM_CHARSETS\n";
+print "\n";
+print "#include \"charset.h\"\n";
+print "#include \"internal.h\"\n";
+print "\n";
+
+my $charsetname = undef;
+my @vals = ();
+
+my @charsetnames = ();
+
+while (<FOO>) {
+    chomp;
+    if (/^charset (.*)$/) {
+       $charsetname = $1;
+       @vals = ();
+    } elsif (/^[0-9a-fA-FX]/) {
+       push @vals, map { $_ eq "XXXX" ? -1 : hex $_ } split / +/, $_;
+       if (scalar @vals > 256) {
+           die "$infile:$.: charset $charsetname has more than 256 values\n";
+       } elsif (scalar @vals == 256) {
+           &outcharset($charsetname, @vals);
+           push @charsetnames, $charsetname;
+           $charsetname = undef;
+           @vals = ();
+       }
+    }
+}
+
+print "#else /* ENUM_CHARSETS */\n";
+print "\n";
+
+foreach $i (@charsetnames) {
+    print "ENUM_CHARSET($i)\n";
+}
+
+print "\n";
+print "#endif /* ENUM_CHARSETS */\n";
+
+sub outcharset($@) {
+    my ($name, @vals) = @_;
+    my ($prefix, $i, @sorted);
+
+    print "static const sbcs_data data_$name = {\n";
+    print "    {\n";
+    $prefix = "    ";
+    @sorted = ();
+    for ($i = 0; $i < 256; $i++) {
+       if ($vals[$i] < 0) {
+           printf "%sERROR ", $prefix;
+       } else {
+           printf "%s0x%04x", $prefix, $vals[$i];
+           push @sorted, [$i, $vals[$i]];
+       }
+       if ($i % 8 == 7) {
+           $prefix = ",\n    ";
+       } else {
+           $prefix = ", ";
+       }
+    }
+    print "\n    },\n    {\n";
+    @sorted = sort { $a->[1] <=> $b->[1] } @sorted;
+    $prefix = "    ";
+    for ($i = 0; $i < scalar @sorted; $i++) {
+       printf "%s0x%02x", $prefix, $sorted[$i]->[0];
+       if ($i % 8 == 7) {
+           $prefix = ",\n    ";
+       } else {
+           $prefix = ", ";
+       }
+    }
+    printf "\n    },\n    %d\n", scalar @sorted;
+    print "};\n";
+    print "const charset_spec charset_$name = {\n" .
+          "    $name, read_sbcs, write_sbcs, &data_$name\n};\n\n";
+}