aboutsummaryrefslogtreecommitdiff
path: root/libjava/classpath/scripts/timezones.pl
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/scripts/timezones.pl')
-rwxr-xr-xlibjava/classpath/scripts/timezones.pl366
1 files changed, 0 insertions, 366 deletions
diff --git a/libjava/classpath/scripts/timezones.pl b/libjava/classpath/scripts/timezones.pl
deleted file mode 100755
index 142ea4b..0000000
--- a/libjava/classpath/scripts/timezones.pl
+++ /dev/null
@@ -1,366 +0,0 @@
-#!/usr/bin/perl -w
-# Create the timezone tables for java/util/TimeZone from the
-# standard timezone sources by Arthur David Olson (as used by glibc)
-#
-# This needs the files from the package tzdata2000h which may be found
-# at ftp://ftp.cs.mu.oz.au/pub/.
-
-$TIMEZONEDIR = "tzdata";
-@TIMEZONEFILES = ("africa", "antarctica", "asia", "australasia",
- "europe", "northamerica", "pacificnew", "southamerica",
- "../tzabbrevs");
-
-# rules hash table:
-# key is a rule name
-# value is either "-" (no daylight savings) or a list of three elements:
-# $value[0] = end savings rule (list containing MONTH, DAY and TIME)
-# $value[1] = start savings rule (ditto)
-# $value[2] = daylight offset in milliseconds
-my %rules = ("-" => "-");
-
-# timezones list, list of pairs:
-# $timezones[$i][0] is a timezone name
-# $timezones[$i][1] = raw offset in milliseconds
-# $timezones[$i][2] = rule in the same format as the value of
-# the rules table, but TIME in milliseconds
-# $timezones[$i][3] = list of timezone names with this rule (aliases)
-my @timezones = ( [ "GMT", 0, "-", [ "GMT", "UTC" ] ]);
-
-
-# parse the offset of form +/-hh:mm:ss (:ss is optional) and return it
-# in milliseconds against UTC
-sub parseOffset($) {
- my $offset = $_[0];
- $offset =~ /^([+-]?)(\d+)(:(\d+)(:(\d+))?)?$/
- or die "Can't parse offset $offset";
- my $seconds = $2 * 3600;
- $seconds += $4 * 60 if ($3);
- $seconds += $6 if ($3 && $5);
- if ($1 eq "-") {
- $seconds = - $seconds;
- }
- return $seconds * 1000;
-}
-
-# parse the time of form +/-hh:mm:ss[swguz] (:ss is optional) and return it
-# in milliseconds since midnight in local wall time
- my $timezonename;
-sub parseTime($$$) {
- my ($rawoffset, $stdoffset, $time) = @_;
- $time =~ /^([+-]?)(\d+):(\d+)(:(\d+))?([swguz]?)$/
- or die "Can't parse time $time";
- my ($hour, $min) = ($2, $3);
- my $sec = ($4) ? $5 : 0;
- my $millis = ((($hour * 60) + $min) * 60 + $sec) * 1000;
- if ($1 eq "-") {
- $millis = -$millis;
- }
- # Normally millis is in wall time, adjust for utc and standard time.
- if ($6 =~ /[guz]/) {
- $millis += $rawoffset + $stdoffset;
- } elsif ($6 =~ /s/) {
- $millis += $stdoffset;
- }
- return $millis;
-}
-
-my %monthnames =
- ( "Jan" => "1",
- "Feb" => "2",
- "Mar" => "3",
- "Apr" => "4",
- "May" => "5",
- "Jun" => "6",
- "Jul" => "7",
- "Aug" => "8",
- "Sep" => "9",
- "Oct" => "10",
- "Nov" => "11",
- "Dec" => "12" );
-sub parseMonth($) {
- my $month = $monthnames{"$_[0]"} or die "Unknown month $_[0]";
- return $month;
-}
-
-my %weekdaynames =
- ( "Sun" => "7",
- "Mon" => "1",
- "Tue" => "2",
- "Wed" => "3",
- "Thu" => "4",
- "Fri" => "5",
- "Sat" => "6" );
-sub parseWeekday($) {
- my $weekday = $weekdaynames{"$_[0]"} or die "Unknown weekday $_[0]";
- return $weekday;
-}
-
-my @weekdayjavanames =
- ( "Calendar.SUNDAY",
- "Calendar.MONDAY",
- "Calendar.TUESDAY",
- "Calendar.WEDNESDAY",
- "Calendar.THURSDAY",
- "Calendar.FRIDAY",
- "Calendar.SATURDAY" );
-my @daysInMonths = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
-sub parseDay($$$) {
- my ($dayoffset, $month, $day) = @_;
- if ($day =~ /^\d+$/) {
- return "$day, 0";
- } elsif ($day =~ /^last([A-Z][a-z][a-z])$/) {
- my $weekday = ( parseWeekday($1) + $dayoffset + 7 ) % 7;
- if ($dayoffset) {
- my $day = $daysInMonths[$month - 1] + $dayoffset;
- warn "Can only approximate $day with dayoffset in $file"
- if ($month == 2);
- return "$day, -$weekdayjavanames[$weekday]";
- } else {
- return "-1, $weekdayjavanames[$weekday]";
- }
- } elsif ($day =~ /^([A-Z][a-z][a-z])>=(\d+)$/) {
- my $start = $2 + $dayoffset;
- my $weekday = ( parseWeekday($1) + $dayoffset + 7 ) % 7;
- if (($start % 7) == 1) {
- $start = ($start + 6) / 7;
- return "$start, $weekdayjavanames[$weekday]";
- } else {
- return "$start, -$weekdayjavanames[$weekday]";
- }
- } else {
- die "Unknown day $day";
- }
-}
-
-my @monthjavanames =
- ( "Calendar.JANUARY",
- "Calendar.FEBRUARY",
- "Calendar.MARCH",
- "Calendar.APRIL",
- "Calendar.MAY",
- "Calendar.JUNE",
- "Calendar.JULY",
- "Calendar.AUGUST",
- "Calendar.SEPTEMBER",
- "Calendar.OCTOBER",
- "Calendar.NOVEMBER",
- "Calendar.DECEMBER" );
-
-sub parseRule($$$) {
- my ($rawoffset, $stdoffset, $rule) = @_;
- my $monthnr = parseMonth($rule->[0]);
- my $time = parseTime($rawoffset, $stdoffset, $rule->[2]);
- my $dayoffset = 0;
- while ($time < 0) {
- $time += 24*3600*1000;
- $dayoffset--;
- }
- while ($time > 24*3600*1000) {
- $time -= 24*3600*1000;
- $dayoffset++;
- }
- $day = parseDay($dayoffset, $monthnr, $rule->[1]);
- return [ $monthjavanames[$monthnr-1], $day, $time ];
-}
-
-
-sub ruleEquals($$) {
- my ($rule1, $rule2) = @_;
- # check month names
- return (($rule1->[0] eq $rule2->[0])
- && ($rule1->[1] eq $rule2->[1])
- && ($rule1->[2] == $rule2->[2]));
-}
-
-sub findAlias($$) {
- my ($rawoffset, $rule) = @_;
- foreach $tz (@timezones) {
- my ($key, $tzoffset, $tzrule, $aliaslist) = @{$tz};
- next if ($tzoffset != $rawoffset);
- if ($rule eq "-") {
- return $tz if ($tzrule eq "-");
- } elsif ($tzrule ne "-") {
- next if $rule->[2] != $tzrule->[2];
- if (ruleEquals($rule->[0], $tzrule->[0])
- && ruleEquals($rule->[1], $tzrule->[1])) {
- return $tz;
- }
- }
- }
- return "";
-}
-
-sub makePretty($) {
- my ($offset) = @_;
- if (($offset % 3600) == 0) {
- $offset /= 3600;
- return "$offset * 3600";
- } else {
- return "$offset";
- }
-}
-
-sub tzcompare($$) {
- my ($a, $b) = @_;
- if (($a =~ /\//) != ($b =~ /\//)) {
- return ($a =~ /\//) ? 1 : -1;
- } else {
- return $a cmp $b;
- }
-}
-
-foreach $file (@TIMEZONEFILES) {
-# print STDERR "$file\n";
- open INPUT, "$TIMEZONEDIR/$file" or die "Can't open $TIMEZONEDIR/$file";
- my $in_time_zone = 0;
- while (<INPUT>) {
- $_ = $1 if /^([^\#]*)\#/;
- next if /^\s*$/;
- my @entries = split;
-# $, = ","; print "'$_' -> [",@entries,"]\n";
- if (!$in_time_zone) {
- if ($entries[0] eq "Rule") {
- # check if rule still applies
- # column 3 is TO entry.
- if ($entries[3] eq "max") {
- my $rulename = $entries[1];
- my $month = $entries[5];
- my $day = $entries[6];
- my $time = $entries[7];
- if ($entries[8] eq "0") {
- # This is the end time rule
- $rules{"$rulename"}[0] = [ $month, $day, $time ];
- } else {
- # This is the start time rule
- $rules{"$rulename"}[1] = [ $month, $day, $time ];
- $rules{"$rulename"}[2] = parseOffset($entries[8]);
- }
- }
- } elsif ($entries[0] eq "Zone") {
- $in_time_zone = 1;
- shift @entries;
- $timezonename = shift @entries;
- } elsif ($entries[0] eq "Remove") {
- my $found = 0;
- foreach $tz (@timezones) {
- my @newaliases;
- foreach $tzname (@{$tz->[3]}) {
- if ($tzname eq $entries[1]) {
- $found = 1;
- } else {
- push @newaliases, $tzname;
- }
- }
- if ($found) {
- if ($tz->[0] eq $entries[1]) {
- $tz->[0] = $newaliases[0];
- }
- $tz->[3] = \@newaliases;
- last;
- }
- }
-
- die "Unknown link $_" if ! $found;
- } elsif ($entries[0] eq "Link") {
- my $alias = 0;
- foreach $tz (@timezones) {
- foreach $tzname (@{$tz->[3]}) {
- if ($tzname eq $entries[1]) {
- $alias = $tz;
- last;
- }
- }
- }
-
- die "Unknown link $_" if ! $alias;
- die "@entries" if $entries[1] =~ /^\d+$/;
- push @{$alias->[3]}, $entries[2];
- } else {
- die "Unknown command: $_";
- }
- }
- if ($in_time_zone) {
- die "early end of Zone: $_" if ($entries[0] =~ /^[A-Za-z]+/);
- if (@entries <= 3) {
-# print "found ZONE $timezonename $entries[0] $entries[1] $entries[2]\n";
- # This is the last line and the only we look at.
- # other lines are for historic time zones.
- my $rawoffset = parseOffset($entries[0]);
- my $rule = $rules{"$entries[1]"} || "-";
- if ($rule ne "-") {
- if (!defined($rule->[2])) {
- $rule = "-";
- } else {
- # now we can parse the time since we know raw offset.
- my $savings = $rule->[2];
- my $endrule = parseRule($rawoffset, $savings,
- $rule->[0]);
- my $startrule = parseRule($rawoffset, $savings,
- $rule->[1]);
- $rule = [ $endrule, $startrule, $savings ];
-# print "start",@{$rule->[1]}, "end", @{$rule->[0]},
-# "offset", $rule->[2],"\n";
- }
- }
- my $alias = findAlias($rawoffset, $rule);
- if ($alias) {
- if (($alias->[0] =~ /\//)
- && ($timezonename !~ /\//)) {
- # alias is of Country/City form, timezonename not
- # make timezonename the real zone name
- $alias->[0] = $timezonename;
- }
- push @{$alias->[3]}, $timezonename;
- } else {
- push @timezones, [ $timezonename, $rawoffset, $rule,
- [ $timezonename ] ];
- }
- $in_time_zone = 0;
- }
- }
- }
- close INPUT;
-}
-
-@timezones = sort { if ($a->[1] != $b->[1]) { $a->[1] <=> $b->[1] }
- else { $a->[0] cmp $b->[0] } } @timezones;
-for (@timezones) {
- my ($name, $rawoffset, $rule, $aliaslist) = @{$_};
- my @aliases = sort { tzcompare($a, $b); } @{$aliaslist};
- $name = $aliases[0];
- $rawoffset = makePretty($rawoffset);
- if ($rule eq "-") {
- print <<EOF
- tz = new SimpleTimeZone($rawoffset, \"$name\");
-EOF
- } else {
- my ($endmonth, $endday, $endtime) = @{$rule->[0]};
- my ($startmonth, $startday, $starttime) = @{$rule->[1]};
- $endtime = makePretty($endtime);
- $starttime = makePretty($starttime);
- my $savings = $rule->[2];
- if ($savings == 3600 * 1000) {
- print <<EOF
- tz = new SimpleTimeZone
- ($rawoffset, \"$name\",
- $startmonth, $startday, $starttime,
- $endmonth, $endday, $endtime);
-EOF
- } else {
- $savings = makePretty($savings);
- print <<EOF
- tz = new SimpleTimeZone
- ($rawoffset, \"$name\",
- $startmonth, $startday, $starttime,
- $endmonth, $endday, $endtime, $savings);
-EOF
- }
- }
- for (@aliases) {
- print <<EOF
- timezones0.put(\"$_\", tz);
-EOF
- }
-}
-
-