#include "parts.h" #ifdef MS_WINDOWS # include // struct timeval #endif static PyObject * test_pytime_fromseconds(PyObject *self, PyObject *args) { int seconds; if (!PyArg_ParseTuple(args, "i", &seconds)) { return NULL; } _PyTime_t ts = _PyTime_FromSeconds(seconds); return _PyTime_AsNanosecondsObject(ts); } static int check_time_rounding(int round) { if (round != _PyTime_ROUND_FLOOR && round != _PyTime_ROUND_CEILING && round != _PyTime_ROUND_HALF_EVEN && round != _PyTime_ROUND_UP) { PyErr_SetString(PyExc_ValueError, "invalid rounding"); return -1; } return 0; } static PyObject * test_pytime_fromsecondsobject(PyObject *self, PyObject *args) { PyObject *obj; int round; if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) { return NULL; } if (check_time_rounding(round) < 0) { return NULL; } _PyTime_t ts; if (_PyTime_FromSecondsObject(&ts, obj, round) == -1) { return NULL; } return _PyTime_AsNanosecondsObject(ts); } static PyObject * test_pytime_assecondsdouble(PyObject *self, PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args, "O", &obj)) { return NULL; } _PyTime_t ts; if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) { return NULL; } double d = _PyTime_AsSecondsDouble(ts); return PyFloat_FromDouble(d); } static PyObject * test_PyTime_AsTimeval(PyObject *self, PyObject *args) { PyObject *obj; int round; if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) { return NULL; } if (check_time_rounding(round) < 0) { return NULL; } _PyTime_t t; if (_PyTime_FromNanosecondsObject(&t, obj) < 0) { return NULL; } struct timeval tv; if (_PyTime_AsTimeval(t, &tv, round) < 0) { return NULL; } PyObject *seconds = PyLong_FromLongLong(tv.tv_sec); if (seconds == NULL) { return NULL; } return Py_BuildValue("Nl", seconds, (long)tv.tv_usec); } static PyObject * test_PyTime_AsTimeval_clamp(PyObject *self, PyObject *args) { PyObject *obj; int round; if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) { return NULL; } if (check_time_rounding(round) < 0) { return NULL; } _PyTime_t t; if (_PyTime_FromNanosecondsObject(&t, obj) < 0) { return NULL; } struct timeval tv; _PyTime_AsTimeval_clamp(t, &tv, round); PyObject *seconds = PyLong_FromLongLong(tv.tv_sec); if (seconds == NULL) { return NULL; } return Py_BuildValue("Nl", seconds, (long)tv.tv_usec); } #ifdef HAVE_CLOCK_GETTIME static PyObject * test_PyTime_AsTimespec(PyObject *self, PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args, "O", &obj)) { return NULL; } _PyTime_t t; if (_PyTime_FromNanosecondsObject(&t, obj) < 0) { return NULL; } struct timespec ts; if (_PyTime_AsTimespec(t, &ts) == -1) { return NULL; } return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec); } static PyObject * test_PyTime_AsTimespec_clamp(PyObject *self, PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args, "O", &obj)) { return NULL; } _PyTime_t t; if (_PyTime_FromNanosecondsObject(&t, obj) < 0) { return NULL; } struct timespec ts; _PyTime_AsTimespec_clamp(t, &ts); return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec); } #endif static PyObject * test_PyTime_AsMilliseconds(PyObject *self, PyObject *args) { PyObject *obj; int round; if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) { return NULL; } _PyTime_t t; if (_PyTime_FromNanosecondsObject(&t, obj) < 0) { return NULL; } if (check_time_rounding(round) < 0) { return NULL; } _PyTime_t ms = _PyTime_AsMilliseconds(t, round); _PyTime_t ns = _PyTime_FromNanoseconds(ms); return _PyTime_AsNanosecondsObject(ns); } static PyObject * test_PyTime_AsMicroseconds(PyObject *self, PyObject *args) { PyObject *obj; int round; if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) { return NULL; } _PyTime_t t; if (_PyTime_FromNanosecondsObject(&t, obj) < 0) { return NULL; } if (check_time_rounding(round) < 0) { return NULL; } _PyTime_t us = _PyTime_AsMicroseconds(t, round); _PyTime_t ns = _PyTime_FromNanoseconds(us); return _PyTime_AsNanosecondsObject(ns); } static PyObject * test_pytime_object_to_time_t(PyObject *self, PyObject *args) { PyObject *obj; time_t sec; int round; if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round)) { return NULL; } if (check_time_rounding(round) < 0) { return NULL; } if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1) { return NULL; } return _PyLong_FromTime_t(sec); } static PyObject * test_pytime_object_to_timeval(PyObject *self, PyObject *args) { PyObject *obj; time_t sec; long usec; int round; if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round)) { return NULL; } if (check_time_rounding(round) < 0) { return NULL; } if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1) { return NULL; } return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec); } static PyObject * test_pytime_object_to_timespec(PyObject *self, PyObject *args) { PyObject *obj; time_t sec; long nsec; int round; if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round)) { return NULL; } if (check_time_rounding(round) < 0) { return NULL; } if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1) { return NULL; } return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec); } static PyMethodDef test_methods[] = { {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS}, {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS}, {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS}, #ifdef HAVE_CLOCK_GETTIME {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS}, {"PyTime_AsTimespec_clamp", test_PyTime_AsTimespec_clamp, METH_VARARGS}, #endif {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS}, {"PyTime_AsTimeval_clamp", test_PyTime_AsTimeval_clamp, METH_VARARGS}, {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS}, {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS}, {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS}, {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS}, {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS}, {NULL}, }; int _PyTestCapi_Init_PyTime(PyObject *mod) { if (PyModule_AddFunctions(mod, test_methods) < 0) { return -1; } return 0; }