]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/tzdata/zoneinfo2tdf.pl
MFC r368207,368607:
[FreeBSD/stable/10.git] / contrib / tzdata / zoneinfo2tdf.pl
1 #! /usr/bin/perl -w
2 # Summarize .zi input in a .zi-like format.
3
4 # Courtesy Ken Pizzini.
5
6 use strict;
7
8 #This file released to the public domain.
9
10 # Note: error checking is poor; trust the output only if the input
11 # has been checked by zic.
12
13 my $contZone = '';
14 while (<>) {
15   my $origline = $_;
16   my @fields = ();
17   while (s/^\s*((?:"[^"]*"|[^\s#])+)//) {
18     push @fields, $1;
19   }
20   next unless @fields;
21
22   my $type = lc($fields[0]);
23   if ($contZone) {
24     @fields >= 3 or warn "bad continuation line";
25     unshift @fields, '+', $contZone;
26     $type = 'zone';
27   }
28
29   $contZone = '';
30   if ($type eq 'zone') {
31     # Zone  NAME  GMTOFF  RULES/SAVE  FORMAT  [UNTIL]
32     my $nfields = @fields;
33     $nfields >= 5 or warn "bad zone line";
34     if ($nfields > 6) {
35       #this splice is optional, depending on one's preference
36       #(one big date-time field, or componentized date and time):
37       splice(@fields, 5, $nfields-5, "@fields[5..$nfields-1]");
38     }
39     $contZone = $fields[1] if @fields > 5;
40   } elsif ($type eq 'rule') {
41     # Rule  NAME  FROM  TO  TYPE  IN  ON  AT  SAVE  LETTER/S
42     @fields == 10 or warn "bad rule line";
43   } elsif ($type eq 'link') {
44     # Link  TARGET  LINK-NAME
45     @fields == 3 or warn "bad link line";
46   } elsif ($type eq 'leap') {
47     # Leap  YEAR  MONTH  DAY  HH:MM:SS  CORR  R/S
48     @fields == 7 or warn "bad leap line";
49   } else {
50     warn "Fubar at input line $.: $origline";
51   }
52   print join("\t", @fields), "\n";
53 }