changeset 283:63297bb8f1dd

merge with 1.10f
author Jim Meyering <jim@meyering.net>
date Tue, 26 Jul 1994 04:06:26 +0000
parents ea96d91a1676
children 2fb85cf2ec1a
files lib/mktime.c
diffstat 1 files changed, 14 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/lib/mktime.c
+++ b/lib/mktime.c
@@ -1,5 +1,6 @@
 /* Copyright (C) 1993, 1994 Free Software Foundation, Inc.
-   Contributed by Noel Cragg (noel@cs.oberlin.edu).
+   Contributed by Noel Cragg (noel@cs.oberlin.edu), with fixes
+   by Michael E. Calwas (calwas@ttd.teradyne.com).
 
 This file is part of the GNU C Library.
 
@@ -226,12 +227,12 @@
   while (me->foo < x) \
     { \
       me->bar--; \
-      me->foo = (y - (x - me->foo)); \
+      me->foo = (y - (x - me->foo) + 1); \
     } \
   while (me->foo > y) \
     { \
+      me->foo = (x + (me->foo - y) - 1); \
       me->bar++; \
-      me->foo = (x + (me->foo - y)); \
     }
   
   normalize (tm_sec, 0, 59, tm_min);
@@ -240,8 +241,14 @@
   
   /* Do the month first, so day range can be found. */
   normalize (tm_mon, 0, 11, tm_year);
+
+  /* Since the day range modifies the month, we should be careful how
+     we reference the array of month lengths -- it is possible that
+     the month will go negative, hence the %... */
   normalize (tm_mday, 1,
-	     __mon_lengths[__isleap (me->tm_year)][me->tm_mon],
+	     __mon_lengths[__isleap (me->tm_year)][((me->tm_mon < 0)
+					            ? (12 + (me->tm_mon % 12))
+					            : (me->tm_mon % 12)) ],
 	     tm_mon);
 
   /* Do the month again, because the day may have pushed it out of range. */
@@ -249,7 +256,9 @@
 
   /* Do the day again, because the month may have changed the range. */
   normalize (tm_mday, 1,
-	     __mon_lengths[__isleap (me->tm_year)][me->tm_mon],
+	     __mon_lengths[__isleap (me->tm_year)][((me->tm_mon < 0)
+					            ? (12 + (me->tm_mon % 12))
+					            : (me->tm_mon % 12)) ],
 	     tm_mon);
   
 #ifdef DEBUG