From 65d4ed585fc0b0724434037c49c7631adb1617ac Mon Sep 17 00:00:00 2001 From: Nicholas Clark Date: Sun, 2 Nov 2008 21:41:07 +0000 Subject: [PATCH] Upgrade to Time::Local 1.1901. p4raw-id: //depot/perl@34699 --- lib/Time/Local.pm | 19 ++++++++----------- lib/Time/Local.t | 48 ++++++++++++++++++++++++++++++++++++------------ 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/lib/Time/Local.pm b/lib/Time/Local.pm index 4044cd9..1eb0a02 100644 --- a/lib/Time/Local.pm +++ b/lib/Time/Local.pm @@ -7,7 +7,7 @@ use strict; use integer; use vars qw( $VERSION @ISA @EXPORT @EXPORT_OK ); -$VERSION = '1.18_01'; +$VERSION = '1.1901'; @ISA = qw( Exporter ); @EXPORT = qw( timegm timelocal ); @@ -29,13 +29,16 @@ use constant SECS_PER_MINUTE => 60; use constant SECS_PER_HOUR => 3600; use constant SECS_PER_DAY => 86400; -my $MaxInt = ( ( 1 << ( 8 * $Config{ivsize} - 2 ) ) - 1 ) * 2 + 1; -my $MaxDay = int( ( $MaxInt - ( SECS_PER_DAY / 2 ) ) / SECS_PER_DAY ) - 1; - +my $MaxInt; if ( $^O eq 'MacOS' ) { # time_t is unsigned... $MaxInt = ( 1 << ( 8 * $Config{ivsize} ) ) - 1; } +else { + $MaxInt = ( ( 1 << ( 8 * $Config{ivsize} - 2 ) ) - 1 ) * 2 + 1; +} + +my $MaxDay = int( ( $MaxInt - ( SECS_PER_DAY / 2 ) ) / SECS_PER_DAY ) - 1; # Determine the EPOC day for this machine my $Epoc = 0; @@ -65,7 +68,7 @@ sub _daygm { return $_[3] + ( $Cheat{ pack( 'ss', @_[ 4, 5 ] ) } ||= do { my $month = ( $_[4] + 10 ) % 12; - my $year = $_[5] + 1900 - $month / 10; + my $year = ( $_[5] + 1900 ) - ( $month / 10 ); ( ( 365 * $year ) + ( $year / 4 ) @@ -96,12 +99,6 @@ sub timegm { } unless ( $Options{no_range_check} ) { - if ( abs($year) >= 0x7fff ) { - $year += 1900; - croak - "Cannot handle date ($sec, $min, $hour, $mday, $month, *$year*)"; - } - croak "Month '$month' out of range 0..11" if $month > 11 or $month < 0; diff --git a/lib/Time/Local.t b/lib/Time/Local.t index 22138cf..4f8674f 100755 --- a/lib/Time/Local.t +++ b/lib/Time/Local.t @@ -9,6 +9,7 @@ BEGIN { use strict; +use Config; use Test::More; use Time::Local; @@ -73,13 +74,13 @@ if ($^O eq 'VMS') { $neg_epoch_ok = 0; # time_t is unsigned } +my $epoch_is_64 = eval { $Config{ivsize} == 8 && ( gmtime 2**40 )[5] == 34912 }; + my $tests = (@time * 12); $tests += @neg_time * 12; $tests += @bad_time; $tests += @years; -$tests += 10; -$tests += 2 if $ENV{PERL_CORE}; -$tests += 8 if $ENV{MAINTAINER}; +$tests += 23; plan tests => $tests; @@ -192,7 +193,24 @@ SKIP: is($@, '', 'no error with leap day of 1996 (year passed as 96)'); } -if ($ENV{MAINTAINER}) { +SKIP: +{ + skip 'These tests require a system with 64-bit time_t.', 3 + unless $epoch_is_64; + + is( timegm( 8, 14, 3, 19, 0, ( 1900 + 138 ) ), 2**31, + 'can call timegm for 2**31 epoch seconds' ); + is( timegm( 16, 28, 6, 7, 1, ( 1900 + 206 ) ), 2**32, + 'can call timegm for 2**32 epoch seconds (on a 64-bit system)' ); + is( timegm( 16, 36, 0, 20, 1, ( 34912 + 1900 ) ), 2**40, + 'can call timegm for 2**40 epoch seconds (on a 64-bit system)' ); +} + +SKIP: +{ + skip 'These tests only run for the package maintainer.', 8 + unless $ENV{MAINTAINER}; + require POSIX; local $ENV{TZ} = 'Europe/Vienna'; @@ -246,14 +264,20 @@ if ($ENV{MAINTAINER}) { 'hour is 2 when given 2:00 AM on Europe/London date change' ); } -if ($ENV{PERL_CORE}) { - package test; - require 'timelocal.pl'; +SKIP: +{ + skip 'These tests are only run when $ENV{PERL_CORE} is true.', 2 + unless $ENV{PERL_CORE}; + + { + package test; + require 'timelocal.pl'; - # need to get ok() from main package - ::is(timegm(0,0,0,1,0,80), main::timegm(0,0,0,1,0,80), - 'timegm in timelocal.pl'); + # need to get ok() from main package + ::is(timegm(0,0,0,1,0,80), main::timegm(0,0,0,1,0,80), + 'timegm in timelocal.pl'); - ::is(timelocal(1,2,3,4,5,88), main::timelocal(1,2,3,4,5,88), - 'timelocal in timelocal.pl'); + ::is(timelocal(1,2,3,4,5,88), main::timelocal(1,2,3,4,5,88), + 'timelocal in timelocal.pl'); + } } -- 2.7.4