mirror of
https://github.com/lexborisov/Modest
synced 2024-11-25 07:09:35 +03:00
166 lines
3.3 KiB
Perl
166 lines
3.3 KiB
Perl
|
#!/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;
|
||
|
}
|
||
|
|
||
|
|