blob: efebd494e1745a662d9da3c0143cbd31b18b58a3 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Time module */
2
Barry Warsaw9a2a8a81996-12-06 23:32:14 +00003#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00004
Guido van Rossum87ce7bb1998-06-09 16:30:31 +00005#include <ctype.h>
6
Thomas Wouters0e3f5912006-08-11 14:57:12 +00007#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +00008#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +00009#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum6d946f91992-08-14 13:49:30 +000010
Guido van Rossumb6775db1994-08-01 11:34:53 +000011#ifdef QUICKWIN
12#include <io.h>
13#endif
14
Guido van Rossum7bf22de1997-12-02 20:34:19 +000015#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000016#include <i86.h>
17#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000018#ifdef MS_WINDOWS
Mark Hammond975e3922002-07-16 01:29:19 +000019#define WIN32_LEAN_AND_MEAN
Guido van Rossum258ccd42001-03-02 06:53:29 +000020#include <windows.h>
Mark Hammond975e3922002-07-16 01:29:19 +000021#include "pythread.h"
22
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000023#if defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000024/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000025#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000026#define tzname _tzname
27#define daylight _daylight
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000028#endif /* __BORLANDC__ */
Guido van Rossumcac6c721996-09-06 13:34:02 +000029#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000030#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000031
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000032#if defined(PYOS_OS2)
33#define INCL_DOS
34#define INCL_ERRORS
35#include <os2.h>
36#endif
37
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000038#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000039#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000040#endif
41
Victor Stinnera8ec5ea2012-03-13 00:25:42 +010042#if defined(__APPLE__)
43#include <mach/mach_time.h>
44#endif
45
Guido van Rossum234f9421993-06-17 12:35:49 +000046/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int floatsleep(double);
Victor Stinner4195b5c2012-02-08 23:03:19 +010048static double floattime(void);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000050static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +010051time_time(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052{
Victor Stinner4195b5c2012-02-08 23:03:19 +010053 double secs;
54 secs = floattime();
55 if (secs == 0.0) {
56 PyErr_SetFromErrno(PyExc_IOError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 return NULL;
Victor Stinner4195b5c2012-02-08 23:03:19 +010058 }
59 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +000060}
61
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000062PyDoc_STRVAR(time_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +010063"time() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +000064\n\
65Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000066Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +000067
Victor Stinner85fdfa82012-01-27 00:38:48 +010068#if defined(HAVE_CLOCK)
69
70#ifndef CLOCKS_PER_SEC
71#ifdef CLK_TCK
72#define CLOCKS_PER_SEC CLK_TCK
73#else
74#define CLOCKS_PER_SEC 1000000
75#endif
76#endif
77
Victor Stinner4195b5c2012-02-08 23:03:19 +010078static PyObject *
79pyclock(void)
Victor Stinner85fdfa82012-01-27 00:38:48 +010080{
Victor Stinner4195b5c2012-02-08 23:03:19 +010081 clock_t value;
82 value = clock();
83 if (value == (clock_t)-1) {
Victor Stinner85fdfa82012-01-27 00:38:48 +010084 PyErr_SetString(PyExc_RuntimeError,
85 "the processor time used is not available "
86 "or its value cannot be represented");
Victor Stinner4195b5c2012-02-08 23:03:19 +010087 return NULL;
Victor Stinner85fdfa82012-01-27 00:38:48 +010088 }
Victor Stinner4195b5c2012-02-08 23:03:19 +010089 return PyFloat_FromDouble((double)value / CLOCKS_PER_SEC);
Victor Stinner85fdfa82012-01-27 00:38:48 +010090}
91#endif /* HAVE_CLOCK */
92
Thomas Wouters477c8d52006-05-27 19:21:47 +000093#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Victor Stinner9122fdd2011-07-04 13:55:40 +020094/* Win32 has better clock replacement; we have our own version, due to Mark
95 Hammond and Tim Peters */
Victor Stinner4195b5c2012-02-08 23:03:19 +010096static PyObject *
97win32_clock(int fallback)
Guido van Rossum3917c221997-04-02 05:35:28 +000098{
Victor Stinner8b302012012-02-07 23:29:46 +010099 static LONGLONG cpu_frequency = 0;
Victor Stinner4195b5c2012-02-08 23:03:19 +0100100 static LONGLONG ctrStart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 LARGE_INTEGER now;
Victor Stinner4195b5c2012-02-08 23:03:19 +0100102 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +0000103
Victor Stinner8b302012012-02-07 23:29:46 +0100104 if (cpu_frequency == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 LARGE_INTEGER freq;
Victor Stinner8b302012012-02-07 23:29:46 +0100106 QueryPerformanceCounter(&now);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100107 ctrStart = now.QuadPart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
109 /* Unlikely to happen - this works on all intel
110 machines at least! Revert to clock() */
Victor Stinner4195b5c2012-02-08 23:03:19 +0100111 if (fallback)
112 return pyclock();
113 else
114 return PyErr_SetFromWindowsErr(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 }
Victor Stinner8b302012012-02-07 23:29:46 +0100116 cpu_frequency = freq.QuadPart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 }
118 QueryPerformanceCounter(&now);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100119 diff = (double)(now.QuadPart - ctrStart);
120 return PyFloat_FromDouble(diff / (double)cpu_frequency);
Guido van Rossum3917c221997-04-02 05:35:28 +0000121}
Victor Stinner8b302012012-02-07 23:29:46 +0100122#endif
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000123
Victor Stinner8b302012012-02-07 23:29:46 +0100124#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK)
Victor Stinner9122fdd2011-07-04 13:55:40 +0200125static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100126time_clock(PyObject *self, PyObject *unused)
Victor Stinner9122fdd2011-07-04 13:55:40 +0200127{
Victor Stinner8b302012012-02-07 23:29:46 +0100128#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Victor Stinner4195b5c2012-02-08 23:03:19 +0100129 return win32_clock(1);
Victor Stinner8b302012012-02-07 23:29:46 +0100130#else
Victor Stinner4195b5c2012-02-08 23:03:19 +0100131 return pyclock();
Victor Stinner8b302012012-02-07 23:29:46 +0100132#endif
Victor Stinner9122fdd2011-07-04 13:55:40 +0200133}
Victor Stinner9122fdd2011-07-04 13:55:40 +0200134
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000135PyDoc_STRVAR(clock_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100136"clock() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000137\n\
138Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000139the first call to clock(). This has as much precision as the system\n\
140records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000141#endif
142
Victor Stinnere0be4232011-10-25 13:06:09 +0200143#ifdef HAVE_CLOCK_GETTIME
144static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100145time_clock_gettime(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200146{
147 int ret;
148 clockid_t clk_id;
149 struct timespec tp;
150
Victor Stinner4195b5c2012-02-08 23:03:19 +0100151 if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200152 return NULL;
153
154 ret = clock_gettime((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100155 if (ret != 0) {
Victor Stinnere0be4232011-10-25 13:06:09 +0200156 PyErr_SetFromErrno(PyExc_IOError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100157 return NULL;
158 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100159
160 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200161}
162
163PyDoc_STRVAR(clock_gettime_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100164"clock_gettime(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200165\n\
166Return the time of the specified clock clk_id.");
167#endif
168
169#ifdef HAVE_CLOCK_GETRES
170static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100171time_clock_getres(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200172{
173 int ret;
174 clockid_t clk_id;
175 struct timespec tp;
176
Victor Stinner4195b5c2012-02-08 23:03:19 +0100177 if (!PyArg_ParseTuple(args, "i:clock_getres", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200178 return NULL;
179
180 ret = clock_getres((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100181 if (ret != 0) {
Victor Stinnere0be4232011-10-25 13:06:09 +0200182 PyErr_SetFromErrno(PyExc_IOError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100183 return NULL;
184 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100185
186 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200187}
188
189PyDoc_STRVAR(clock_getres_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100190"clock_getres(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200191\n\
192Return the resolution (precision) of the specified clock clk_id.");
193#endif
194
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000195static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000196time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000198 double secs;
199 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
200 return NULL;
Victor Stinner7f53a502011-07-05 22:00:25 +0200201 if (secs < 0) {
202 PyErr_SetString(PyExc_ValueError,
203 "sleep length must be non-negative");
204 return NULL;
205 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 if (floatsleep(secs) != 0)
207 return NULL;
208 Py_INCREF(Py_None);
209 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210}
211
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000212PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000213"sleep(seconds)\n\
214\n\
215Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000216a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000217
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000218static PyStructSequence_Field struct_time_type_fields[] = {
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000219 {"tm_year", "year, for example, 1993"},
220 {"tm_mon", "month of year, range [1, 12]"},
221 {"tm_mday", "day of month, range [1, 31]"},
222 {"tm_hour", "hours, range [0, 23]"},
223 {"tm_min", "minutes, range [0, 59]"},
224 {"tm_sec", "seconds, range [0, 61])"},
225 {"tm_wday", "day of week, range [0, 6], Monday is 0"},
226 {"tm_yday", "day of year, range [1, 366]"},
227 {"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 {0}
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000229};
230
231static PyStructSequence_Desc struct_time_type_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 "time.struct_time",
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000233 "The time value as returned by gmtime(), localtime(), and strptime(), and\n"
234 " accepted by asctime(), mktime() and strftime(). May be considered as a\n"
235 " sequence of 9 integers.\n\n"
236 " Note that several fields' values are not the same as those defined by\n"
237 " the C language standard for struct tm. For example, the value of the\n"
238 " field tm_year is the actual year, not year - 1900. See individual\n"
239 " fields' descriptions for details.",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 struct_time_type_fields,
241 9,
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000242};
Tim Peters9ad4b682002-02-13 05:14:18 +0000243
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000244static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000245static PyTypeObject StructTimeType;
246
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000247static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000248tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 PyObject *v = PyStructSequence_New(&StructTimeType);
251 if (v == NULL)
252 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000253
Christian Heimes217cfd12007-12-02 14:31:20 +0000254#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val))
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 SET(0, p->tm_year + 1900);
257 SET(1, p->tm_mon + 1); /* Want January == 1 */
258 SET(2, p->tm_mday);
259 SET(3, p->tm_hour);
260 SET(4, p->tm_min);
261 SET(5, p->tm_sec);
262 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
263 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
264 SET(8, p->tm_isdst);
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000265#undef SET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 if (PyErr_Occurred()) {
267 Py_XDECREF(v);
268 return NULL;
269 }
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000272}
273
Fred Drakef901abd2004-08-03 17:58:55 +0000274/* Parse arg tuple that can contain an optional float-or-None value;
275 format needs to be "|O:name".
276 Returns non-zero on success (parallels PyArg_ParseTuple).
277*/
278static int
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100279parse_time_t_args(PyObject *args, char *format, time_t *pwhen)
Fred Drakef901abd2004-08-03 17:58:55 +0000280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 PyObject *ot = NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100282 time_t whent;
Fred Drakef901abd2004-08-03 17:58:55 +0000283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 if (!PyArg_ParseTuple(args, format, &ot))
285 return 0;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100286 if (ot == NULL || ot == Py_None) {
287 whent = time(NULL);
288 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 else {
Victor Stinner5d272cc2012-03-13 13:35:55 +0100290 if (_PyTime_ObjectToTime_t(ot, &whent) == -1)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100291 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 }
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100293 *pwhen = whent;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 return 1;
Fred Drakef901abd2004-08-03 17:58:55 +0000295}
296
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000297static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000298time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000299{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100300 time_t when;
301 struct tm buf, *local;
302
303 if (!parse_time_t_args(args, "|O:gmtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100305
306 errno = 0;
307 local = gmtime(&when);
308 if (local == NULL) {
309#ifdef EINVAL
310 if (errno == 0)
311 errno = EINVAL;
312#endif
313 return PyErr_SetFromErrno(PyExc_OSError);
314 }
315 buf = *local;
316 return tmtotuple(&buf);
Guido van Rossum234f9421993-06-17 12:35:49 +0000317}
318
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000319PyDoc_STRVAR(gmtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000320"gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n\
Fred Drake193a3f62002-03-12 21:38:49 +0000321 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000322\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000323Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000324GMT). When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000325
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100326static int
327pylocaltime(time_t *timep, struct tm *result)
328{
329 struct tm *local;
330
331 assert (timep != NULL);
332 local = localtime(timep);
333 if (local == NULL) {
334 /* unconvertible time */
335#ifdef EINVAL
336 if (errno == 0)
337 errno = EINVAL;
338#endif
339 PyErr_SetFromErrno(PyExc_OSError);
340 return -1;
341 }
342 *result = *local;
343 return 0;
344}
345
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000346static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000347time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000348{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100349 time_t when;
350 struct tm buf;
351
352 if (!parse_time_t_args(args, "|O:localtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100354 if (pylocaltime(&when, &buf) == 1)
355 return NULL;
356 return tmtotuple(&buf);
Guido van Rossum234f9421993-06-17 12:35:49 +0000357}
358
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000359PyDoc_STRVAR(localtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000360"localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000362\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000363Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000364When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000365
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000366/* Convert 9-item tuple to tm structure. Return 1 on success, set
367 * an exception and return 0 on error.
368 */
Guido van Rossum9e90a671993-06-24 11:10:19 +0000369static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000370gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 int y;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumb9081262007-08-25 03:14:09 +0000375
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000376 if (!PyTuple_Check(args)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 PyErr_SetString(PyExc_TypeError,
378 "Tuple or struct_time argument required");
379 return 0;
380 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000381
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000382 if (!PyArg_ParseTuple(args, "iiiiiiiii",
383 &y, &p->tm_mon, &p->tm_mday,
384 &p->tm_hour, &p->tm_min, &p->tm_sec,
385 &p->tm_wday, &p->tm_yday, &p->tm_isdst))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 p->tm_year = y - 1900;
388 p->tm_mon--;
389 p->tm_wday = (p->tm_wday + 1) % 7;
390 p->tm_yday--;
391 return 1;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000392}
393
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000394/* Check values of the struct tm fields before it is passed to strftime() and
395 * asctime(). Return 1 if all values are valid, otherwise set an exception
396 * and returns 0.
397 */
Victor Stinneref128102010-10-07 01:00:52 +0000398static int
399checktm(struct tm* buf)
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000400{
Victor Stinneref128102010-10-07 01:00:52 +0000401 /* Checks added to make sure strftime() and asctime() does not crash Python by
402 indexing blindly into some array for a textual representation
403 by some bad index (fixes bug #897625 and #6608).
404
405 Also support values of zero from Python code for arguments in which
406 that is out of range by forcing that value to the lowest value that
407 is valid (fixed bug #1520914).
408
409 Valid ranges based on what is allowed in struct tm:
410
411 - tm_year: [0, max(int)] (1)
412 - tm_mon: [0, 11] (2)
413 - tm_mday: [1, 31]
414 - tm_hour: [0, 23]
415 - tm_min: [0, 59]
416 - tm_sec: [0, 60]
417 - tm_wday: [0, 6] (1)
418 - tm_yday: [0, 365] (2)
419 - tm_isdst: [-max(int), max(int)]
420
421 (1) gettmarg() handles bounds-checking.
422 (2) Python's acceptable range is one greater than the range in C,
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000423 thus need to check against automatic decrement by gettmarg().
424 */
425 if (buf->tm_mon == -1)
426 buf->tm_mon = 0;
427 else if (buf->tm_mon < 0 || buf->tm_mon > 11) {
428 PyErr_SetString(PyExc_ValueError, "month out of range");
429 return 0;
430 }
431 if (buf->tm_mday == 0)
432 buf->tm_mday = 1;
433 else if (buf->tm_mday < 0 || buf->tm_mday > 31) {
434 PyErr_SetString(PyExc_ValueError, "day of month out of range");
435 return 0;
436 }
437 if (buf->tm_hour < 0 || buf->tm_hour > 23) {
438 PyErr_SetString(PyExc_ValueError, "hour out of range");
439 return 0;
440 }
441 if (buf->tm_min < 0 || buf->tm_min > 59) {
442 PyErr_SetString(PyExc_ValueError, "minute out of range");
443 return 0;
444 }
445 if (buf->tm_sec < 0 || buf->tm_sec > 61) {
446 PyErr_SetString(PyExc_ValueError, "seconds out of range");
447 return 0;
448 }
449 /* tm_wday does not need checking of its upper-bound since taking
450 ``% 7`` in gettmarg() automatically restricts the range. */
451 if (buf->tm_wday < 0) {
452 PyErr_SetString(PyExc_ValueError, "day of week out of range");
453 return 0;
454 }
455 if (buf->tm_yday == -1)
456 buf->tm_yday = 0;
457 else if (buf->tm_yday < 0 || buf->tm_yday > 365) {
458 PyErr_SetString(PyExc_ValueError, "day of year out of range");
459 return 0;
460 }
461 return 1;
462}
463
Victor Stinnerc1f32ca2011-10-14 02:36:13 +0200464#ifdef MS_WINDOWS
465 /* wcsftime() doesn't format correctly time zones, see issue #10653 */
466# undef HAVE_WCSFTIME
467#endif
468
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000469#ifdef HAVE_STRFTIME
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000470#ifdef HAVE_WCSFTIME
471#define time_char wchar_t
472#define format_time wcsftime
473#define time_strlen wcslen
474#else
475#define time_char char
476#define format_time strftime
477#define time_strlen strlen
478#endif
479
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000480static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000481time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 PyObject *tup = NULL;
484 struct tm buf;
485 const time_char *fmt;
Victor Stinnerb2904782010-09-29 10:34:19 +0000486#ifdef HAVE_WCSFTIME
487 wchar_t *format;
488#else
489 PyObject *format;
490#endif
Victor Stinneref128102010-10-07 01:00:52 +0000491 PyObject *format_arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 size_t fmtlen, buflen;
Victor Stinnerb2904782010-09-29 10:34:19 +0000493 time_char *outbuf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 size_t i;
Victor Stinnerb2904782010-09-29 10:34:19 +0000495 PyObject *ret = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 /* Will always expect a unicode string to be passed as format.
500 Given that there's no str type anymore in py3k this seems safe.
501 */
Victor Stinneref128102010-10-07 01:00:52 +0000502 if (!PyArg_ParseTuple(args, "U|O:strftime", &format_arg, &tup))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 if (tup == NULL) {
506 time_t tt = time(NULL);
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100507 if (pylocaltime(&tt, &buf) == -1)
508 return NULL;
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000509 }
510 else if (!gettmarg(tup, &buf) || !checktm(&buf))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000512
Victor Stinner06ec45e2011-01-08 03:35:36 +0000513#if defined(_MSC_VER) || defined(sun)
Victor Stinner73ea29c2011-01-08 01:56:31 +0000514 if (buf.tm_year + 1900 < 1 || 9999 < buf.tm_year + 1900) {
Victor Stinner6f0e4f92011-03-21 02:14:53 +0100515 PyErr_SetString(PyExc_ValueError,
516 "strftime() requires year in [1; 9999]");
Alexander Belopolsky0dd06f42011-01-08 01:23:02 +0000517 return NULL;
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000518 }
Victor Stinner73ea29c2011-01-08 01:56:31 +0000519#endif
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 /* Normalize tm_isdst just in case someone foolishly implements %Z
522 based on the assumption that tm_isdst falls within the range of
523 [-1, 1] */
524 if (buf.tm_isdst < -1)
525 buf.tm_isdst = -1;
526 else if (buf.tm_isdst > 1)
527 buf.tm_isdst = 1;
Brett Cannond1080a32004-03-02 04:38:10 +0000528
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000529#ifdef HAVE_WCSFTIME
Victor Stinnerbeb4135b2010-10-07 01:02:42 +0000530 format = PyUnicode_AsWideCharString(format_arg, NULL);
Victor Stinnerb2904782010-09-29 10:34:19 +0000531 if (format == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 return NULL;
Victor Stinnerb2904782010-09-29 10:34:19 +0000533 fmt = format;
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000534#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 /* Convert the unicode string to an ascii one */
Victor Stinner1b579672011-12-17 05:47:23 +0100536 format = PyUnicode_EncodeLocale(format_arg, "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 if (format == NULL)
538 return NULL;
539 fmt = PyBytes_AS_STRING(format);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000540#endif
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000541
Stefan Krah4aea7d32012-02-27 16:30:26 +0100542#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 /* check that the format string contains only valid directives */
Victor Stinner5a3ff792011-10-16 19:08:23 +0200544 for(outbuf = strchr(fmt, '%');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 outbuf != NULL;
Victor Stinner5a3ff792011-10-16 19:08:23 +0200546 outbuf = strchr(outbuf+2, '%'))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 {
548 if (outbuf[1]=='#')
549 ++outbuf; /* not documented by python, */
550 if (outbuf[1]=='\0' ||
Victor Stinner5a3ff792011-10-16 19:08:23 +0200551 !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 {
553 PyErr_SetString(PyExc_ValueError, "Invalid format string");
Stefan Krah4aea7d32012-02-27 16:30:26 +0100554 Py_DECREF(format);
555 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 }
557 }
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000558#endif
559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 fmtlen = time_strlen(fmt);
Guido van Rossumc222ec21999-02-23 00:00:10 +0000561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 /* I hate these functions that presume you know how big the output
563 * will be ahead of time...
564 */
565 for (i = 1024; ; i += i) {
Victor Stinner136ea492011-12-17 22:37:18 +0100566#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100567 int err;
Victor Stinner136ea492011-12-17 22:37:18 +0100568#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 outbuf = (time_char *)PyMem_Malloc(i*sizeof(time_char));
570 if (outbuf == NULL) {
Victor Stinnerb2904782010-09-29 10:34:19 +0000571 PyErr_NoMemory();
572 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 }
574 buflen = format_time(outbuf, i, fmt, &buf);
Victor Stinner136ea492011-12-17 22:37:18 +0100575#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100576 err = errno;
Victor Stinner136ea492011-12-17 22:37:18 +0100577#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 if (buflen > 0 || i >= 256 * fmtlen) {
579 /* If the buffer is 256 times as long as the format,
580 it's probably not failing for lack of room!
581 More likely, the format yields an empty result,
582 e.g. an empty format, or %Z when the timezone
583 is unknown. */
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000584#ifdef HAVE_WCSFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 ret = PyUnicode_FromWideChar(outbuf, buflen);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000586#else
Victor Stinner1b579672011-12-17 05:47:23 +0100587 ret = PyUnicode_DecodeLocaleAndSize(outbuf, buflen,
588 "surrogateescape");
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000589#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 PyMem_Free(outbuf);
Victor Stinnerb2904782010-09-29 10:34:19 +0000591 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 }
593 PyMem_Free(outbuf);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000594#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 /* VisualStudio .NET 2005 does this properly */
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100596 if (buflen == 0 && err == EINVAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 PyErr_SetString(PyExc_ValueError, "Invalid format string");
Victor Stinnerb2904782010-09-29 10:34:19 +0000598 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 }
Victor Stinnerb2904782010-09-29 10:34:19 +0000602#ifdef HAVE_WCSFTIME
603 PyMem_Free(format);
604#else
605 Py_DECREF(format);
606#endif
607 return ret;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000608}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000609
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000610#undef time_char
611#undef format_time
612
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000613PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000614"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000615\n\
616Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000617See the library reference manual for formatting codes. When the time tuple\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000618is not present, current time as returned by localtime() is used.");
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000619#endif /* HAVE_STRFTIME */
620
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000621static PyObject *
622time_strptime(PyObject *self, PyObject *args)
623{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 PyObject *strptime_module = PyImport_ImportModuleNoBlock("_strptime");
625 PyObject *strptime_result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200626 _Py_IDENTIFIER(_strptime_time);
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 if (!strptime_module)
629 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200630 strptime_result = _PyObject_CallMethodId(strptime_module,
631 &PyId__strptime_time, "O", args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 Py_DECREF(strptime_module);
633 return strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000634}
635
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000637PyDoc_STRVAR(strptime_doc,
Brett Cannon20def8b2003-07-01 05:16:08 +0000638"strptime(string, format) -> struct_time\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000639\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000640Parse a string to a time tuple according to a format specification.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000641See the library reference manual for formatting codes (same as strftime()).");
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000642
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000643static PyObject *
644_asctime(struct tm *timeptr)
645{
646 /* Inspired by Open Group reference implementation available at
647 * http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */
Victor Stinner499dfcf2011-03-21 13:26:24 +0100648 static char wday_name[7][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000649 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
650 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100651 static char mon_name[12][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000652 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
653 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
654 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100655 return PyUnicode_FromFormat(
656 "%s %s%3d %.2d:%.2d:%.2d %d",
657 wday_name[timeptr->tm_wday],
658 mon_name[timeptr->tm_mon],
659 timeptr->tm_mday, timeptr->tm_hour,
660 timeptr->tm_min, timeptr->tm_sec,
661 1900 + timeptr->tm_year);
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000662}
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000663
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000664static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000665time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 PyObject *tup = NULL;
668 struct tm buf;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))
671 return NULL;
672 if (tup == NULL) {
673 time_t tt = time(NULL);
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100674 if (pylocaltime(&tt, &buf) == -1)
675 return NULL;
676
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000677 } else if (!gettmarg(tup, &buf) || !checktm(&buf))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 return NULL;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000679 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000680}
681
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000682PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000683"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000684\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000685Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
686When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000687is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000688
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000689static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000690time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 time_t tt;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100693 struct tm buf;
694 if (!parse_time_t_args(args, "|O:ctime", &tt))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100696 if (pylocaltime(&tt, &buf) == -1)
Alexander Belopolsky5da468f2011-01-04 17:15:52 +0000697 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100698 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000699}
700
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000701PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000702"ctime(seconds) -> string\n\
703\n\
704Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000705This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000706not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000707
Guido van Rossum60cd8131998-03-06 17:16:21 +0000708#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000709static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100710time_mktime(PyObject *self, PyObject *tup)
Guido van Rossum234f9421993-06-17 12:35:49 +0000711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 struct tm buf;
713 time_t tt;
714 if (!gettmarg(tup, &buf))
715 return NULL;
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000716 buf.tm_wday = -1; /* sentinel; original value ignored */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 tt = mktime(&buf);
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000718 /* Return value of -1 does not necessarily mean an error, but tm_wday
Ezio Melotti13925002011-03-16 11:05:33 +0200719 * cannot remain set to -1 if mktime succeeded. */
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000720 if (tt == (time_t)(-1) && buf.tm_wday == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 PyErr_SetString(PyExc_OverflowError,
722 "mktime argument out of range");
723 return NULL;
724 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100725 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000726}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000727
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000728PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000729"mktime(tuple) -> floating point number\n\
730\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000731Convert a time tuple in local time to seconds since the Epoch.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000732#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000733
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000734#ifdef HAVE_WORKING_TZSET
Martin v. Löwis1a214512008-06-11 05:26:20 +0000735static void PyInit_timezone(PyObject *module);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000736
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000737static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000738time_tzset(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 PyObject* m;
Fred Drake9bb74322002-04-01 14:49:59 +0000741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 m = PyImport_ImportModuleNoBlock("time");
743 if (m == NULL) {
744 return NULL;
745 }
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 tzset();
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 /* Reset timezone, altzone, daylight and tzname */
750 PyInit_timezone(m);
751 Py_DECREF(m);
Tim Peters1b6f7a92004-06-20 02:50:16 +0000752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 Py_INCREF(Py_None);
754 return Py_None;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000755}
756
757PyDoc_STRVAR(tzset_doc,
R. David Murray4d55bf92010-12-14 00:55:46 +0000758"tzset()\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000759\n\
760Initialize, or reinitialize, the local timezone to the value stored in\n\
761os.environ['TZ']. The TZ environment variable should be specified in\n\
Neal Norwitzdc8e1942004-07-20 22:34:37 +0000762standard Unix timezone format as documented in the tzset man page\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000763(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\
764fall back to UTC. If the TZ environment variable is not set, the local\n\
765timezone is set to the systems best guess of wallclock time.\n\
766Changing the TZ environment variable without calling tzset *may* change\n\
767the local timezone used by methods such as localtime, but this behaviour\n\
768should not be relied on.");
769#endif /* HAVE_WORKING_TZSET */
770
Victor Stinner4195b5c2012-02-08 23:03:19 +0100771static PyObject *
772time_wallclock(PyObject *self, PyObject *unused)
Victor Stinnerb94b2662012-01-18 01:50:21 +0100773{
774#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Victor Stinner4195b5c2012-02-08 23:03:19 +0100775 return win32_clock(1);
776#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
Victor Stinnerb94b2662012-01-18 01:50:21 +0100777 static int clk_index = 0;
778 clockid_t clk_ids[] = {
779#ifdef CLOCK_MONOTONIC_RAW
780 CLOCK_MONOTONIC_RAW,
781#endif
782 CLOCK_MONOTONIC
783#ifdef CLOCK_REALTIME
784 /* On Linux, CLOCK_REALTIME uses the same clock than gettimeofday(),
785 but clock_gettime() has a nanosecond resolution. */
786 , CLOCK_REALTIME
787#endif
788 };
789 int ret;
790 struct timespec tp;
791
792 while (0 <= clk_index) {
793 clockid_t clk_id = clk_ids[clk_index];
794 ret = clock_gettime(clk_id, &tp);
795 if (ret == 0)
Victor Stinner4195b5c2012-02-08 23:03:19 +0100796 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnerb94b2662012-01-18 01:50:21 +0100797
798 clk_index++;
799 if (Py_ARRAY_LENGTH(clk_ids) <= clk_index)
800 clk_index = -1;
801 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100802 return time_time(self, NULL);
803#else
804 return time_time(self, NULL);
Victor Stinnerb94b2662012-01-18 01:50:21 +0100805#endif
806}
807
808PyDoc_STRVAR(wallclock_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100809"wallclock() -> float\n\
Victor Stinnerb94b2662012-01-18 01:50:21 +0100810\n\
811Return the current time in fractions of a second to the system's best\n\
812ability. Use this when the most accurate representation of wall-clock is\n\
Victor Stinner855889b2012-01-18 01:57:19 +0100813required, i.e. when \"processor time\" is inappropriate. The reference point\n\
Victor Stinnerb94b2662012-01-18 01:50:21 +0100814of the returned value is undefined so only the difference of consecutive\n\
815calls is valid.");
816
Victor Stinner8b302012012-02-07 23:29:46 +0100817#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) \
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100818 || (defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)) \
819 || (defined(__APPLE__))
Victor Stinner8b302012012-02-07 23:29:46 +0100820# define HAVE_PYTIME_MONOTONIC
821#endif
822
823#ifdef HAVE_PYTIME_MONOTONIC
824static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100825time_monotonic(PyObject *self, PyObject *unused)
Victor Stinner8b302012012-02-07 23:29:46 +0100826{
Victor Stinner4195b5c2012-02-08 23:03:19 +0100827#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
828 return win32_clock(0);
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100829#elif defined(__APPLE__)
830 uint64_t time = mach_absolute_time();
831 double secs;
832
833 static mach_timebase_info_data_t timebase;
834 if (timebase.denom == 0)
835 mach_timebase_info(&timebase);
836
837 secs = (double)time * timebase.numer / timebase.denom * 1e-9;
838
839 return PyFloat_FromDouble(secs);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100840#else
Victor Stinner8b302012012-02-07 23:29:46 +0100841 static int clk_index = 0;
842 clockid_t clk_ids[] = {
843#ifdef CLOCK_MONOTONIC_RAW
844 CLOCK_MONOTONIC_RAW,
845#endif
846 CLOCK_MONOTONIC
847 };
848 int ret;
849 struct timespec tp;
850
851 while (0 <= clk_index) {
852 clockid_t clk_id = clk_ids[clk_index];
853 ret = clock_gettime(clk_id, &tp);
854 if (ret == 0)
Victor Stinner4195b5c2012-02-08 23:03:19 +0100855 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinner8b302012012-02-07 23:29:46 +0100856
857 clk_index++;
858 if (Py_ARRAY_LENGTH(clk_ids) <= clk_index)
859 clk_index = -1;
860 }
861 PyErr_SetFromErrno(PyExc_OSError);
862 return NULL;
863#endif
864}
865
866PyDoc_STRVAR(monotonic_doc,
867"monotonic() -> float\n\
868\n\
869Monotonic clock. The reference point of the returned value is undefined so\n\
870only the difference of consecutive calls is valid.");
871#endif
872
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000873static void
Martin v. Löwis1a214512008-06-11 05:26:20 +0000874PyInit_timezone(PyObject *m) {
875 /* This code moved from PyInit_time wholesale to allow calling it from
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 time_tzset. In the future, some parts of it can be moved back
877 (for platforms that don't HAVE_WORKING_TZSET, when we know what they
878 are), and the extraneous calls to tzset(3) should be removed.
879 I haven't done this yet, as I don't want to change this code as
880 little as possible when introducing the time.tzset and time.tzsetwall
881 methods. This should simply be a method of doing the following once,
882 at the top of this function and removing the call to tzset() from
883 time_tzset():
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 #ifdef HAVE_TZSET
886 tzset()
887 #endif
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 And I'm lazy and hate C so nyer.
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000890 */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000891#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 PyObject *otz0, *otz1;
893 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000894#ifdef PYOS_OS2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 PyModule_AddIntConstant(m, "timezone", _timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000896#else /* !PYOS_OS2 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000898#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000899#ifdef HAVE_ALTZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000901#else
Guido van Rossum26452411998-09-28 22:07:11 +0000902#ifdef PYOS_OS2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000904#else /* !PYOS_OS2 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000906#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000907#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 PyModule_AddIntConstant(m, "daylight", daylight);
Victor Stinner1b579672011-12-17 05:47:23 +0100909 otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
910 otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
Guido van Rossum10b164a2001-09-25 13:59:01 +0000912#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000913#ifdef HAVE_STRUCT_TM_TM_ZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 {
Guido van Rossum234f9421993-06-17 12:35:49 +0000915#define YEAR ((time_t)((365 * 24 + 6) * 3600))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 time_t t;
917 struct tm *p;
918 long janzone, julyzone;
919 char janname[10], julyname[10];
920 t = (time((time_t *)0) / YEAR) * YEAR;
921 p = localtime(&t);
922 janzone = -p->tm_gmtoff;
923 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
924 janname[9] = '\0';
925 t += YEAR/2;
926 p = localtime(&t);
927 julyzone = -p->tm_gmtoff;
928 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
929 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +0000930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 if( janzone < julyzone ) {
932 /* DST is reversed in the southern hemisphere */
933 PyModule_AddIntConstant(m, "timezone", julyzone);
934 PyModule_AddIntConstant(m, "altzone", janzone);
935 PyModule_AddIntConstant(m, "daylight",
936 janzone != julyzone);
937 PyModule_AddObject(m, "tzname",
938 Py_BuildValue("(zz)",
939 julyname, janname));
940 } else {
941 PyModule_AddIntConstant(m, "timezone", janzone);
942 PyModule_AddIntConstant(m, "altzone", julyzone);
943 PyModule_AddIntConstant(m, "daylight",
944 janzone != julyzone);
945 PyModule_AddObject(m, "tzname",
946 Py_BuildValue("(zz)",
947 janname, julyname));
948 }
949 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000950#else
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000951#endif /* HAVE_STRUCT_TM_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000952#ifdef __CYGWIN__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 tzset();
954 PyModule_AddIntConstant(m, "timezone", _timezone);
955 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
956 PyModule_AddIntConstant(m, "daylight", _daylight);
957 PyModule_AddObject(m, "tzname",
958 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +0000959#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000960#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Victor Stinnere0be4232011-10-25 13:06:09 +0200961
962#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_GETRES)
963#ifdef CLOCK_REALTIME
964 PyModule_AddIntMacro(m, CLOCK_REALTIME);
965#endif
966#ifdef CLOCK_MONOTONIC
967 PyModule_AddIntMacro(m, CLOCK_MONOTONIC);
968#endif
969#ifdef CLOCK_MONOTONIC_RAW
970 PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW);
971#endif
972#ifdef CLOCK_PROCESS_CPUTIME_ID
973 PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID);
974#endif
975#ifdef CLOCK_THREAD_CPUTIME_ID
976 PyModule_AddIntMacro(m, CLOCK_THREAD_CPUTIME_ID);
977#endif
978#endif /* HAVE_CLOCK_GETTIME */
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000979}
980
981
982static PyMethodDef time_methods[] = {
Victor Stinner4195b5c2012-02-08 23:03:19 +0100983 {"time", time_time, METH_NOARGS, time_doc},
984#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK)
985 {"clock", time_clock, METH_NOARGS, clock_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000986#endif
Victor Stinnere0be4232011-10-25 13:06:09 +0200987#ifdef HAVE_CLOCK_GETTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +0100988 {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc},
Victor Stinnere0be4232011-10-25 13:06:09 +0200989#endif
990#ifdef HAVE_CLOCK_GETRES
Victor Stinner4195b5c2012-02-08 23:03:19 +0100991 {"clock_getres", time_clock_getres, METH_VARARGS, clock_getres_doc},
Victor Stinnere0be4232011-10-25 13:06:09 +0200992#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
994 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
995 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
996 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
997 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000998#ifdef HAVE_MKTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +0100999 {"mktime", time_mktime, METH_O, mktime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001000#endif
Victor Stinner8b302012012-02-07 23:29:46 +01001001#ifdef HAVE_PYTIME_MONOTONIC
Victor Stinner4195b5c2012-02-08 23:03:19 +01001002 {"monotonic", time_monotonic, METH_NOARGS, monotonic_doc},
Victor Stinner8b302012012-02-07 23:29:46 +01001003#endif
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001004#ifdef HAVE_STRFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001006#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001008#ifdef HAVE_WORKING_TZSET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 {"tzset", time_tzset, METH_NOARGS, tzset_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001010#endif
Victor Stinner4195b5c2012-02-08 23:03:19 +01001011 {"wallclock", time_wallclock, METH_NOARGS, wallclock_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 {NULL, NULL} /* sentinel */
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001013};
1014
1015
1016PyDoc_STRVAR(module_doc,
1017"This module provides various functions to manipulate time values.\n\
1018\n\
1019There are two standard representations of time. One is the number\n\
1020of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
1021or a floating point number (to represent fractions of seconds).\n\
1022The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
1023The actual value can be retrieved by calling gmtime(0).\n\
1024\n\
1025The other representation is a tuple of 9 integers giving local time.\n\
1026The tuple items are:\n\
Alexander Belopolsky03163ac2011-05-02 12:20:52 -04001027 year (including century, e.g. 1998)\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001028 month (1-12)\n\
1029 day (1-31)\n\
1030 hours (0-23)\n\
1031 minutes (0-59)\n\
1032 seconds (0-59)\n\
1033 weekday (0-6, Monday is 0)\n\
1034 Julian day (day in the year, 1-366)\n\
1035 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
1036If the DST flag is 0, the time is given in the regular time zone;\n\
1037if it is 1, the time is given in the DST time zone;\n\
1038if it is -1, mktime() should guess based on the date and time.\n\
1039\n\
1040Variables:\n\
1041\n\
1042timezone -- difference in seconds between UTC and local standard time\n\
1043altzone -- difference in seconds between UTC and local DST time\n\
1044daylight -- whether local time should reflect DST\n\
1045tzname -- tuple of (standard time zone name, DST time zone name)\n\
1046\n\
1047Functions:\n\
1048\n\
1049time() -- return current time in seconds since the Epoch as a float\n\
1050clock() -- return CPU time since process start as a float\n\
1051sleep() -- delay for a number of seconds given as a float\n\
1052gmtime() -- convert seconds since Epoch to UTC tuple\n\
1053localtime() -- convert seconds since Epoch to local time tuple\n\
1054asctime() -- convert time tuple to string\n\
1055ctime() -- convert time in seconds to string\n\
1056mktime() -- convert local time tuple to seconds since Epoch\n\
1057strftime() -- convert time tuple to string according to format specification\n\
1058strptime() -- parse string to time tuple according to format specification\n\
1059tzset() -- change the local timezone");
1060
1061
Martin v. Löwis1a214512008-06-11 05:26:20 +00001062
1063static struct PyModuleDef timemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 PyModuleDef_HEAD_INIT,
1065 "time",
1066 module_doc,
1067 -1,
1068 time_methods,
1069 NULL,
1070 NULL,
1071 NULL,
1072 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001073};
1074
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001075PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001076PyInit_time(void)
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 PyObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 m = PyModule_Create(&timemodule);
1080 if (m == NULL)
1081 return NULL;
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 /* Set, or reset, module variables like time.timezone */
1084 PyInit_timezone(m);
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 if (!initialized) {
1087 PyStructSequence_InitType(&StructTimeType,
1088 &struct_time_type_desc);
1089 }
1090 Py_INCREF(&StructTimeType);
1091 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
1092 initialized = 1;
1093 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001094}
1095
Victor Stinner4195b5c2012-02-08 23:03:19 +01001096static double
1097floattime(void)
1098{
1099 _PyTime_timeval t;
1100 _PyTime_gettimeofday(&t);
1101 return (double)t.tv_sec + t.tv_usec*0.000001;
1102}
1103
1104
Guido van Rossumb6775db1994-08-01 11:34:53 +00001105/* Implement floatsleep() for various platforms.
1106 When interrupted (or when another error occurs), return -1 and
1107 set an exception; else return 0. */
1108
1109static int
Guido van Rossuma320fd31995-03-09 12:14:15 +00001110floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +00001111{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001112/* XXX Should test for MS_WINDOWS first! */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +00001113#if defined(HAVE_SELECT) && !defined(__EMX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 struct timeval t;
1115 double frac;
Victor Stinner48b1ce52011-07-01 13:50:09 +02001116 int err;
1117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 frac = fmod(secs, 1.0);
1119 secs = floor(secs);
1120 t.tv_sec = (long)secs;
1121 t.tv_usec = (long)(frac*1000000.0);
1122 Py_BEGIN_ALLOW_THREADS
Victor Stinner48b1ce52011-07-01 13:50:09 +02001123 err = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t);
1124 Py_END_ALLOW_THREADS
1125 if (err != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +00001126#ifdef EINTR
Victor Stinner48b1ce52011-07-01 13:50:09 +02001127 if (errno == EINTR) {
1128 if (PyErr_CheckSignals())
1129 return -1;
1130 }
1131 else
Guido van Rossum09cbb011999-11-08 15:32:27 +00001132#endif
Victor Stinner48b1ce52011-07-01 13:50:09 +02001133 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 PyErr_SetFromErrno(PyExc_IOError);
1135 return -1;
1136 }
1137 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001138#elif defined(__WATCOMC__) && !defined(__QNX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 /* XXX Can't interrupt this sleep */
1140 Py_BEGIN_ALLOW_THREADS
1141 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
1142 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001143#elif defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 {
1145 double millisecs = secs * 1000.0;
1146 unsigned long ul_millis;
Tim Peters513a1cd2003-01-19 04:54:58 +00001147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 if (millisecs > (double)ULONG_MAX) {
1149 PyErr_SetString(PyExc_OverflowError,
1150 "sleep length is too large");
1151 return -1;
1152 }
1153 Py_BEGIN_ALLOW_THREADS
1154 /* Allow sleep(0) to maintain win32 semantics, and as decreed
1155 * by Guido, only the main thread can be interrupted.
1156 */
1157 ul_millis = (unsigned long)millisecs;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001158 if (ul_millis == 0 || !_PyOS_IsMainThread())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 Sleep(ul_millis);
1160 else {
1161 DWORD rc;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001162 HANDLE hInterruptEvent = _PyOS_SigintEvent();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 ResetEvent(hInterruptEvent);
1164 rc = WaitForSingleObject(hInterruptEvent, ul_millis);
1165 if (rc == WAIT_OBJECT_0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 Py_BLOCK_THREADS
1167 errno = EINTR;
1168 PyErr_SetFromErrno(PyExc_IOError);
1169 return -1;
1170 }
1171 }
1172 Py_END_ALLOW_THREADS
1173 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001174#elif defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 /* This Sleep *IS* Interruptable by Exceptions */
1176 Py_BEGIN_ALLOW_THREADS
1177 if (DosSleep(secs * 1000) != NO_ERROR) {
1178 Py_BLOCK_THREADS
1179 PyErr_SetFromErrno(PyExc_IOError);
1180 return -1;
1181 }
1182 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001183#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 /* XXX Can't interrupt this sleep */
1185 Py_BEGIN_ALLOW_THREADS
1186 sleep((int)secs);
1187 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001188#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +00001191}