summaryrefslogtreecommitdiff
path: root/lib/mktime.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>1994-07-26 04:06:18 +0000
committerJim Meyering <jim@meyering.net>1994-07-26 04:06:18 +0000
commit2e3cc9b7b9951b2ddf32e9aac48d1594f7ab4d2a (patch)
treeea2ec6566a406362046ad25545b69a76f25eb46e /lib/mktime.c
parent7b5a41383b0a6534f9cccc10a716479f554bc9be (diff)
downloadcoreutils-2e3cc9b7b9951b2ddf32e9aac48d1594f7ab4d2a.tar.xz
merge with 1.10f
Diffstat (limited to 'lib/mktime.c')
-rw-r--r--lib/mktime.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/mktime.c b/lib/mktime.c
index 07fe494f4..094380de1 100644
--- 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 @@ _mktime_internal (timeptr, producer)
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 @@ _mktime_internal (timeptr, producer)
/* 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 @@ _mktime_internal (timeptr, producer)
/* 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