1169695Skan#! /usr/bin/perl -w 2169695Skan# Summarize .zi input in a .zi-like format. 3169695Skan 4169695Skan# Courtesy Ken Pizzini. 5169695Skan 6169695Skanuse strict; 7169695Skan 8169695Skan#This file released to the public domain. 9169695Skan 10169695Skan# Note: error checking is poor; trust the output only if the input 11169695Skan# has been checked by zic. 12169695Skan 13169695Skanmy $contZone = ''; 14169695Skanwhile (<>) { 15169695Skan my $origline = $_; 16169695Skan my @fields = (); 17169695Skan while (s/^\s*((?:"[^"]*"|[^\s#])+)//) { 18169695Skan push @fields, $1; 19169695Skan } 20169695Skan next unless @fields; 21169695Skan 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} 54