aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDave Love2003-06-05 16:24:17 +0000
committerDave Love2003-06-05 16:24:17 +0000
commit984257db1789c93908ffd49224e8b2a59968b735 (patch)
tree4a032e3b5b17d51269849e8d82b697af8f54a8eb /src
parent3811bec8ed4390cac6f77aa27f05a15a94fa6495 (diff)
downloademacs-984257db1789c93908ffd49224e8b2a59968b735.tar.gz
emacs-984257db1789c93908ffd49224e8b2a59968b735.zip
(__mktime_internal): Merge changes from gnulib
involving year 69 and dst2.
Diffstat (limited to 'src')
-rw-r--r--src/mktime.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/mktime.c b/src/mktime.c
index 3f36e33a235..fa9c9911edb 100644
--- a/src/mktime.c
+++ b/src/mktime.c
@@ -252,6 +252,9 @@ __mktime_internal (tp, convert, offset)
252 int year_requested = tp->tm_year; 252 int year_requested = tp->tm_year;
253 int isdst = tp->tm_isdst; 253 int isdst = tp->tm_isdst;
254 254
255 /* 1 if the previous probe was DST. */
256 int dst2;
257
255 /* Ensure that mon is in range, and set year accordingly. */ 258 /* Ensure that mon is in range, and set year accordingly. */
256 int mon_remainder = mon % 12; 259 int mon_remainder = mon % 12;
257 int negative_mon_remainder = mon_remainder < 0; 260 int negative_mon_remainder = mon_remainder < 0;
@@ -270,6 +273,13 @@ __mktime_internal (tp, convert, offset)
270 + mday - 1); 273 + mday - 1);
271 274
272 int sec_requested = sec; 275 int sec_requested = sec;
276
277 /* Only years after 1970 are defined.
278 If year is 69, it might still be representable due to
279 timezone differences. */
280 if (year < 69)
281 return -1;
282
273#if LEAP_SECONDS_POSSIBLE 283#if LEAP_SECONDS_POSSIBLE
274 /* Handle out-of-range seconds specially, 284 /* Handle out-of-range seconds specially,
275 since ydhms_tm_diff assumes every minute has 60 seconds. */ 285 since ydhms_tm_diff assumes every minute has 60 seconds. */
@@ -286,20 +296,24 @@ __mktime_internal (tp, convert, offset)
286 tm.tm_yday = tm.tm_hour = tm.tm_min = tm.tm_sec = 0; 296 tm.tm_yday = tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
287 t0 = ydhms_tm_diff (year, yday, hour, min, sec, &tm); 297 t0 = ydhms_tm_diff (year, yday, hour, min, sec, &tm);
288 298
289 for (t = t1 = t2 = t0 + *offset; 299 for (t = t1 = t2 = t0 + *offset, dst2 = 0;
290 (dt = ydhms_tm_diff (year, yday, hour, min, sec, 300 (dt = ydhms_tm_diff (year, yday, hour, min, sec,
291 ranged_convert (convert, &t, &tm))); 301 ranged_convert (convert, &t, &tm)));
292 t1 = t2, t2 = t, t += dt) 302 t1 = t2, t2 = t, t += dt, dst2 = tm.tm_isdst != 0)
293 if (t == t1 && t != t2 303 if (t == t1 && t != t2
294 && (isdst < 0 || tm.tm_isdst < 0 304 && (tm.tm_isdst < 0
295 || (isdst != 0) != (tm.tm_isdst != 0))) 305 || (isdst < 0
306 ? dst2 <= (tm.tm_isdst != 0)
307 : (isdst != 0) != (tm.tm_isdst != 0))))
296 /* We can't possibly find a match, as we are oscillating 308 /* We can't possibly find a match, as we are oscillating
297 between two values. The requested time probably falls 309 between two values. The requested time probably falls
298 within a spring-forward gap of size DT. Follow the common 310 within a spring-forward gap of size DT. Follow the common
299 practice in this case, which is to return a time that is DT 311 practice in this case, which is to return a time that is DT
300 away from the requested time, preferring a time whose 312 away from the requested time, preferring a time whose
301 tm_isdst differs from the requested value. In practice, 313 tm_isdst differs from the requested value. (If no tm_isdst
302 this is more useful than returning -1. */ 314 was requested and only one of the two values has a nonzero
315 tm_isdst, prefer that value.) In practice, this is more
316 useful than returning -1. */
303 break; 317 break;
304 else if (--remaining_probes == 0) 318 else if (--remaining_probes == 0)
305 return -1; 319 return -1;
@@ -373,6 +387,14 @@ __mktime_internal (tp, convert, offset)
373 return -1; 387 return -1;
374 } 388 }
375 389
390 if (year == 69)
391 {
392 /* If year was 69, need to check whether the time was representable
393 or not. */
394 if (t < 0 || t > 2 * 24 * 60 * 60)
395 return -1;
396 }
397
376 *tp = tm; 398 *tp = tm;
377 return t; 399 return t;
378} 400}