$continue = 0;
$verbose = 0;
$versionName = "unknown";
$count = 5;
$displayNameFile = "displaynames.txt";
@javatzids = ();
while ($#ARGV >= 0) {
if ($ARGV[0] =~ /^-v/) {
$verbose = 1;
} elsif ($ARGV[0] =~ /^-V/) {
$versionName = $ARGV[1];
shift(@ARGV);
} else {
@javatzids = &readIDs($ARGV[0]);
last;
}
shift(@ARGV);
}
($sec, $min, $hour, $mday, $mon, $year, $wday, $ydat, $isdst) = gmtime();
$baseYear = $year+1900;
if ($verbose == 1) {
print STDERR "baseYear : $baseYear\n";
print STDERR "versionName : $versionName\n";
}
open (DNFD, ">$displayNameFile") || die ("$displayNameFile : open error.\n");
while(<STDIN>) {
chop;
if (/^\#/) {
next;
}
@item = ("foo");
if ($continue == 1) {
s/\#.*//;
s/\s+$//;
s/^\s+//;
@item = split(/\s+/, $_);
@item = ($zname, @item);
} elsif (/^Zone/) {
s/\#.*//;
s/\s+$//;
@item = split(/\s+/, $_);
$zname = $item[1];
if (defined ($zones{$name})) {
printf STDERR "WARNING: duplicate definition of zone $name\n";
}
shift(@item);
}
if (@item[0] ne "foo") {
if($#item == 3) {
$item[3] =~ s/%/%%/;
$zones{$item[0]} = "Zone $item[0]\t$item[1]\t$item[2]\t$item[3]";
} else {
$continue = 1;
next;
}
}
if (/^Rule/) {
($rule, $name, $from, $to, $type, $in, $on, $at, $save, $letter)
= split(/\s+/, $_);
for ($i = 0; $i < $count; $i++) {
if ($from <= $baseYear+$i && ($to >= $baseYear+$i || $to eq "max")
|| ($from == $baseYear+$i && $to eq "only")) {
if ($save ne "0") {
$rules[$i]{$name . "0"} = $_;
} else {
$rules[$i]{$name . "1"} = $_;
}
} else {
if ($from <= $baseYear) {
if ($save ne "0") {
$oldRules[0]{$name} = $_;
} else {
$oldRules[1]{$name} = $_;
}
}
}
}
}
$continue = 0;
}
for ($i = 0, $fd = 0; $i < $count; $i++, $fd++) {
$filename = "year".($baseYear+$i);
open ($fd, ">$filename") || die ("$filename : open error.\n");
print $fd "# Based on $versionName\n";
}
if ($#javatzids < 0) {
@javatzids = keys(%zones);
}
foreach $z (@javatzids) {
next if ($z =~ /Riyadh/);
for ($i = 0, $fd = 0; $i < $count; $i++, $fd++) {
if (!defined($zones{$z})) {
printf $fd "$z ?\n";
printf STDERR "WARNING: java zone $z not found\n";
next;
}
@item = split(/\s+/, $zones{$z});
if ($item[3] ne "-") {
printf $fd "$item[1] $item[2] ";
if (defined($rules[$i]{$item[3] . "0"})
&& defined($rules[$i]{$item[3] . "1"})) {
$rule0 = $rules[$i]{$item[3] . "0"};
$rule1 = $rules[$i]{$item[3] . "1"};
@r0 = split(/\s+/, $rule0);
@r1 = split(/\s+/, $rule1);
printf $fd "$r0[5] $r0[6] $r0[7] $r1[5] $r1[6] $r1[7] $r0[8]\n";
printf $fd "$zones{$z}\n";
printf $fd "$rule0\n";
printf $fd "$rule1\n";
if ($i == 0) {
$std = $dst = $item[4];
$std =~ s/%%s/$r1[9]/;
if ($r1[9] eq "-") {
$std =~ s/-//;
}
$dst =~ s/%%s/$r0[9]/;
if ($r0[9] eq "-") {
$dst =~ s/-//;
}
if ("$std$dst" =~ /[A-Z]/) {
print DNFD "$item[1] $std $dst\n";
}
}
} else {
printf $fd "-\n";
printf $fd "$zones{$z}\n";
printf STDERR "WARNING: $z no rules defined for $item[3]\n";
if ($i == 0) {
if ($item[4] =~ m/%/) {
@r0 = split(/\s+/, $oldRules[0]{$item[3]});
@r1 = split(/\s+/, $oldRules[1]{$item[3]});
if ($i == 0) {
$std = $dst = $item[4];
$std =~ s/%%s/$r1[9]/;
if ($r1[9] eq "-") {
$std =~ s/-//;
}
$dst =~ s/%%s/$r0[9]/;
if ($r0[9] eq "-") {
$dst =~ s/-//;
}
if ("$std$dst" =~ /[A-Z]/) {
print DNFD "$item[1] $std $dst\n";
}
}
} else {
if ("$item[4]" =~ /[A-Z]/) {
print DNFD "$item[1] $item[4]\n";
}
}
}
}
} else {
printf $fd "$item[1] $item[2] $item[3]\n";
printf $fd "$zones{$z}\n";
if ($i == 0 && "$item[4]" =~ /[A-Z]/) {
print DNFD "$item[1] $item[4]\n";
}
}
}
}
close (DNFD);
for ($i = 0, $fd = 0; $i < $count; $i++, $fd++) {
close ($fd);
}
open my $fh, '<', $displayNameFile || die ("Can't open $displayNameFile for sorting\n");;
chomp(my @names = <$fh>);
close $fh;
open my $fh, '>', $displayNameFile;
foreach $line (sort @names) { print $fh $line,"\n"; }
close $fh;
exit(0);
sub readIDs {
local ($file) = @_;
local (@ids, $i);
open(F, $file) || die "Fatal: can't open $file.\n";
$i = 0;
while (<F>) {
chop;
if (/^\#/) {
next;
}
s/^\s+//;
s/\s+$//;
if (/^\s*$/) {
next;
}
$ids[$i++] = $_;
}
close(F);
return @ids;
}