diff options
author | Jim Meyering <jim@meyering.net> | 1994-07-26 04:06:18 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 1994-07-26 04:06:18 +0000 |
commit | 2e3cc9b7b9951b2ddf32e9aac48d1594f7ab4d2a (patch) | |
tree | ea2ec6566a406362046ad25545b69a76f25eb46e /lib | |
parent | 7b5a41383b0a6534f9cccc10a716479f554bc9be (diff) | |
download | coreutils-2e3cc9b7b9951b2ddf32e9aac48d1594f7ab4d2a.tar.xz |
merge with 1.10f
Diffstat (limited to 'lib')
-rw-r--r-- | lib/mktime.c | 19 |
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 |