5411aff6bb
Upstream has renamed tzsetlcl to tzset_unlocked. As bionic's implementation of tzset_unlock differs from upstream, these changes were skipped. Also, upstream has removed constants (SECSPERMIN, etc) from tzfile.h. As they are used in strptime.c, I've decided to leave them in tzfile.h and to not bring them into strptime.c. HAVE_TZNAME and USG_COMPAT flags semantics were updated, thus setting their values to 2 in Android.bp file. See1a27ec76bc
*4742526b7e
and0e8f0b06ac
were picked up, which are not part of 2022a. Changes were applied using following commands: 1) Checkout tzcode repo 2) Prepare patches for all tzcode file using git diff 2016g 2021e -- <file-name> > <file-name-patch> 3) Apply these patches to files in bionic using patch -p1 <file-name> <file-name-patch> Bug: 25413083 Test: CtsLibcoreTestCases Test: CtsLibcoreOjTestCases Test: CtsBionicTestCases Change-Id: I9aba4cbeab30171a32f94d20c8e4057804a4c01f
60 lines
1.4 KiB
C
60 lines
1.4 KiB
C
/* Return the difference between two timestamps. */
|
|
|
|
/*
|
|
** This file is in the public domain, so clarified as of
|
|
** 1996-06-05 by Arthur David Olson.
|
|
*/
|
|
|
|
/*LINTLIBRARY*/
|
|
|
|
#include "private.h" /* for time_t and TYPE_SIGNED */
|
|
|
|
/* Return -X as a double. Using this avoids casting to 'double'. */
|
|
static double
|
|
dminus(double x)
|
|
{
|
|
return -x;
|
|
}
|
|
|
|
double
|
|
difftime(time_t time1, time_t time0)
|
|
{
|
|
/*
|
|
** If double is large enough, simply convert and subtract
|
|
** (assuming that the larger type has more precision).
|
|
*/
|
|
if (sizeof(time_t) < sizeof(double)) {
|
|
double t1 = time1, t0 = time0;
|
|
return t1 - t0;
|
|
}
|
|
|
|
/*
|
|
** The difference of two unsigned values can't overflow
|
|
** if the minuend is greater than or equal to the subtrahend.
|
|
*/
|
|
if (!TYPE_SIGNED(time_t))
|
|
return time0 <= time1 ? time1 - time0 : dminus(time0 - time1);
|
|
|
|
/* Use uintmax_t if wide enough. */
|
|
if (sizeof(time_t) <= sizeof(uintmax_t)) {
|
|
uintmax_t t1 = time1, t0 = time0;
|
|
return time0 <= time1 ? t1 - t0 : dminus(t0 - t1);
|
|
}
|
|
|
|
/*
|
|
** Handle cases where both time1 and time0 have the same sign
|
|
** (meaning that their difference cannot overflow).
|
|
*/
|
|
if ((time1 < 0) == (time0 < 0))
|
|
return time1 - time0;
|
|
|
|
/*
|
|
** The values have opposite signs and uintmax_t is too narrow.
|
|
** This suffers from double rounding; attempt to lessen that
|
|
** by using long double temporaries.
|
|
*/
|
|
{
|
|
long double t1 = time1, t0 = time0;
|
|
return t1 - t0;
|
|
}
|
|
}
|