Modest/utils/MyHTML/encoding.pl

166 lines
3.3 KiB
Perl
Raw Normal View History

2016-12-26 16:58:10 +03:00
#!/usr/bin/perl -w
BEGIN {
use FindBin;
push @INC, $FindBin::Bin. "/../ext/";
};
use bytes;
use strict;
use Encode;
use JSON::XS;
use MyHTML::Base;
my $base_path = "tmpl/encoding";
#for_txt_files($base_path);
for_json("$base_path/indexes.json");
#for_single_byte("$base_path/encodings.json");
sub for_json {
my ($filename) = @_;
my $myhtml_encoding_list = {};
open my $fh, "<", $filename or die "Oh God, can't open $filename: $!\n";
binmode $fh, ":utf8";
my $json_obj = JSON::XS->new->utf8->decode(join "", <$fh>);
close $fh;
foreach my $name (sort {$a cmp $b} keys %$json_obj) {
print_res($json_obj->{$name}, $name, $myhtml_encoding_list);
}
}
sub for_single_byte {
my ($filename) = @_;
my $myhtml_encoding_list = {};
open my $fh, "<", $filename or die "Oh God, can't open $filename: $!\n";
binmode $fh, ":utf8";
my $json_obj = JSON::XS->new->utf8->decode(join "", <$fh>);
close $fh;
foreach my $entry (@$json_obj)
{
if($entry->{heading} =~ /single-byte/)
{
foreach my $encode (@{$entry->{encodings}}) {
print_single_byte_func($encode->{name});
}
last;
}
}
foreach my $entry (@$json_obj)
{
if($entry->{heading} =~ /single-byte/)
{
foreach my $encode (@{$entry->{encodings}}) {
convert_name($encode->{name});
print "enum myhtml_encoding_status myhtml_encoding_decode_$encode->{name}(unsigned const char data, myhtml_encoding_result_t *res);\n"
}
last;
}
}
}
sub print_single_byte_func {
my ($name) = @_;
convert_name($name);
print "enum myhtml_encoding_status myhtml_encoding_decode_$name(unsigned const char data, myhtml_encoding_result_t *res)
{
if(data >= 0x00 && data <= 0x7F)
(res->result = data);
else
(res->result = myhtml_encoding_map_$name"."[(data - 0x80)]);
return MyHTML_ENCODING_STATUS_OK;
}\n\n";
}
sub for_txt_files {
my ($base_path) = @_;
my $myhtml_encoding_list = {};
opendir my $dh, $base_path || die "can't opendir $base_path: $!";
foreach my $name (readdir($dh)) {
next if $name !~ /txt$/;
my $res = read_file("$base_path/$name");
print_res($res, $name, $myhtml_encoding_list);
#print "$name\n";
}
closedir $dh;
}
sub read_file {
my ($filepath) = @_;
my $res = [];
open my $fh, "<", $filepath or die "can't open file $filepath: $!";
while (my $line = <$fh>) {
next if $line =~ /^\#/;
$line =~ s/^\s+//;
$line =~ s/\s+\z//;
next unless $line;
my ($pos, $data, undef) = split /\s+/, $line, 3;
next unless $data;
$res->[$pos] = $data;
}
close $fh;
$res;
}
sub print_res {
my ($res, $name, $myhtml_encoding_list) = @_;
convert_name($name);
my $var_name = "myhtml_encoding_map_$name";
if($name =~ /gb18030_ranges/) {
print "static const unsigned long $var_name"."[][2] = {\n";
}
else {
print "static const unsigned long $var_name"."[] = {\n";
$myhtml_encoding_list->{"MyHTML_ENCODING_". uc($name)} = $name unless $name =~ /JIS02/i;
}
foreach my $key (0..$#$res) {
if (ref $res->[$key]) {
print "\t" unless $key % 5;
print "{$res->[$key][0], $res->[$key][1]}, ";
print "\n" unless ($key + 1) % 5;
}
else {
print "\t" unless $key % 10;
print $res->[$key]||'0x0000', ", ";
#print sprintf("0x%02x\n", $num);
print "\n" unless ($key + 1) % 10;
}
}
print "\n};\n\n";
}
sub convert_name {
$_[0] =~ s/\.txt$//;
$_[0] =~ s/[-\s]+/_/g;
}