Time-Piece-1.13 test failures on HP-UX
Gisle Aas [Fri, 23 May 2008 00:20:28 +0000 (02:20 +0200)]
Message-Id: <EB1DA83A-AA9C-4BA4-A09D-AB6DC5E00EB9@activestate.com>

Don't rely on strptime being able to parse illegal dates.  Also being tracked
via <http://rt.cpan.org/Public/Bug/Display.html?id=36106> so this also brings
blead closer to the next (as yet unreleased) version of Time::Piece.

p4raw-id: //depot/perl@33918

ext/Time/Piece/Piece.pm
ext/Time/Piece/Piece.xs

index fc6e730..a739c39 100644 (file)
@@ -22,7 +22,7 @@ our %EXPORT_TAGS = (
     ':override' => 'internal',
     );
 
-our $VERSION = '1.13_01';
+our $VERSION = '1.13_02';
 
 bootstrap Time::Piece $VERSION;
 
@@ -607,12 +607,8 @@ sub add_months {
         $final_month = $final_month % 12;
     }
     
-    my $string = ($time->year + $num_years) . "-" .
-                 ($final_month + 1) . "-" .
-                 ($time->mday) . " " . $time->hms;
-    my $format = "%Y-%m-%d %H:%M:%S";
-    #warn("Parsing string: $string\n");
-    my @vals = _strptime($string, $format);
+    my @vals = _mini_mktime($time->sec, $time->min, $time->hour,
+                            $time->mday, $final_month, $time->year - 1900 + $num_years);
 #    warn(sprintf("got vals: %d-%d-%d %d:%d:%d\n", reverse(@vals)));
     return scalar $time->_mktime(\@vals, $time->[c_islocal]);
 }
index 12c3f45..e20b6d4 100644 (file)
@@ -914,3 +914,37 @@ _strptime ( string, format )
        PUSHs(sv_2mortal(newSViv(0)));
        /* islocal */
        PUSHs(sv_2mortal(newSViv(0)));
+
+void
+_mini_mktime(int sec, int min, int hour, int mday, int mon, int year)
+  PREINIT:
+       struct tm mytm;
+       time_t t;
+  PPCODE:
+       t = 0;
+       mytm = *gmtime(&t);
+
+       mytm.tm_sec = sec;
+       mytm.tm_min = min;
+       mytm.tm_hour = hour;
+       mytm.tm_mday = mday;
+       mytm.tm_mon = mon;
+       mytm.tm_year = year;
+       
+       my_mini_mktime(&mytm);
+
+       EXTEND(SP, 11);
+       PUSHs(sv_2mortal(newSViv(mytm.tm_sec)));
+       PUSHs(sv_2mortal(newSViv(mytm.tm_min)));
+       PUSHs(sv_2mortal(newSViv(mytm.tm_hour)));
+       PUSHs(sv_2mortal(newSViv(mytm.tm_mday)));
+       PUSHs(sv_2mortal(newSViv(mytm.tm_mon)));
+       PUSHs(sv_2mortal(newSViv(mytm.tm_year)));
+       PUSHs(sv_2mortal(newSViv(mytm.tm_wday)));
+       PUSHs(sv_2mortal(newSViv(mytm.tm_yday)));
+       /* isdst */
+       PUSHs(sv_2mortal(newSViv(0)));
+       /* epoch */
+       PUSHs(sv_2mortal(newSViv(0)));
+       /* islocal */
+       PUSHs(sv_2mortal(newSViv(0)));