diff options
| author | Dave Love | 2003-06-05 16:24:17 +0000 |
|---|---|---|
| committer | Dave Love | 2003-06-05 16:24:17 +0000 |
| commit | 984257db1789c93908ffd49224e8b2a59968b735 (patch) | |
| tree | 4a032e3b5b17d51269849e8d82b697af8f54a8eb /src | |
| parent | 3811bec8ed4390cac6f77aa27f05a15a94fa6495 (diff) | |
| download | emacs-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.c | 34 |
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 | } |