Sebastian Kuschel reports that pfd_closing can be called for a socket
[u/mdw/putty] / charset / sbcsgen.pl
CommitLineData
2dc6356a 1#!/usr/bin/env perl -w
2
3# This script generates sbcsdat.c (the data for all the SBCSes) from its
4# source form sbcs.dat.
5
6$infile = "sbcs.dat";
7$outfile = "sbcsdat.c";
8
9open FOO, $infile;
10open BAR, ">$outfile";
11select BAR;
12
13print "/*\n";
14print " * sbcsdat.c - data definitions for single-byte character sets.\n";
15print " *\n";
16print " * Generated by sbcsgen.pl from sbcs.dat.\n";
17print " * You should edit those files rather than editing this one.\n";
18print " */\n";
19print "\n";
20print "#ifndef ENUM_CHARSETS\n";
21print "\n";
22print "#include \"charset.h\"\n";
23print "#include \"internal.h\"\n";
24print "\n";
25
26my $charsetname = undef;
27my @vals = ();
28
29my @charsetnames = ();
1d875448 30my @sortpriority = ();
2dc6356a 31
32while (<FOO>) {
33 chomp;
34 if (/^charset (.*)$/) {
35 $charsetname = $1;
36 @vals = ();
1d875448 37 @sortpriority = map { 0 } 0..255;
38 } elsif (/^sortpriority ([^-]*)-([^-]*) (.*)$/) {
39 for ($i = hex $1; $i <= hex $2; $i++) {
40 $sortpriority[$i] += $3;
41 }
2dc6356a 42 } elsif (/^[0-9a-fA-FX]/) {
43 push @vals, map { $_ eq "XXXX" ? -1 : hex $_ } split / +/, $_;
44 if (scalar @vals > 256) {
45 die "$infile:$.: charset $charsetname has more than 256 values\n";
46 } elsif (scalar @vals == 256) {
1d875448 47 &outcharset($charsetname, \@vals, \@sortpriority);
2dc6356a 48 push @charsetnames, $charsetname;
49 $charsetname = undef;
50 @vals = ();
1d875448 51 @sortpriority = map { 0 } 0..255;
2dc6356a 52 }
53 }
54}
55
56print "#else /* ENUM_CHARSETS */\n";
57print "\n";
58
59foreach $i (@charsetnames) {
60 print "ENUM_CHARSET($i)\n";
61}
62
63print "\n";
64print "#endif /* ENUM_CHARSETS */\n";
65
1d875448 66sub outcharset($$$) {
67 my ($name, $vals, $sortpriority) = @_;
2dc6356a 68 my ($prefix, $i, @sorted);
69
70 print "static const sbcs_data data_$name = {\n";
71 print " {\n";
72 $prefix = " ";
73 @sorted = ();
74 for ($i = 0; $i < 256; $i++) {
1d875448 75 if ($vals->[$i] < 0) {
2dc6356a 76 printf "%sERROR ", $prefix;
77 } else {
1d875448 78 printf "%s0x%04x", $prefix, $vals->[$i];
79 die "ooh? $i\n" unless defined $sortpriority->[$i];
80 push @sorted, [$i, $vals->[$i], 0+$sortpriority->[$i]];
2dc6356a 81 }
82 if ($i % 8 == 7) {
83 $prefix = ",\n ";
84 } else {
85 $prefix = ", ";
86 }
87 }
88 print "\n },\n {\n";
3eb844f4 89 @sorted = sort { ($a->[1] == $b->[1] ?
90 $b->[2] <=> $a->[2] :
91 $a->[1] <=> $b->[1]) ||
92 $a->[0] <=> $b->[0] } @sorted;
2dc6356a 93 $prefix = " ";
1d875448 94 $uval = -1;
95 for ($i = $j = 0; $i < scalar @sorted; $i++) {
96 next if ($uval == $sorted[$i]->[1]); # low-priority alternative
97 $uval = $sorted[$i]->[1];
2dc6356a 98 printf "%s0x%02x", $prefix, $sorted[$i]->[0];
1d875448 99 if ($j % 8 == 7) {
2dc6356a 100 $prefix = ",\n ";
101 } else {
102 $prefix = ", ";
103 }
1d875448 104 $j++;
2dc6356a 105 }
acb5254a 106 printf "\n },\n %d\n", $j;
2dc6356a 107 print "};\n";
108 print "const charset_spec charset_$name = {\n" .
109 " $name, read_sbcs, write_sbcs, &data_$name\n};\n\n";
110}