static int _PyTime_AsTimevalStruct_impl(_PyTime_t t, struct timeval *tv, _PyTime_round_t round, int raise) { _PyTime_t secs, secs2; int us; int res; res = _PyTime_AsTimeval_impl(t, &secs, &us, round); #ifdef MS_WINDOWS tv->tv_sec = (long)secs; #else tv->tv_sec = secs; #endif tv->tv_usec = us; secs2 = (_PyTime_t)tv->tv_sec; if (res < 0 || secs2 != secs) { if (raise) error_time_t_overflow(); return -1; } return 0; }
static int _PyTime_DoubleToDenominator(double d, time_t *sec, long *numerator, double denominator, _PyTime_round_t round) { double intpart, err; /* volatile avoids optimization changing how numbers are rounded */ volatile double floatpart; floatpart = modf(d, &intpart); floatpart *= denominator; floatpart = _PyTime_Round(floatpart, round); if (floatpart >= denominator) { floatpart -= denominator; intpart += 1.0; } else if (floatpart < 0) { floatpart += denominator; intpart -= 1.0; } assert(0.0 <= floatpart && floatpart < denominator); *sec = (time_t)intpart; *numerator = (long)floatpart; err = intpart - (double)*sec; if (err <= -1.0 || err >= 1.0) { error_time_t_overflow(); return -1; } return 0; }
int _PyTime_ObjectToTime_t(PyObject *obj, time_t *sec, _PyTime_round_t round) { if (PyFloat_Check(obj)) { double intpart, err; /* volatile avoids optimization changing how numbers are rounded */ volatile double d; d = PyFloat_AsDouble(obj); d = _PyTime_Round(d, round); (void)modf(d, &intpart); *sec = (time_t)intpart; err = intpart - (double)*sec; if (err <= -1.0 || err >= 1.0) { error_time_t_overflow(); return -1; } return 0; } else { *sec = _PyLong_AsTime_t(obj); if (*sec == (time_t)-1 && PyErr_Occurred()) return -1; return 0; } }
int _PyTime_ObjectToTime_t(PyObject *obj, time_t *sec, _PyTime_round_t round) { if (PyFloat_Check(obj)) { double d, intpart, err; d = PyFloat_AsDouble(obj); if (round == _PyTime_ROUND_UP) { if (d >= 0) d = ceil(d); else d = floor(d); } (void)modf(d, &intpart); *sec = (time_t)intpart; err = intpart - (double)*sec; if (err <= -1.0 || err >= 1.0) { error_time_t_overflow(); return -1; } return 0; } else { *sec = _PyLong_AsTime_t(obj); if (*sec == (time_t)-1 && PyErr_Occurred()) return -1; return 0; } }
static int _PyTime_ObjectToDenominator(PyObject *obj, time_t *sec, long *numerator, double denominator, _PyTime_round_t round) { assert(denominator <= LONG_MAX); if (PyFloat_Check(obj)) { double d, intpart, err; /* volatile avoids unsafe optimization on float enabled by gcc -O3 */ volatile double floatpart; d = PyFloat_AsDouble(obj); floatpart = modf(d, &intpart); if (floatpart < 0) { floatpart = 1.0 + floatpart; intpart -= 1.0; } floatpart *= denominator; if (round == _PyTime_ROUND_UP) { if (intpart >= 0) { floatpart = ceil(floatpart); if (floatpart >= denominator) { floatpart = 0.0; intpart += 1.0; } } else { floatpart = floor(floatpart); } } *sec = (time_t)intpart; err = intpart - (double)*sec; if (err <= -1.0 || err >= 1.0) { error_time_t_overflow(); return -1; } *numerator = (long)floatpart; return 0; } else { *sec = _PyLong_AsTime_t(obj); if (*sec == (time_t)-1 && PyErr_Occurred()) return -1; *numerator = 0; return 0; } }
int _PyTime_AsTimevalTime_t(_PyTime_t t, time_t *p_secs, int *us, _PyTime_round_t round) { _PyTime_t secs; int res; res = _PyTime_AsTimeval_impl(t, &secs, us, round); *p_secs = secs; if (res < 0 || (_PyTime_t)*p_secs != secs) { error_time_t_overflow(); return -1; } return 0; }
time_t _PyLong_AsTime_t(PyObject *obj) { #if SIZEOF_TIME_T == SIZEOF_LONG_LONG long long val; val = PyLong_AsLongLong(obj); #else long val; Py_BUILD_ASSERT(sizeof(time_t) <= sizeof(long)); val = PyLong_AsLong(obj); #endif if (val == -1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) error_time_t_overflow(); return -1; } return (time_t)val; }
time_t _PyLong_AsTime_t(PyObject *obj) { #if defined(HAVE_LONG_LONG) && SIZEOF_TIME_T == SIZEOF_LONG_LONG PY_LONG_LONG val; val = PyLong_AsLongLong(obj); #else long val; assert(sizeof(time_t) <= sizeof(long)); val = PyLong_AsLong(obj); #endif if (val == -1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) error_time_t_overflow(); return -1; } return (time_t)val; }
int _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts) { _PyTime_t secs, nsec; secs = t / SEC_TO_NS; nsec = t % SEC_TO_NS; if (nsec < 0) { nsec += SEC_TO_NS; secs -= 1; } ts->tv_sec = (time_t)secs; assert(0 <= nsec && nsec < SEC_TO_NS); ts->tv_nsec = nsec; if ((_PyTime_t)ts->tv_sec != secs) { error_time_t_overflow(); return -1; } return 0; }