blob: 23f3ddd765ccb2ad9553b93a66faec400ddc176a [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 Stinner071eca32012-03-15 01:17:09 +010048static PyObject* 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 Stinner071eca32012-03-15 01:17:09 +010053 return floattime();
Guido van Rossumb6775db1994-08-01 11:34:53 +000054}
55
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000056PyDoc_STRVAR(time_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +010057"time() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +000058\n\
59Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000060Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +000061
Victor Stinner85fdfa82012-01-27 00:38:48 +010062#if defined(HAVE_CLOCK)
63
64#ifndef CLOCKS_PER_SEC
65#ifdef CLK_TCK
66#define CLOCKS_PER_SEC CLK_TCK
67#else
68#define CLOCKS_PER_SEC 1000000
69#endif
70#endif
71
Victor Stinner4195b5c2012-02-08 23:03:19 +010072static PyObject *
73pyclock(void)
Victor Stinner85fdfa82012-01-27 00:38:48 +010074{
Victor Stinner4195b5c2012-02-08 23:03:19 +010075 clock_t value;
76 value = clock();
77 if (value == (clock_t)-1) {
Victor Stinner85fdfa82012-01-27 00:38:48 +010078 PyErr_SetString(PyExc_RuntimeError,
79 "the processor time used is not available "
80 "or its value cannot be represented");
Victor Stinner4195b5c2012-02-08 23:03:19 +010081 return NULL;
Victor Stinner85fdfa82012-01-27 00:38:48 +010082 }
Victor Stinner4195b5c2012-02-08 23:03:19 +010083 return PyFloat_FromDouble((double)value / CLOCKS_PER_SEC);
Victor Stinner85fdfa82012-01-27 00:38:48 +010084}
85#endif /* HAVE_CLOCK */
86
Thomas Wouters477c8d52006-05-27 19:21:47 +000087#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Victor Stinner9122fdd2011-07-04 13:55:40 +020088/* Win32 has better clock replacement; we have our own version, due to Mark
89 Hammond and Tim Peters */
Victor Stinner4195b5c2012-02-08 23:03:19 +010090static PyObject *
91win32_clock(int fallback)
Guido van Rossum3917c221997-04-02 05:35:28 +000092{
Victor Stinner8b302012012-02-07 23:29:46 +010093 static LONGLONG cpu_frequency = 0;
Victor Stinner4195b5c2012-02-08 23:03:19 +010094 static LONGLONG ctrStart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000095 LARGE_INTEGER now;
Victor Stinner4195b5c2012-02-08 23:03:19 +010096 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +000097
Victor Stinner8b302012012-02-07 23:29:46 +010098 if (cpu_frequency == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 LARGE_INTEGER freq;
Victor Stinner8b302012012-02-07 23:29:46 +0100100 QueryPerformanceCounter(&now);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100101 ctrStart = now.QuadPart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
103 /* Unlikely to happen - this works on all intel
104 machines at least! Revert to clock() */
Victor Stinner4195b5c2012-02-08 23:03:19 +0100105 if (fallback)
106 return pyclock();
107 else
108 return PyErr_SetFromWindowsErr(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 }
Victor Stinner8b302012012-02-07 23:29:46 +0100110 cpu_frequency = freq.QuadPart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 }
112 QueryPerformanceCounter(&now);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100113 diff = (double)(now.QuadPart - ctrStart);
114 return PyFloat_FromDouble(diff / (double)cpu_frequency);
Guido van Rossum3917c221997-04-02 05:35:28 +0000115}
Victor Stinner8b302012012-02-07 23:29:46 +0100116#endif
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000117
Victor Stinner8b302012012-02-07 23:29:46 +0100118#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK)
Victor Stinner9122fdd2011-07-04 13:55:40 +0200119static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100120time_clock(PyObject *self, PyObject *unused)
Victor Stinner9122fdd2011-07-04 13:55:40 +0200121{
Victor Stinner8b302012012-02-07 23:29:46 +0100122#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Victor Stinner4195b5c2012-02-08 23:03:19 +0100123 return win32_clock(1);
Victor Stinner8b302012012-02-07 23:29:46 +0100124#else
Victor Stinner4195b5c2012-02-08 23:03:19 +0100125 return pyclock();
Victor Stinner8b302012012-02-07 23:29:46 +0100126#endif
Victor Stinner9122fdd2011-07-04 13:55:40 +0200127}
Victor Stinner9122fdd2011-07-04 13:55:40 +0200128
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000129PyDoc_STRVAR(clock_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100130"clock() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000131\n\
132Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000133the first call to clock(). This has as much precision as the system\n\
134records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000135#endif
136
Victor Stinnere0be4232011-10-25 13:06:09 +0200137#ifdef HAVE_CLOCK_GETTIME
138static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100139time_clock_gettime(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200140{
141 int ret;
142 clockid_t clk_id;
143 struct timespec tp;
144
Victor Stinner4195b5c2012-02-08 23:03:19 +0100145 if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200146 return NULL;
147
148 ret = clock_gettime((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100149 if (ret != 0) {
Victor Stinnere0be4232011-10-25 13:06:09 +0200150 PyErr_SetFromErrno(PyExc_IOError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100151 return NULL;
152 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100153
154 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200155}
156
157PyDoc_STRVAR(clock_gettime_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100158"clock_gettime(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200159\n\
160Return the time of the specified clock clk_id.");
Victor Stinner30d79472012-04-03 00:45:07 +0200161
162static PyObject *
163time_clock_settime(PyObject *self, PyObject *args)
164{
165 clockid_t clk_id;
166 PyObject *obj;
167 struct timespec tp;
168 int ret;
169
170 if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj))
171 return NULL;
172
173 if (_PyTime_ObjectToTimespec(obj, &tp.tv_sec, &tp.tv_nsec) == -1)
174 return NULL;
175
176 ret = clock_settime((clockid_t)clk_id, &tp);
177 if (ret != 0) {
178 PyErr_SetFromErrno(PyExc_IOError);
179 return NULL;
180 }
181 Py_RETURN_NONE;
182}
183
184PyDoc_STRVAR(clock_settime_doc,
185"clock_settime(clk_id, time)\n\
186\n\
187Set the time of the specified clock clk_id.");
Victor Stinnere0be4232011-10-25 13:06:09 +0200188#endif
189
190#ifdef HAVE_CLOCK_GETRES
191static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100192time_clock_getres(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200193{
194 int ret;
195 clockid_t clk_id;
196 struct timespec tp;
197
Victor Stinner4195b5c2012-02-08 23:03:19 +0100198 if (!PyArg_ParseTuple(args, "i:clock_getres", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200199 return NULL;
200
201 ret = clock_getres((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100202 if (ret != 0) {
Victor Stinnere0be4232011-10-25 13:06:09 +0200203 PyErr_SetFromErrno(PyExc_IOError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100204 return NULL;
205 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100206
207 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200208}
209
210PyDoc_STRVAR(clock_getres_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100211"clock_getres(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200212\n\
213Return the resolution (precision) of the specified clock clk_id.");
214#endif
215
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000216static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000217time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000219 double secs;
220 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
221 return NULL;
Victor Stinner7f53a502011-07-05 22:00:25 +0200222 if (secs < 0) {
223 PyErr_SetString(PyExc_ValueError,
224 "sleep length must be non-negative");
225 return NULL;
226 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 if (floatsleep(secs) != 0)
228 return NULL;
229 Py_INCREF(Py_None);
230 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231}
232
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000233PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000234"sleep(seconds)\n\
235\n\
236Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000237a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000238
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000239static PyStructSequence_Field struct_time_type_fields[] = {
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000240 {"tm_year", "year, for example, 1993"},
241 {"tm_mon", "month of year, range [1, 12]"},
242 {"tm_mday", "day of month, range [1, 31]"},
243 {"tm_hour", "hours, range [0, 23]"},
244 {"tm_min", "minutes, range [0, 59]"},
245 {"tm_sec", "seconds, range [0, 61])"},
246 {"tm_wday", "day of week, range [0, 6], Monday is 0"},
247 {"tm_yday", "day of year, range [1, 366]"},
248 {"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 {0}
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000250};
251
252static PyStructSequence_Desc struct_time_type_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 "time.struct_time",
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000254 "The time value as returned by gmtime(), localtime(), and strptime(), and\n"
255 " accepted by asctime(), mktime() and strftime(). May be considered as a\n"
256 " sequence of 9 integers.\n\n"
257 " Note that several fields' values are not the same as those defined by\n"
258 " the C language standard for struct tm. For example, the value of the\n"
259 " field tm_year is the actual year, not year - 1900. See individual\n"
260 " fields' descriptions for details.",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 struct_time_type_fields,
262 9,
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000263};
Tim Peters9ad4b682002-02-13 05:14:18 +0000264
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000265static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000266static PyTypeObject StructTimeType;
267
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000268static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000269tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 PyObject *v = PyStructSequence_New(&StructTimeType);
272 if (v == NULL)
273 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000274
Christian Heimes217cfd12007-12-02 14:31:20 +0000275#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val))
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 SET(0, p->tm_year + 1900);
278 SET(1, p->tm_mon + 1); /* Want January == 1 */
279 SET(2, p->tm_mday);
280 SET(3, p->tm_hour);
281 SET(4, p->tm_min);
282 SET(5, p->tm_sec);
283 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
284 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
285 SET(8, p->tm_isdst);
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000286#undef SET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 if (PyErr_Occurred()) {
288 Py_XDECREF(v);
289 return NULL;
290 }
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000293}
294
Fred Drakef901abd2004-08-03 17:58:55 +0000295/* Parse arg tuple that can contain an optional float-or-None value;
296 format needs to be "|O:name".
297 Returns non-zero on success (parallels PyArg_ParseTuple).
298*/
299static int
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100300parse_time_t_args(PyObject *args, char *format, time_t *pwhen)
Fred Drakef901abd2004-08-03 17:58:55 +0000301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 PyObject *ot = NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100303 time_t whent;
Fred Drakef901abd2004-08-03 17:58:55 +0000304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 if (!PyArg_ParseTuple(args, format, &ot))
306 return 0;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100307 if (ot == NULL || ot == Py_None) {
308 whent = time(NULL);
309 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 else {
Victor Stinner5d272cc2012-03-13 13:35:55 +0100311 if (_PyTime_ObjectToTime_t(ot, &whent) == -1)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100312 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 }
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100314 *pwhen = whent;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 return 1;
Fred Drakef901abd2004-08-03 17:58:55 +0000316}
317
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000318static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000319time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000320{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100321 time_t when;
322 struct tm buf, *local;
323
324 if (!parse_time_t_args(args, "|O:gmtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100326
327 errno = 0;
328 local = gmtime(&when);
329 if (local == NULL) {
330#ifdef EINVAL
331 if (errno == 0)
332 errno = EINVAL;
333#endif
334 return PyErr_SetFromErrno(PyExc_OSError);
335 }
336 buf = *local;
337 return tmtotuple(&buf);
Guido van Rossum234f9421993-06-17 12:35:49 +0000338}
339
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000340PyDoc_STRVAR(gmtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000341"gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n\
Fred Drake193a3f62002-03-12 21:38:49 +0000342 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000343\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000344Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000345GMT). When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000346
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100347static int
348pylocaltime(time_t *timep, struct tm *result)
349{
350 struct tm *local;
351
352 assert (timep != NULL);
353 local = localtime(timep);
354 if (local == NULL) {
355 /* unconvertible time */
356#ifdef EINVAL
357 if (errno == 0)
358 errno = EINVAL;
359#endif
360 PyErr_SetFromErrno(PyExc_OSError);
361 return -1;
362 }
363 *result = *local;
364 return 0;
365}
366
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000367static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000368time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000369{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100370 time_t when;
371 struct tm buf;
372
373 if (!parse_time_t_args(args, "|O:localtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100375 if (pylocaltime(&when, &buf) == 1)
376 return NULL;
377 return tmtotuple(&buf);
Guido van Rossum234f9421993-06-17 12:35:49 +0000378}
379
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000380PyDoc_STRVAR(localtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000381"localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000383\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000384Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000385When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000386
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000387/* Convert 9-item tuple to tm structure. Return 1 on success, set
388 * an exception and return 0 on error.
389 */
Guido van Rossum9e90a671993-06-24 11:10:19 +0000390static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000391gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 int y;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumb9081262007-08-25 03:14:09 +0000396
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000397 if (!PyTuple_Check(args)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 PyErr_SetString(PyExc_TypeError,
399 "Tuple or struct_time argument required");
400 return 0;
401 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000402
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000403 if (!PyArg_ParseTuple(args, "iiiiiiiii",
404 &y, &p->tm_mon, &p->tm_mday,
405 &p->tm_hour, &p->tm_min, &p->tm_sec,
406 &p->tm_wday, &p->tm_yday, &p->tm_isdst))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 p->tm_year = y - 1900;
409 p->tm_mon--;
410 p->tm_wday = (p->tm_wday + 1) % 7;
411 p->tm_yday--;
412 return 1;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000413}
414
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000415/* Check values of the struct tm fields before it is passed to strftime() and
416 * asctime(). Return 1 if all values are valid, otherwise set an exception
417 * and returns 0.
418 */
Victor Stinneref128102010-10-07 01:00:52 +0000419static int
420checktm(struct tm* buf)
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000421{
Victor Stinneref128102010-10-07 01:00:52 +0000422 /* Checks added to make sure strftime() and asctime() does not crash Python by
423 indexing blindly into some array for a textual representation
424 by some bad index (fixes bug #897625 and #6608).
425
426 Also support values of zero from Python code for arguments in which
427 that is out of range by forcing that value to the lowest value that
428 is valid (fixed bug #1520914).
429
430 Valid ranges based on what is allowed in struct tm:
431
432 - tm_year: [0, max(int)] (1)
433 - tm_mon: [0, 11] (2)
434 - tm_mday: [1, 31]
435 - tm_hour: [0, 23]
436 - tm_min: [0, 59]
437 - tm_sec: [0, 60]
438 - tm_wday: [0, 6] (1)
439 - tm_yday: [0, 365] (2)
440 - tm_isdst: [-max(int), max(int)]
441
442 (1) gettmarg() handles bounds-checking.
443 (2) Python's acceptable range is one greater than the range in C,
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000444 thus need to check against automatic decrement by gettmarg().
445 */
446 if (buf->tm_mon == -1)
447 buf->tm_mon = 0;
448 else if (buf->tm_mon < 0 || buf->tm_mon > 11) {
449 PyErr_SetString(PyExc_ValueError, "month out of range");
450 return 0;
451 }
452 if (buf->tm_mday == 0)
453 buf->tm_mday = 1;
454 else if (buf->tm_mday < 0 || buf->tm_mday > 31) {
455 PyErr_SetString(PyExc_ValueError, "day of month out of range");
456 return 0;
457 }
458 if (buf->tm_hour < 0 || buf->tm_hour > 23) {
459 PyErr_SetString(PyExc_ValueError, "hour out of range");
460 return 0;
461 }
462 if (buf->tm_min < 0 || buf->tm_min > 59) {
463 PyErr_SetString(PyExc_ValueError, "minute out of range");
464 return 0;
465 }
466 if (buf->tm_sec < 0 || buf->tm_sec > 61) {
467 PyErr_SetString(PyExc_ValueError, "seconds out of range");
468 return 0;
469 }
470 /* tm_wday does not need checking of its upper-bound since taking
471 ``% 7`` in gettmarg() automatically restricts the range. */
472 if (buf->tm_wday < 0) {
473 PyErr_SetString(PyExc_ValueError, "day of week out of range");
474 return 0;
475 }
476 if (buf->tm_yday == -1)
477 buf->tm_yday = 0;
478 else if (buf->tm_yday < 0 || buf->tm_yday > 365) {
479 PyErr_SetString(PyExc_ValueError, "day of year out of range");
480 return 0;
481 }
482 return 1;
483}
484
Victor Stinnerc1f32ca2011-10-14 02:36:13 +0200485#ifdef MS_WINDOWS
486 /* wcsftime() doesn't format correctly time zones, see issue #10653 */
487# undef HAVE_WCSFTIME
488#endif
489
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000490#ifdef HAVE_STRFTIME
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000491#ifdef HAVE_WCSFTIME
492#define time_char wchar_t
493#define format_time wcsftime
494#define time_strlen wcslen
495#else
496#define time_char char
497#define format_time strftime
498#define time_strlen strlen
499#endif
500
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000501static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000502time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 PyObject *tup = NULL;
505 struct tm buf;
506 const time_char *fmt;
Victor Stinnerb2904782010-09-29 10:34:19 +0000507#ifdef HAVE_WCSFTIME
508 wchar_t *format;
509#else
510 PyObject *format;
511#endif
Victor Stinneref128102010-10-07 01:00:52 +0000512 PyObject *format_arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 size_t fmtlen, buflen;
Victor Stinnerb2904782010-09-29 10:34:19 +0000514 time_char *outbuf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 size_t i;
Victor Stinnerb2904782010-09-29 10:34:19 +0000516 PyObject *ret = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 /* Will always expect a unicode string to be passed as format.
521 Given that there's no str type anymore in py3k this seems safe.
522 */
Victor Stinneref128102010-10-07 01:00:52 +0000523 if (!PyArg_ParseTuple(args, "U|O:strftime", &format_arg, &tup))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 if (tup == NULL) {
527 time_t tt = time(NULL);
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100528 if (pylocaltime(&tt, &buf) == -1)
529 return NULL;
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000530 }
531 else if (!gettmarg(tup, &buf) || !checktm(&buf))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000533
Victor Stinner06ec45e2011-01-08 03:35:36 +0000534#if defined(_MSC_VER) || defined(sun)
Victor Stinner73ea29c2011-01-08 01:56:31 +0000535 if (buf.tm_year + 1900 < 1 || 9999 < buf.tm_year + 1900) {
Victor Stinner6f0e4f92011-03-21 02:14:53 +0100536 PyErr_SetString(PyExc_ValueError,
537 "strftime() requires year in [1; 9999]");
Alexander Belopolsky0dd06f42011-01-08 01:23:02 +0000538 return NULL;
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000539 }
Victor Stinner73ea29c2011-01-08 01:56:31 +0000540#endif
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 /* Normalize tm_isdst just in case someone foolishly implements %Z
543 based on the assumption that tm_isdst falls within the range of
544 [-1, 1] */
545 if (buf.tm_isdst < -1)
546 buf.tm_isdst = -1;
547 else if (buf.tm_isdst > 1)
548 buf.tm_isdst = 1;
Brett Cannond1080a32004-03-02 04:38:10 +0000549
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000550#ifdef HAVE_WCSFTIME
Victor Stinnerbeb4135b2010-10-07 01:02:42 +0000551 format = PyUnicode_AsWideCharString(format_arg, NULL);
Victor Stinnerb2904782010-09-29 10:34:19 +0000552 if (format == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 return NULL;
Victor Stinnerb2904782010-09-29 10:34:19 +0000554 fmt = format;
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000555#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 /* Convert the unicode string to an ascii one */
Victor Stinner1b579672011-12-17 05:47:23 +0100557 format = PyUnicode_EncodeLocale(format_arg, "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 if (format == NULL)
559 return NULL;
560 fmt = PyBytes_AS_STRING(format);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000561#endif
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000562
Stefan Krah4aea7d32012-02-27 16:30:26 +0100563#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 /* check that the format string contains only valid directives */
Victor Stinner5a3ff792011-10-16 19:08:23 +0200565 for(outbuf = strchr(fmt, '%');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 outbuf != NULL;
Victor Stinner5a3ff792011-10-16 19:08:23 +0200567 outbuf = strchr(outbuf+2, '%'))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 {
569 if (outbuf[1]=='#')
570 ++outbuf; /* not documented by python, */
571 if (outbuf[1]=='\0' ||
Victor Stinner5a3ff792011-10-16 19:08:23 +0200572 !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 {
574 PyErr_SetString(PyExc_ValueError, "Invalid format string");
Stefan Krah4aea7d32012-02-27 16:30:26 +0100575 Py_DECREF(format);
576 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 }
578 }
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000579#endif
580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 fmtlen = time_strlen(fmt);
Guido van Rossumc222ec21999-02-23 00:00:10 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 /* I hate these functions that presume you know how big the output
584 * will be ahead of time...
585 */
586 for (i = 1024; ; i += i) {
Victor Stinner136ea492011-12-17 22:37:18 +0100587#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100588 int err;
Victor Stinner136ea492011-12-17 22:37:18 +0100589#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 outbuf = (time_char *)PyMem_Malloc(i*sizeof(time_char));
591 if (outbuf == NULL) {
Victor Stinnerb2904782010-09-29 10:34:19 +0000592 PyErr_NoMemory();
593 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 }
595 buflen = format_time(outbuf, i, fmt, &buf);
Victor Stinner136ea492011-12-17 22:37:18 +0100596#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100597 err = errno;
Victor Stinner136ea492011-12-17 22:37:18 +0100598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 if (buflen > 0 || i >= 256 * fmtlen) {
600 /* If the buffer is 256 times as long as the format,
601 it's probably not failing for lack of room!
602 More likely, the format yields an empty result,
603 e.g. an empty format, or %Z when the timezone
604 is unknown. */
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000605#ifdef HAVE_WCSFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 ret = PyUnicode_FromWideChar(outbuf, buflen);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000607#else
Victor Stinner1b579672011-12-17 05:47:23 +0100608 ret = PyUnicode_DecodeLocaleAndSize(outbuf, buflen,
609 "surrogateescape");
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 PyMem_Free(outbuf);
Victor Stinnerb2904782010-09-29 10:34:19 +0000612 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 }
614 PyMem_Free(outbuf);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000615#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 /* VisualStudio .NET 2005 does this properly */
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100617 if (buflen == 0 && err == EINVAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 PyErr_SetString(PyExc_ValueError, "Invalid format string");
Victor Stinnerb2904782010-09-29 10:34:19 +0000619 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 }
Victor Stinnerb2904782010-09-29 10:34:19 +0000623#ifdef HAVE_WCSFTIME
624 PyMem_Free(format);
625#else
626 Py_DECREF(format);
627#endif
628 return ret;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000629}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000630
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000631#undef time_char
632#undef format_time
633
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000634PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000635"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000636\n\
637Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000638See the library reference manual for formatting codes. When the time tuple\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000639is not present, current time as returned by localtime() is used.");
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000640#endif /* HAVE_STRFTIME */
641
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000642static PyObject *
643time_strptime(PyObject *self, PyObject *args)
644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 PyObject *strptime_module = PyImport_ImportModuleNoBlock("_strptime");
646 PyObject *strptime_result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200647 _Py_IDENTIFIER(_strptime_time);
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 if (!strptime_module)
650 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200651 strptime_result = _PyObject_CallMethodId(strptime_module,
652 &PyId__strptime_time, "O", args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 Py_DECREF(strptime_module);
654 return strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000655}
656
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000657
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000658PyDoc_STRVAR(strptime_doc,
Brett Cannon20def8b2003-07-01 05:16:08 +0000659"strptime(string, format) -> struct_time\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000660\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000661Parse a string to a time tuple according to a format specification.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000662See the library reference manual for formatting codes (same as strftime()).");
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000663
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000664static PyObject *
665_asctime(struct tm *timeptr)
666{
667 /* Inspired by Open Group reference implementation available at
668 * http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */
Victor Stinner499dfcf2011-03-21 13:26:24 +0100669 static char wday_name[7][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000670 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
671 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100672 static char mon_name[12][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000673 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
674 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
675 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100676 return PyUnicode_FromFormat(
677 "%s %s%3d %.2d:%.2d:%.2d %d",
678 wday_name[timeptr->tm_wday],
679 mon_name[timeptr->tm_mon],
680 timeptr->tm_mday, timeptr->tm_hour,
681 timeptr->tm_min, timeptr->tm_sec,
682 1900 + timeptr->tm_year);
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000683}
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000684
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000685static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000686time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 PyObject *tup = NULL;
689 struct tm buf;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))
692 return NULL;
693 if (tup == NULL) {
694 time_t tt = time(NULL);
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100695 if (pylocaltime(&tt, &buf) == -1)
696 return NULL;
697
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000698 } else if (!gettmarg(tup, &buf) || !checktm(&buf))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 return NULL;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000700 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000701}
702
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000703PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000704"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000705\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000706Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
707When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000708is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000709
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000710static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000711time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 time_t tt;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100714 struct tm buf;
715 if (!parse_time_t_args(args, "|O:ctime", &tt))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100717 if (pylocaltime(&tt, &buf) == -1)
Alexander Belopolsky5da468f2011-01-04 17:15:52 +0000718 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100719 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000720}
721
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000722PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000723"ctime(seconds) -> string\n\
724\n\
725Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000726This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000727not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000728
Guido van Rossum60cd8131998-03-06 17:16:21 +0000729#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000730static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100731time_mktime(PyObject *self, PyObject *tup)
Guido van Rossum234f9421993-06-17 12:35:49 +0000732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 struct tm buf;
734 time_t tt;
735 if (!gettmarg(tup, &buf))
736 return NULL;
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000737 buf.tm_wday = -1; /* sentinel; original value ignored */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 tt = mktime(&buf);
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000739 /* Return value of -1 does not necessarily mean an error, but tm_wday
Ezio Melotti13925002011-03-16 11:05:33 +0200740 * cannot remain set to -1 if mktime succeeded. */
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000741 if (tt == (time_t)(-1) && buf.tm_wday == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 PyErr_SetString(PyExc_OverflowError,
743 "mktime argument out of range");
744 return NULL;
745 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100746 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000747}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000748
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000749PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000750"mktime(tuple) -> floating point number\n\
751\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000752Convert a time tuple in local time to seconds since the Epoch.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000753#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000754
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000755#ifdef HAVE_WORKING_TZSET
Martin v. Löwis1a214512008-06-11 05:26:20 +0000756static void PyInit_timezone(PyObject *module);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000757
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000758static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000759time_tzset(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000760{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 PyObject* m;
Fred Drake9bb74322002-04-01 14:49:59 +0000762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 m = PyImport_ImportModuleNoBlock("time");
764 if (m == NULL) {
765 return NULL;
766 }
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 tzset();
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 /* Reset timezone, altzone, daylight and tzname */
771 PyInit_timezone(m);
772 Py_DECREF(m);
Tim Peters1b6f7a92004-06-20 02:50:16 +0000773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 Py_INCREF(Py_None);
775 return Py_None;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000776}
777
778PyDoc_STRVAR(tzset_doc,
R. David Murray4d55bf92010-12-14 00:55:46 +0000779"tzset()\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000780\n\
781Initialize, or reinitialize, the local timezone to the value stored in\n\
782os.environ['TZ']. The TZ environment variable should be specified in\n\
Neal Norwitzdc8e1942004-07-20 22:34:37 +0000783standard Unix timezone format as documented in the tzset man page\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000784(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\
785fall back to UTC. If the TZ environment variable is not set, the local\n\
786timezone is set to the systems best guess of wallclock time.\n\
787Changing the TZ environment variable without calling tzset *may* change\n\
788the local timezone used by methods such as localtime, but this behaviour\n\
789should not be relied on.");
790#endif /* HAVE_WORKING_TZSET */
791
Victor Stinner071eca32012-03-15 01:17:09 +0100792static PyObject*
793steady_clock(int strict)
Victor Stinnerb94b2662012-01-18 01:50:21 +0100794{
795#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Victor Stinner071eca32012-03-15 01:17:09 +0100796 return win32_clock(!strict);
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100797#elif defined(__APPLE__)
Victor Stinner74eb6c02012-03-28 02:50:46 +0200798 static mach_timebase_info_data_t timebase;
799 uint64_t time;
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100800 double secs;
801
Victor Stinner74eb6c02012-03-28 02:50:46 +0200802 if (timebase.denom == 0) {
803 /* According to the Technical Q&A QA1398, mach_timebase_info() cannot
804 fail: https://developer.apple.com/library/mac/#qa/qa1398/ */
805 (void)mach_timebase_info(&timebase);
806 }
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100807
Victor Stinner74eb6c02012-03-28 02:50:46 +0200808 time = mach_absolute_time();
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100809 secs = (double)time * timebase.numer / timebase.denom * 1e-9;
810
811 return PyFloat_FromDouble(secs);
Victor Stinnerec919cc2012-03-15 00:58:32 +0100812#elif defined(HAVE_CLOCK_GETTIME)
Victor Stinner84860762012-03-26 22:53:14 +0200813 static int steady_clk_index = 0;
814 static int monotonic_clk_index = 0;
815 int *clk_index;
816 clockid_t steady_clk_ids[] = {
Victor Stinner8b302012012-02-07 23:29:46 +0100817#ifdef CLOCK_MONOTONIC_RAW
818 CLOCK_MONOTONIC_RAW,
819#endif
Victor Stinnerec919cc2012-03-15 00:58:32 +0100820 CLOCK_MONOTONIC,
821 CLOCK_REALTIME
Victor Stinner8b302012012-02-07 23:29:46 +0100822 };
Victor Stinner84860762012-03-26 22:53:14 +0200823 clockid_t monotonic_clk_ids[] = {
824#ifdef CLOCK_MONOTONIC_RAW
825 CLOCK_MONOTONIC_RAW,
826#endif
827 CLOCK_MONOTONIC
828 };
829 clockid_t *clk_ids;
830 int clk_ids_len;
Victor Stinner8b302012012-02-07 23:29:46 +0100831 int ret;
832 struct timespec tp;
833
Victor Stinner84860762012-03-26 22:53:14 +0200834 if (strict) {
835 clk_index = &monotonic_clk_index;
836 clk_ids = monotonic_clk_ids;
837 clk_ids_len = Py_ARRAY_LENGTH(monotonic_clk_ids);
838 }
839 else {
840 clk_index = &steady_clk_index;
841 clk_ids = steady_clk_ids;
842 clk_ids_len = Py_ARRAY_LENGTH(steady_clk_ids);
843 }
844
845 while (0 <= *clk_index) {
846 clockid_t clk_id = clk_ids[*clk_index];
Victor Stinner8b302012012-02-07 23:29:46 +0100847 ret = clock_gettime(clk_id, &tp);
848 if (ret == 0)
Victor Stinner4195b5c2012-02-08 23:03:19 +0100849 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinner8b302012012-02-07 23:29:46 +0100850
Victor Stinner84860762012-03-26 22:53:14 +0200851 (*clk_index)++;
852 if (clk_ids_len <= *clk_index)
853 (*clk_index) = -1;
Victor Stinner8b302012012-02-07 23:29:46 +0100854 }
Victor Stinner071eca32012-03-15 01:17:09 +0100855 if (strict) {
856 PyErr_SetFromErrno(PyExc_OSError);
857 return NULL;
858 }
859 return floattime();
Victor Stinnerec919cc2012-03-15 00:58:32 +0100860#else
Victor Stinner071eca32012-03-15 01:17:09 +0100861 if (strict) {
862 PyErr_SetString(PyExc_NotImplementedError,
863 "no steady clock available on your platform");
864 return NULL;
865 }
866 return floattime();
Victor Stinner8b302012012-02-07 23:29:46 +0100867#endif
868}
869
Victor Stinner071eca32012-03-15 01:17:09 +0100870static PyObject *
871time_steady(PyObject *self, PyObject *args, PyObject *kwargs)
872{
873 static char *kwlist[] = {"strict", NULL};
874 int strict = 0;
875
876 if (!PyArg_ParseTupleAndKeywords(
877 args, kwargs, "|i:steady", kwlist,
878 &strict))
879 return NULL;
880
881 return steady_clock(strict);
882}
883
Victor Stinnerec919cc2012-03-15 00:58:32 +0100884PyDoc_STRVAR(steady_doc,
Victor Stinner071eca32012-03-15 01:17:09 +0100885"steady(strict=False) -> float\n\
Victor Stinner8b302012012-02-07 23:29:46 +0100886\n\
Victor Stinnerec919cc2012-03-15 00:58:32 +0100887Return the current time as a floating point number expressed in seconds.\n\
888This clock advances at a steady rate relative to real time and it may not\n\
889be adjusted. The reference point of the returned value is undefined so only\n\
890the difference of consecutive calls is valid.");
891
Victor Stinner8b302012012-02-07 23:29:46 +0100892
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000893static void
Martin v. Löwis1a214512008-06-11 05:26:20 +0000894PyInit_timezone(PyObject *m) {
895 /* This code moved from PyInit_time wholesale to allow calling it from
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 time_tzset. In the future, some parts of it can be moved back
897 (for platforms that don't HAVE_WORKING_TZSET, when we know what they
898 are), and the extraneous calls to tzset(3) should be removed.
899 I haven't done this yet, as I don't want to change this code as
900 little as possible when introducing the time.tzset and time.tzsetwall
901 methods. This should simply be a method of doing the following once,
902 at the top of this function and removing the call to tzset() from
903 time_tzset():
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 #ifdef HAVE_TZSET
906 tzset()
907 #endif
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 And I'm lazy and hate C so nyer.
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000910 */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000911#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 PyObject *otz0, *otz1;
913 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000914#ifdef PYOS_OS2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 PyModule_AddIntConstant(m, "timezone", _timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000916#else /* !PYOS_OS2 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000918#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000919#ifdef HAVE_ALTZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000921#else
Guido van Rossum26452411998-09-28 22:07:11 +0000922#ifdef PYOS_OS2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000924#else /* !PYOS_OS2 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000926#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 PyModule_AddIntConstant(m, "daylight", daylight);
Victor Stinner1b579672011-12-17 05:47:23 +0100929 otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
930 otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
Guido van Rossum10b164a2001-09-25 13:59:01 +0000932#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000933#ifdef HAVE_STRUCT_TM_TM_ZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 {
Guido van Rossum234f9421993-06-17 12:35:49 +0000935#define YEAR ((time_t)((365 * 24 + 6) * 3600))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 time_t t;
937 struct tm *p;
938 long janzone, julyzone;
939 char janname[10], julyname[10];
940 t = (time((time_t *)0) / YEAR) * YEAR;
941 p = localtime(&t);
942 janzone = -p->tm_gmtoff;
943 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
944 janname[9] = '\0';
945 t += YEAR/2;
946 p = localtime(&t);
947 julyzone = -p->tm_gmtoff;
948 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
949 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +0000950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 if( janzone < julyzone ) {
952 /* DST is reversed in the southern hemisphere */
953 PyModule_AddIntConstant(m, "timezone", julyzone);
954 PyModule_AddIntConstant(m, "altzone", janzone);
955 PyModule_AddIntConstant(m, "daylight",
956 janzone != julyzone);
957 PyModule_AddObject(m, "tzname",
958 Py_BuildValue("(zz)",
959 julyname, janname));
960 } else {
961 PyModule_AddIntConstant(m, "timezone", janzone);
962 PyModule_AddIntConstant(m, "altzone", julyzone);
963 PyModule_AddIntConstant(m, "daylight",
964 janzone != julyzone);
965 PyModule_AddObject(m, "tzname",
966 Py_BuildValue("(zz)",
967 janname, julyname));
968 }
969 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000970#else
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000971#endif /* HAVE_STRUCT_TM_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000972#ifdef __CYGWIN__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 tzset();
974 PyModule_AddIntConstant(m, "timezone", _timezone);
975 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
976 PyModule_AddIntConstant(m, "daylight", _daylight);
977 PyModule_AddObject(m, "tzname",
978 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +0000979#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000980#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Victor Stinnere0be4232011-10-25 13:06:09 +0200981
982#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_GETRES)
983#ifdef CLOCK_REALTIME
984 PyModule_AddIntMacro(m, CLOCK_REALTIME);
985#endif
986#ifdef CLOCK_MONOTONIC
987 PyModule_AddIntMacro(m, CLOCK_MONOTONIC);
988#endif
989#ifdef CLOCK_MONOTONIC_RAW
990 PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW);
991#endif
Victor Stinner1470f352012-04-03 00:31:17 +0200992#ifdef CLOCK_HIGHRES
993 PyModule_AddIntMacro(m, CLOCK_HIGHRES);
994#endif
Victor Stinnere0be4232011-10-25 13:06:09 +0200995#ifdef CLOCK_PROCESS_CPUTIME_ID
996 PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID);
997#endif
998#ifdef CLOCK_THREAD_CPUTIME_ID
999 PyModule_AddIntMacro(m, CLOCK_THREAD_CPUTIME_ID);
1000#endif
1001#endif /* HAVE_CLOCK_GETTIME */
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001002}
1003
1004
1005static PyMethodDef time_methods[] = {
Victor Stinner4195b5c2012-02-08 23:03:19 +01001006 {"time", time_time, METH_NOARGS, time_doc},
1007#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK)
1008 {"clock", time_clock, METH_NOARGS, clock_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001009#endif
Victor Stinnere0be4232011-10-25 13:06:09 +02001010#ifdef HAVE_CLOCK_GETTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +01001011 {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc},
Victor Stinnere0be4232011-10-25 13:06:09 +02001012#endif
Victor Stinner30d79472012-04-03 00:45:07 +02001013#ifdef HAVE_CLOCK_GETTIME
1014 {"clock_settime", time_clock_settime, METH_VARARGS, clock_settime_doc},
1015#endif
Victor Stinnere0be4232011-10-25 13:06:09 +02001016#ifdef HAVE_CLOCK_GETRES
Victor Stinner4195b5c2012-02-08 23:03:19 +01001017 {"clock_getres", time_clock_getres, METH_VARARGS, clock_getres_doc},
Victor Stinnere0be4232011-10-25 13:06:09 +02001018#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
1020 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
1021 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
1022 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
1023 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001024#ifdef HAVE_MKTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +01001025 {"mktime", time_mktime, METH_O, mktime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001026#endif
Victor Stinner071eca32012-03-15 01:17:09 +01001027 {"steady", (PyCFunction)time_steady, METH_VARARGS|METH_KEYWORDS,
1028 steady_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001029#ifdef HAVE_STRFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001033#ifdef HAVE_WORKING_TZSET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 {"tzset", time_tzset, METH_NOARGS, tzset_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 {NULL, NULL} /* sentinel */
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001037};
1038
1039
1040PyDoc_STRVAR(module_doc,
1041"This module provides various functions to manipulate time values.\n\
1042\n\
1043There are two standard representations of time. One is the number\n\
1044of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
1045or a floating point number (to represent fractions of seconds).\n\
1046The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
1047The actual value can be retrieved by calling gmtime(0).\n\
1048\n\
1049The other representation is a tuple of 9 integers giving local time.\n\
1050The tuple items are:\n\
Alexander Belopolsky03163ac2011-05-02 12:20:52 -04001051 year (including century, e.g. 1998)\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001052 month (1-12)\n\
1053 day (1-31)\n\
1054 hours (0-23)\n\
1055 minutes (0-59)\n\
1056 seconds (0-59)\n\
1057 weekday (0-6, Monday is 0)\n\
1058 Julian day (day in the year, 1-366)\n\
1059 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
1060If the DST flag is 0, the time is given in the regular time zone;\n\
1061if it is 1, the time is given in the DST time zone;\n\
1062if it is -1, mktime() should guess based on the date and time.\n\
1063\n\
1064Variables:\n\
1065\n\
1066timezone -- difference in seconds between UTC and local standard time\n\
1067altzone -- difference in seconds between UTC and local DST time\n\
1068daylight -- whether local time should reflect DST\n\
1069tzname -- tuple of (standard time zone name, DST time zone name)\n\
1070\n\
1071Functions:\n\
1072\n\
1073time() -- return current time in seconds since the Epoch as a float\n\
1074clock() -- return CPU time since process start as a float\n\
1075sleep() -- delay for a number of seconds given as a float\n\
1076gmtime() -- convert seconds since Epoch to UTC tuple\n\
1077localtime() -- convert seconds since Epoch to local time tuple\n\
1078asctime() -- convert time tuple to string\n\
1079ctime() -- convert time in seconds to string\n\
1080mktime() -- convert local time tuple to seconds since Epoch\n\
1081strftime() -- convert time tuple to string according to format specification\n\
1082strptime() -- parse string to time tuple according to format specification\n\
1083tzset() -- change the local timezone");
1084
1085
Martin v. Löwis1a214512008-06-11 05:26:20 +00001086
1087static struct PyModuleDef timemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 PyModuleDef_HEAD_INIT,
1089 "time",
1090 module_doc,
1091 -1,
1092 time_methods,
1093 NULL,
1094 NULL,
1095 NULL,
1096 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001097};
1098
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001099PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001100PyInit_time(void)
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 PyObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 m = PyModule_Create(&timemodule);
1104 if (m == NULL)
1105 return NULL;
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 /* Set, or reset, module variables like time.timezone */
1108 PyInit_timezone(m);
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 if (!initialized) {
1111 PyStructSequence_InitType(&StructTimeType,
1112 &struct_time_type_desc);
1113 }
1114 Py_INCREF(&StructTimeType);
1115 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
1116 initialized = 1;
1117 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001118}
1119
Victor Stinner071eca32012-03-15 01:17:09 +01001120static PyObject*
Victor Stinner4195b5c2012-02-08 23:03:19 +01001121floattime(void)
1122{
1123 _PyTime_timeval t;
Victor Stinnerad95c2d2012-03-28 02:54:15 +02001124#ifdef HAVE_CLOCK_GETTIME
1125 struct timespec tp;
1126 int ret;
1127
1128 /* _PyTime_gettimeofday() does not use clock_gettime()
1129 because it would require to link Python to the rt (real-time)
1130 library, at least on Linux */
1131 ret = clock_gettime(CLOCK_REALTIME, &tp);
1132 if (ret == 0)
1133 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
1134#endif
Victor Stinner4195b5c2012-02-08 23:03:19 +01001135 _PyTime_gettimeofday(&t);
Victor Stinner70b2e1e2012-03-26 22:08:02 +02001136 return PyFloat_FromDouble((double)t.tv_sec + t.tv_usec * 1e-6);
Victor Stinner4195b5c2012-02-08 23:03:19 +01001137}
1138
1139
Guido van Rossumb6775db1994-08-01 11:34:53 +00001140/* Implement floatsleep() for various platforms.
1141 When interrupted (or when another error occurs), return -1 and
1142 set an exception; else return 0. */
1143
1144static int
Guido van Rossuma320fd31995-03-09 12:14:15 +00001145floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +00001146{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001147/* XXX Should test for MS_WINDOWS first! */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +00001148#if defined(HAVE_SELECT) && !defined(__EMX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 struct timeval t;
1150 double frac;
Victor Stinner48b1ce52011-07-01 13:50:09 +02001151 int err;
1152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 frac = fmod(secs, 1.0);
1154 secs = floor(secs);
1155 t.tv_sec = (long)secs;
1156 t.tv_usec = (long)(frac*1000000.0);
1157 Py_BEGIN_ALLOW_THREADS
Victor Stinner48b1ce52011-07-01 13:50:09 +02001158 err = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t);
1159 Py_END_ALLOW_THREADS
1160 if (err != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +00001161#ifdef EINTR
Victor Stinner48b1ce52011-07-01 13:50:09 +02001162 if (errno == EINTR) {
1163 if (PyErr_CheckSignals())
1164 return -1;
1165 }
1166 else
Guido van Rossum09cbb011999-11-08 15:32:27 +00001167#endif
Victor Stinner48b1ce52011-07-01 13:50:09 +02001168 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 PyErr_SetFromErrno(PyExc_IOError);
1170 return -1;
1171 }
1172 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001173#elif defined(__WATCOMC__) && !defined(__QNX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 /* XXX Can't interrupt this sleep */
1175 Py_BEGIN_ALLOW_THREADS
1176 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
1177 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001178#elif defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 {
1180 double millisecs = secs * 1000.0;
1181 unsigned long ul_millis;
Tim Peters513a1cd2003-01-19 04:54:58 +00001182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 if (millisecs > (double)ULONG_MAX) {
1184 PyErr_SetString(PyExc_OverflowError,
1185 "sleep length is too large");
1186 return -1;
1187 }
1188 Py_BEGIN_ALLOW_THREADS
1189 /* Allow sleep(0) to maintain win32 semantics, and as decreed
1190 * by Guido, only the main thread can be interrupted.
1191 */
1192 ul_millis = (unsigned long)millisecs;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001193 if (ul_millis == 0 || !_PyOS_IsMainThread())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 Sleep(ul_millis);
1195 else {
1196 DWORD rc;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001197 HANDLE hInterruptEvent = _PyOS_SigintEvent();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 ResetEvent(hInterruptEvent);
1199 rc = WaitForSingleObject(hInterruptEvent, ul_millis);
1200 if (rc == WAIT_OBJECT_0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 Py_BLOCK_THREADS
1202 errno = EINTR;
1203 PyErr_SetFromErrno(PyExc_IOError);
1204 return -1;
1205 }
1206 }
1207 Py_END_ALLOW_THREADS
1208 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001209#elif defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 /* This Sleep *IS* Interruptable by Exceptions */
1211 Py_BEGIN_ALLOW_THREADS
1212 if (DosSleep(secs * 1000) != NO_ERROR) {
1213 Py_BLOCK_THREADS
1214 PyErr_SetFromErrno(PyExc_IOError);
1215 return -1;
1216 }
1217 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001218#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 /* XXX Can't interrupt this sleep */
1220 Py_BEGIN_ALLOW_THREADS
1221 sleep((int)secs);
1222 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001223#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +00001226}