-
- /* How far is our guess from the desired struct tm? */
- distance = dist_tm (me, guess_tm);
-
- /* Handle periods of time where a period of time is skipped.
- For example, 2:15 3 April 1994 does not exist, because DST
- is in effect. The distance function will alternately
- return values of 3600 and -3600, because it doesn't know
- that the requested time doesn't exist. In these situations
- (even if the skip is not exactly an hour) the distances
- returned will be the same, but alternating in sign. We
- want the later time, so check to see that the distance is
- oscillating and we've chosen the correct of the two
- possibilities.
-
- Useful: 3 Apr 94 765356300, 30 Oct 94 783496000 */
-
- if ((distance == -last_distance) && (distance < last_distance))
- {
- /* If the caller specified that the DST flag was off, it's
- not possible to represent this time. */
- if (me->tm_isdst == 0)
- {
-#ifdef DEBUG
- printf (" Distance is oscillating -- dst flag nixes struct!\n");
-#endif
- return BAD_STRUCT_TM;
- }
-
-#ifdef DEBUG
- printf (" Distance is oscillating -- chose the later time.\n");
-#endif
- distance = 0;
- }
-
- if ((distance == 0) && (me->tm_isdst != -1)
- && (me->tm_isdst != guess_tm->tm_isdst))
- {
- /* If we're in this code, we've got the right time but the
- wrong daylight savings flag. We need to move away from
- the time that we have and approach the other time from
- the other direction. That is, if I've requested the
- non-DST version of a time and I get the DST version
- instead, I want to put us forward in time and search
- backwards to get the other time. I checked all of the
- configuration files for the tz package -- no entry
- saves more than two hours, so I think we'll be safe by
- moving 24 hours in one direction. IF THE AMOUNT OF
- TIME SAVED IN THE CONFIGURATION FILES CHANGES, THIS
- VALUE MAY NEED TO BE ADJUSTED. Luckily, we can never
- have more than one level of overlaps, or this would
- never work. */
-
-#define SKIP_VALUE 86400
-
- if (guess_tm->tm_isdst == 0)
- /* we got the later one, but want the earlier one */
- distance = -SKIP_VALUE;
- else
- distance = SKIP_VALUE;
-
-#ifdef DEBUG
- printf (" Got the right time, wrong DST value -- adjusting\n");
-#endif
- }