@ -203,6 +203,71 @@ memrchr( const void *s, int c, size_t n )
}
# endif
# ifndef HAVE_TIMEGM
/*
Converts struct tm to time_t , assuming the data in tm is UTC rather
than local timezone .
mktime is similar but assumes struct tm , also known as the
" broken-down " form of time , is in local time zone . timegm
uses mktime to make the conversion understanding that an offset
will be introduced by the local time assumption .
mktime_from_utc then measures the introduced offset by applying
gmtime to the initial result and applying mktime to the resulting
" broken-down " form . The difference between the two mktime results
is the measured offset which is then subtracted from the initial
mktime result to yield a calendar time which is the value returned .
tm_isdst in struct tm is set to 0 to force mktime to introduce a
consistent offset ( the non DST offset ) since tm and tm + o might be
on opposite sides of a DST change .
Some implementations of mktime return - 1 for the nonexistent
localtime hour at the beginning of DST . In this event , use
mktime ( tm - 1 hr ) + 3600.
Schematically
mktime ( tm ) - - > t + o
gmtime ( t + o ) - - > tm + o
mktime ( tm + o ) - - > t + 2 o
t + o - ( t + 2 o - t + o ) = t
Contributed by Roger Beeman < beeman @ cisco . com > , with the help of
Mark Baushke < mdb @ cisco . com > and the rest of the Gurus at CISCO .
Further improved by Roger with assistance from Edward J . Sabol
based on input by Jamie Zawinski .
*/
static time_t
my_mktime ( struct tm * t )
{
time_t tl = mktime ( t ) ;
if ( tl = = - 1 ) {
t - > tm_hour - - ;
tl = mktime ( t ) ;
if ( tl ! = - 1 )
tl + = 3600 ;
}
return tl ;
}
time_t
timegm ( struct tm * t )
{
time_t tl , tb ;
struct tm * tg ;
if ( ( tl = my_mktime ( t ) ) = = - 1 )
return tl ;
tg = gmtime ( & tl ) ;
tg - > tm_isdst = 0 ;
if ( ( tb = my_mktime ( tg ) ) = = - 1 )
return tb ;
return tl - ( tb - tl ) ;
}
# endif
void
oob ( void )
{