blob: 745ba8c8fbc4bd4f4d0c306a45457a0d7255a1dc [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Time module */
3
Barry Warsaw9a2a8a81996-12-06 23:32:14 +00004#include "Python.h"
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005#include "structseq.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00006
Guido van Rossum87ce7bb1998-06-09 16:30:31 +00007#include <ctype.h>
8
Guido van Rossum6d946f91992-08-14 13:49:30 +00009#ifdef macintosh
Guido van Rossumb6775db1994-08-01 11:34:53 +000010#include <time.h>
Guido van Rossumc410e922000-04-26 20:40:13 +000011#include <OSUtils.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +000012#else
13#include <sys/types.h>
Guido van Rossum6d946f91992-08-14 13:49:30 +000014#endif
15
Guido van Rossumb6775db1994-08-01 11:34:53 +000016#ifdef QUICKWIN
17#include <io.h>
18#endif
19
Guido van Rossumb6775db1994-08-01 11:34:53 +000020#ifdef HAVE_FTIME
21#include <sys/timeb.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000022#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000023extern int ftime(struct timeb *);
Guido van Rossum52174571996-12-09 18:38:52 +000024#endif /* MS_WINDOWS */
25#endif /* HAVE_FTIME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000026
Guido van Rossum7bf22de1997-12-02 20:34:19 +000027#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000028#include <i86.h>
29#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000030#ifdef MS_WINDOWS
Mark Hammond975e3922002-07-16 01:29:19 +000031#define WIN32_LEAN_AND_MEAN
Guido van Rossum258ccd42001-03-02 06:53:29 +000032#include <windows.h>
Mark Hammond975e3922002-07-16 01:29:19 +000033#include "pythread.h"
34
35/* helper to allow us to interrupt sleep() on Windows*/
36static HANDLE hInterruptEvent = NULL;
37static BOOL WINAPI PyCtrlHandler(DWORD dwCtrlType)
38{
39 SetEvent(hInterruptEvent);
40 /* allow other default handlers to be called.
41 Default Python handler will setup the
42 KeyboardInterrupt exception.
43 */
44 return FALSE;
45}
46static long main_thread;
47
48
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000049#if defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000050/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000051#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000052#define tzname _tzname
53#define daylight _daylight
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000054#endif /* __BORLANDC__ */
Guido van Rossumcac6c721996-09-06 13:34:02 +000055#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000056#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000057
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000058#if defined(MS_WINDOWS) && !defined(MS_WIN64) && !defined(__BORLANDC__)
Fred Drakedfb4ebd2000-06-29 20:56:28 +000059/* Win32 has better clock replacement
60 XXX Win64 does not yet, but might when the platform matures. */
Guido van Rossum3917c221997-04-02 05:35:28 +000061#undef HAVE_CLOCK /* We have our own version down below */
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000062#endif /* MS_WINDOWS && !MS_WIN64 */
Guido van Rossum3917c221997-04-02 05:35:28 +000063
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000064#if defined(PYOS_OS2)
65#define INCL_DOS
66#define INCL_ERRORS
67#include <os2.h>
68#endif
69
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000070#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000071#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000072#endif
73
Guido van Rossumbcc20741998-08-04 22:53:56 +000074#ifdef __BEOS__
Fred Drake56221a72000-08-15 18:52:33 +000075#include <time.h>
Guido van Rossumbcc20741998-08-04 22:53:56 +000076/* For bigtime_t, snooze(). - [cjh] */
77#include <support/SupportDefs.h>
78#include <kernel/OS.h>
79#endif
80
Guido van Rossum234f9421993-06-17 12:35:49 +000081/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000082static int floatsleep(double);
Thomas Woutersed77bac2000-07-24 15:26:39 +000083static double floattime(void);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084
Guido van Rossumcfbaecc1998-08-25 14:51:12 +000085/* For Y2K check */
86static PyObject *moddict;
87
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000088#ifdef macintosh
89/* Our own timezone. We have enough information to deduce whether
90** DST is on currently, but unfortunately we cannot put it to good
91** use because we don't know the rules (and that is needed to have
92** localtime() return correct tm_isdst values for times other than
93** the current time. So, we cop out and only tell the user the current
94** timezone.
95*/
96static long timezone;
97
Guido van Rossum10b164a2001-09-25 13:59:01 +000098static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +000099initmactimezone(void)
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000100{
101 MachineLocation loc;
102 long delta;
103
104 ReadLocation(&loc);
Guido van Rossum10b164a2001-09-25 13:59:01 +0000105
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000106 if (loc.latitude == 0 && loc.longitude == 0 && loc.u.gmtDelta == 0)
107 return;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000108
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000109 delta = loc.u.gmtDelta & 0x00FFFFFF;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000110
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000111 if (delta & 0x00800000)
112 delta |= 0xFF000000;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000113
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000114 timezone = -delta;
115}
116#endif /* macintosh */
117
118
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000119static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000120time_time(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000122 double secs;
Thomas Woutersfe385252001-01-19 23:16:56 +0000123 if (!PyArg_ParseTuple(args, ":time"))
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000124 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000125 secs = floattime();
126 if (secs == 0.0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000127 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000128 return NULL;
129 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000130 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000131}
132
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000133PyDoc_STRVAR(time_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000134"time() -> floating point number\n\
135\n\
136Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000137Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000138
Guido van Rossumb6775db1994-08-01 11:34:53 +0000139#ifdef HAVE_CLOCK
140
141#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000142#ifdef CLK_TCK
143#define CLOCKS_PER_SEC CLK_TCK
144#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000145#define CLOCKS_PER_SEC 1000000
146#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000147#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000148
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000149static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000150time_clock(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000151{
Thomas Woutersfe385252001-01-19 23:16:56 +0000152 if (!PyArg_ParseTuple(args, ":clock"))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 return NULL;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000154 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000156#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000158#if defined(MS_WINDOWS) && !defined(MS_WIN64) && !defined(__BORLANDC__)
Mark Hammond7ba5e812002-02-12 04:02:33 +0000159/* Due to Mark Hammond and Tim Peters */
Guido van Rossum3917c221997-04-02 05:35:28 +0000160static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000161time_clock(PyObject *self, PyObject *args)
Guido van Rossum3917c221997-04-02 05:35:28 +0000162{
Tim Peters9ad4b682002-02-13 05:14:18 +0000163 static LARGE_INTEGER ctrStart;
Mark Hammond7ba5e812002-02-12 04:02:33 +0000164 static double divisor = 0.0;
Tim Peters9ad4b682002-02-13 05:14:18 +0000165 LARGE_INTEGER now;
Mark Hammond7ba5e812002-02-12 04:02:33 +0000166 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +0000167
Thomas Woutersfe385252001-01-19 23:16:56 +0000168 if (!PyArg_ParseTuple(args, ":clock"))
Guido van Rossum3917c221997-04-02 05:35:28 +0000169 return NULL;
170
Mark Hammond7ba5e812002-02-12 04:02:33 +0000171 if (divisor == 0.0) {
Tim Peters9ad4b682002-02-13 05:14:18 +0000172 LARGE_INTEGER freq;
173 QueryPerformanceCounter(&ctrStart);
174 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
Mark Hammond7ba5e812002-02-12 04:02:33 +0000175 /* Unlikely to happen - this works on all intel
176 machines at least! Revert to clock() */
Guido van Rossum3917c221997-04-02 05:35:28 +0000177 return PyFloat_FromDouble(clock());
178 }
Tim Peters9ad4b682002-02-13 05:14:18 +0000179 divisor = (double)freq.QuadPart;
Guido van Rossum3917c221997-04-02 05:35:28 +0000180 }
Tim Peters9ad4b682002-02-13 05:14:18 +0000181 QueryPerformanceCounter(&now);
182 diff = (double)(now.QuadPart - ctrStart.QuadPart);
Mark Hammond7ba5e812002-02-12 04:02:33 +0000183 return PyFloat_FromDouble(diff / divisor);
Guido van Rossum3917c221997-04-02 05:35:28 +0000184}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000185
Guido van Rossum3917c221997-04-02 05:35:28 +0000186#define HAVE_CLOCK /* So it gets included in the methods */
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000187#endif /* MS_WINDOWS && !MS_WIN64 */
Guido van Rossum3917c221997-04-02 05:35:28 +0000188
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000189#ifdef HAVE_CLOCK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000190PyDoc_STRVAR(clock_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000191"clock() -> floating point number\n\
192\n\
193Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000194the first call to clock(). This has as much precision as the system\n\
195records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000196#endif
197
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000198static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000199time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200{
Guido van Rossum775f4da1993-01-09 17:18:52 +0000201 double secs;
Thomas Woutersfe385252001-01-19 23:16:56 +0000202 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 return NULL;
Guido van Rossum8607ae21997-11-03 22:04:46 +0000204 if (floatsleep(secs) != 0)
205 return NULL;
206 Py_INCREF(Py_None);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000207 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208}
209
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000210PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000211"sleep(seconds)\n\
212\n\
213Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000214a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000215
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000216static PyStructSequence_Field struct_time_type_fields[] = {
217 {"tm_year", NULL},
218 {"tm_mon", NULL},
219 {"tm_mday", NULL},
220 {"tm_hour", NULL},
221 {"tm_min", NULL},
222 {"tm_sec", NULL},
223 {"tm_wday", NULL},
224 {"tm_yday", NULL},
225 {"tm_isdst", NULL},
226 {0}
227};
228
229static PyStructSequence_Desc struct_time_type_desc = {
Guido van Rossum14648392001-12-08 18:02:58 +0000230 "time.struct_time",
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000231 NULL,
232 struct_time_type_fields,
233 9,
234};
Tim Peters9ad4b682002-02-13 05:14:18 +0000235
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000236static PyTypeObject StructTimeType;
237
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000238static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000239tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000240{
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000241 PyObject *v = PyStructSequence_New(&StructTimeType);
242 if (v == NULL)
243 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000244
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000245#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val))
246
247 SET(0, p->tm_year + 1900);
248 SET(1, p->tm_mon + 1); /* Want January == 1 */
249 SET(2, p->tm_mday);
250 SET(3, p->tm_hour);
251 SET(4, p->tm_min);
252 SET(5, p->tm_sec);
253 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
254 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
255 SET(8, p->tm_isdst);
256#undef SET
257 if (PyErr_Occurred()) {
258 Py_XDECREF(v);
259 return NULL;
260 }
261
262 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000263}
264
265static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000266time_convert(time_t when, struct tm * (*function)(const time_t *))
Guido van Rossum234f9421993-06-17 12:35:49 +0000267{
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000268 struct tm *p;
269 errno = 0;
270 p = function(&when);
271 if (p == NULL) {
272#ifdef EINVAL
Guido van Rossum0b1ff661996-11-02 17:31:22 +0000273 if (errno == 0)
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000274 errno = EINVAL;
275#endif
Tim Peters8b19a932003-01-17 20:08:54 +0000276 return PyErr_SetFromErrno(PyExc_ValueError);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000277 }
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000278 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000279}
280
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000281static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000282time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000283{
284 double when;
Thomas Woutersfe385252001-01-19 23:16:56 +0000285 if (PyTuple_Size(args) == 0)
286 when = floattime();
287 if (!PyArg_ParseTuple(args, "|d:gmtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000288 return NULL;
289 return time_convert((time_t)when, gmtime);
290}
291
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000292PyDoc_STRVAR(gmtime_doc,
Fred Drake193a3f62002-03-12 21:38:49 +0000293"gmtime([seconds]) -> (tm_year, tm_mon, tm_day, tm_hour, tm_min,\n\
294 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000295\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000296Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000297GMT). When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000298
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000299static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000300time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000301{
302 double when;
Thomas Woutersfe385252001-01-19 23:16:56 +0000303 if (PyTuple_Size(args) == 0)
304 when = floattime();
305 if (!PyArg_ParseTuple(args, "|d:localtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000306 return NULL;
307 return time_convert((time_t)when, localtime);
308}
309
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000310PyDoc_STRVAR(localtime_doc,
Fred Drake193a3f62002-03-12 21:38:49 +0000311"localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000312\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000313Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000314When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000315
Guido van Rossum9e90a671993-06-24 11:10:19 +0000316static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000317gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000318{
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000319 int y;
Thomas Wouters334fb892000-07-25 12:56:38 +0000320 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000321
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000322 if (!PyArg_Parse(args, "(iiiiiiiii)",
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000323 &y,
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000324 &p->tm_mon,
325 &p->tm_mday,
326 &p->tm_hour,
327 &p->tm_min,
328 &p->tm_sec,
329 &p->tm_wday,
330 &p->tm_yday,
331 &p->tm_isdst))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000332 return 0;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000333 if (y < 1900) {
334 PyObject *accept = PyDict_GetItemString(moddict,
335 "accept2dyear");
336 if (accept == NULL || !PyInt_Check(accept) ||
337 PyInt_AsLong(accept) == 0) {
338 PyErr_SetString(PyExc_ValueError,
339 "year >= 1900 required");
340 return 0;
341 }
342 if (69 <= y && y <= 99)
343 y += 1900;
344 else if (0 <= y && y <= 68)
345 y += 2000;
346 else {
347 PyErr_SetString(PyExc_ValueError,
Skip Montanaro1a10aac2001-08-22 12:39:16 +0000348 "year out of range");
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000349 return 0;
350 }
351 }
352 p->tm_year = y - 1900;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000353 p->tm_mon--;
354 p->tm_wday = (p->tm_wday + 1) % 7;
355 p->tm_yday--;
356 return 1;
357}
358
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000359#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000360static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000361time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000362{
Thomas Woutersfe385252001-01-19 23:16:56 +0000363 PyObject *tup = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000364 struct tm buf;
365 const char *fmt;
Guido van Rossumfa481162000-06-28 21:33:59 +0000366 size_t fmtlen, buflen;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000367 char *outbuf = 0;
Guido van Rossumfa481162000-06-28 21:33:59 +0000368 size_t i;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000369
Thomas Wouters334fb892000-07-25 12:56:38 +0000370 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000371
Thomas Woutersfe385252001-01-19 23:16:56 +0000372 if (!PyArg_ParseTuple(args, "s|O:strftime", &fmt, &tup))
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000373 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000374
375 if (tup == NULL) {
376 time_t tt = time(NULL);
377 buf = *localtime(&tt);
378 } else if (!gettmarg(tup, &buf))
379 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000380
Guido van Rossumc222ec21999-02-23 00:00:10 +0000381 fmtlen = strlen(fmt);
382
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000383 /* I hate these functions that presume you know how big the output
384 * will be ahead of time...
385 */
Guido van Rossumc222ec21999-02-23 00:00:10 +0000386 for (i = 1024; ; i += i) {
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000387 outbuf = malloc(i);
388 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000389 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000390 }
Guido van Rossumc222ec21999-02-23 00:00:10 +0000391 buflen = strftime(outbuf, i, fmt, &buf);
392 if (buflen > 0 || i >= 256 * fmtlen) {
393 /* If the buffer is 256 times as long as the format,
394 it's probably not failing for lack of room!
395 More likely, the format yields an empty result,
396 e.g. an empty format, or %Z when the timezone
397 is unknown. */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000398 PyObject *ret;
Guido van Rossumc222ec21999-02-23 00:00:10 +0000399 ret = PyString_FromStringAndSize(outbuf, buflen);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000400 free(outbuf);
401 return ret;
402 }
403 free(outbuf);
404 }
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000405}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000407PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000408"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000409\n\
410Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000411See the library reference manual for formatting codes. When the time tuple\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000412is not present, current time as returned by localtime() is used.");
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000413#endif /* HAVE_STRFTIME */
414
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000415#undef HAVE_STRPTIME
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000416#ifdef HAVE_STRPTIME
Fred Drakeaff60182000-05-09 19:52:40 +0000417
418#if 0
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +0000419/* Enable this if it's not declared in <time.h> */
420extern char *strptime(const char *, const char *, struct tm *);
Fred Drakeaff60182000-05-09 19:52:40 +0000421#endif
Guido van Rossumc2068731998-10-07 16:35:25 +0000422
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000423static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000424time_strptime(PyObject *self, PyObject *args)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000425{
426 struct tm tm;
427 char *fmt = "%a %b %d %H:%M:%S %Y";
428 char *buf;
429 char *s;
430
Jeremy Hylton7ceab652000-03-14 21:17:16 +0000431 if (!PyArg_ParseTuple(args, "s|s:strptime", &buf, &fmt))
432 return NULL;
Thomas Wouters334fb892000-07-25 12:56:38 +0000433 memset((void *) &tm, '\0', sizeof(tm));
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000434 s = strptime(buf, fmt, &tm);
435 if (s == NULL) {
436 PyErr_SetString(PyExc_ValueError, "format mismatch");
437 return NULL;
438 }
Martin v. Löwis2b6727b2001-03-06 12:12:02 +0000439 while (*s && isspace(Py_CHARMASK(*s)))
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000440 s++;
441 if (*s) {
442 PyErr_Format(PyExc_ValueError,
443 "unconverted data remains: '%.400s'", s);
444 return NULL;
445 }
446 return tmtotuple(&tm);
447}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000448
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000449#endif /* HAVE_STRPTIME */
450
451#ifndef HAVE_STRPTIME
452
453static PyObject *
454time_strptime(PyObject *self, PyObject *args)
455{
456 PyObject *strptime_module = PyImport_ImportModule("_strptime");
457
Tim Peters513a1cd2003-01-19 04:54:58 +0000458 if (!strptime_module)
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000459 return NULL;
460 return PyObject_CallMethod(strptime_module, "strptime", "O", args);
461}
462
463#endif /* !HAVE_STRPTIME */
464
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000465PyDoc_STRVAR(strptime_doc,
Guido van Rossum446ccfe1999-01-07 18:29:26 +0000466"strptime(string, format) -> tuple\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000467\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000468Parse a string to a time tuple according to a format specification.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000469See the library reference manual for formatting codes (same as strftime()).");
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000470
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000471
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000472static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000473time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000474{
Thomas Woutersfe385252001-01-19 23:16:56 +0000475 PyObject *tup = NULL;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000476 struct tm buf;
477 char *p;
Thomas Woutersfe385252001-01-19 23:16:56 +0000478 if (!PyArg_ParseTuple(args, "|O:asctime", &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000479 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000480 if (tup == NULL) {
481 time_t tt = time(NULL);
482 buf = *localtime(&tt);
483 } else if (!gettmarg(tup, &buf))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000484 return NULL;
485 p = asctime(&buf);
486 if (p[24] == '\n')
487 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000488 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000489}
490
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000491PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000492"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000493\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000494Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
495When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000496is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000497
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000498static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000499time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000500{
501 double dt;
502 time_t tt;
503 char *p;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000504
Thomas Woutersfe385252001-01-19 23:16:56 +0000505 if (PyTuple_Size(args) == 0)
506 tt = time(NULL);
507 else {
508 if (!PyArg_ParseTuple(args, "|d:ctime", &dt))
509 return NULL;
510 tt = (time_t)dt;
511 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000512 p = ctime(&tt);
Guido van Rossum78535701998-03-03 22:19:10 +0000513 if (p == NULL) {
514 PyErr_SetString(PyExc_ValueError, "unconvertible time");
515 return NULL;
516 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000517 if (p[24] == '\n')
518 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000519 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000520}
521
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000522PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000523"ctime(seconds) -> string\n\
524\n\
525Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000526This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000527not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000528
Guido van Rossum60cd8131998-03-06 17:16:21 +0000529#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000530static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000531time_mktime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000532{
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000533 PyObject *tup;
Guido van Rossum234f9421993-06-17 12:35:49 +0000534 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000535 time_t tt;
Guido van Rossum43713e52000-02-29 13:59:29 +0000536 if (!PyArg_ParseTuple(args, "O:mktime", &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000537 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000538 tt = time(&tt);
539 buf = *localtime(&tt);
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000540 if (!gettmarg(tup, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000541 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000542 tt = mktime(&buf);
543 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000544 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum10b164a2001-09-25 13:59:01 +0000545 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000546 return NULL;
547 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000548 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000549}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000550
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000551PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000552"mktime(tuple) -> floating point number\n\
553\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000554Convert a time tuple in local time to seconds since the Epoch.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000555#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000556
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000557static PyMethodDef time_methods[] = {
Thomas Woutersfe385252001-01-19 23:16:56 +0000558 {"time", time_time, METH_VARARGS, time_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000559#ifdef HAVE_CLOCK
Thomas Woutersfe385252001-01-19 23:16:56 +0000560 {"clock", time_clock, METH_VARARGS, clock_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000561#endif
Thomas Woutersfe385252001-01-19 23:16:56 +0000562 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
563 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
564 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000565 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
Thomas Woutersfe385252001-01-19 23:16:56 +0000566 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000567#ifdef HAVE_MKTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000568 {"mktime", time_mktime, METH_VARARGS, mktime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000569#endif
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000570#ifdef HAVE_STRFTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000571 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000572#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000573 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574 {NULL, NULL} /* sentinel */
575};
576
Barry Warsaw9bfd2bf2000-09-01 09:01:32 +0000577
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000578PyDoc_STRVAR(module_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000579"This module provides various functions to manipulate time values.\n\
580\n\
581There are two standard representations of time. One is the number\n\
582of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
583or a floating point number (to represent fractions of seconds).\n\
584The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
585The actual value can be retrieved by calling gmtime(0).\n\
586\n\
587The other representation is a tuple of 9 integers giving local time.\n\
588The tuple items are:\n\
589 year (four digits, e.g. 1998)\n\
590 month (1-12)\n\
591 day (1-31)\n\
592 hours (0-23)\n\
593 minutes (0-59)\n\
Guido van Rossum360eb9f1999-02-22 16:19:52 +0000594 seconds (0-59)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000595 weekday (0-6, Monday is 0)\n\
596 Julian day (day in the year, 1-366)\n\
597 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
598If the DST flag is 0, the time is given in the regular time zone;\n\
599if it is 1, the time is given in the DST time zone;\n\
600if it is -1, mktime() should guess based on the date and time.\n\
601\n\
602Variables:\n\
603\n\
604timezone -- difference in seconds between UTC and local standard time\n\
605altzone -- difference in seconds between UTC and local DST time\n\
606daylight -- whether local time should reflect DST\n\
607tzname -- tuple of (standard time zone name, DST time zone name)\n\
608\n\
609Functions:\n\
610\n\
611time() -- return current time in seconds since the Epoch as a float\n\
612clock() -- return CPU time since process start as a float\n\
613sleep() -- delay for a number of seconds given as a float\n\
614gmtime() -- convert seconds since Epoch to UTC tuple\n\
615localtime() -- convert seconds since Epoch to local time tuple\n\
616asctime() -- convert time tuple to string\n\
617ctime() -- convert time in seconds to string\n\
618mktime() -- convert local time tuple to seconds since Epoch\n\
619strftime() -- convert time tuple to string according to format specification\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000620strptime() -- parse string to time tuple according to format specification");
Guido van Rossum10b164a2001-09-25 13:59:01 +0000621
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000622
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000623PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000624inittime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000625{
Fred Drake9bb74322002-04-01 14:49:59 +0000626 PyObject *m;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000627 char *p;
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000628 m = Py_InitModule3("time", time_methods, module_doc);
Fred Drake9bb74322002-04-01 14:49:59 +0000629
Guido van Rossumc2068731998-10-07 16:35:25 +0000630 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000631 p = Py_GETENV("PYTHONY2K");
Fred Drake9bb74322002-04-01 14:49:59 +0000632 PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p));
Guido van Rossumc2068731998-10-07 16:35:25 +0000633 /* Squirrel away the module's dictionary for the y2k check */
Fred Drake9bb74322002-04-01 14:49:59 +0000634 moddict = PyModule_GetDict(m);
635 Py_INCREF(moddict);
Guido van Rossum10b164a2001-09-25 13:59:01 +0000636#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Guido van Rossum234f9421993-06-17 12:35:49 +0000637 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000638#ifdef PYOS_OS2
Fred Drake9bb74322002-04-01 14:49:59 +0000639 PyModule_AddIntConstant(m, "timezone", _timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000640#else /* !PYOS_OS2 */
Fred Drake9bb74322002-04-01 14:49:59 +0000641 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000642#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000643#ifdef HAVE_ALTZONE
Fred Drake9bb74322002-04-01 14:49:59 +0000644 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000645#else
Guido van Rossum26452411998-09-28 22:07:11 +0000646#ifdef PYOS_OS2
Fred Drake9bb74322002-04-01 14:49:59 +0000647 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000648#else /* !PYOS_OS2 */
Fred Drake9bb74322002-04-01 14:49:59 +0000649 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000650#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000651#endif
Fred Drake9bb74322002-04-01 14:49:59 +0000652 PyModule_AddIntConstant(m, "daylight", daylight);
653 PyModule_AddObject(m, "tzname",
654 Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossum10b164a2001-09-25 13:59:01 +0000655#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000656#ifdef HAVE_STRUCT_TM_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000657 {
658#define YEAR ((time_t)((365 * 24 + 6) * 3600))
659 time_t t;
660 struct tm *p;
Guido van Rossum57731601999-03-29 19:12:04 +0000661 long janzone, julyzone;
662 char janname[10], julyname[10];
Guido van Rossum234f9421993-06-17 12:35:49 +0000663 t = (time((time_t *)0) / YEAR) * YEAR;
664 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000665 janzone = -p->tm_gmtoff;
666 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
667 janname[9] = '\0';
Guido van Rossum234f9421993-06-17 12:35:49 +0000668 t += YEAR/2;
669 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000670 julyzone = -p->tm_gmtoff;
671 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
672 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +0000673
Guido van Rossum57731601999-03-29 19:12:04 +0000674 if( janzone < julyzone ) {
675 /* DST is reversed in the southern hemisphere */
Fred Drake9bb74322002-04-01 14:49:59 +0000676 PyModule_AddIntConstant(m, "timezone", julyzone);
677 PyModule_AddIntConstant(m, "altzone", janzone);
678 PyModule_AddIntConstant(m, "daylight",
679 janzone != julyzone);
680 PyModule_AddObject(m, "tzname",
681 Py_BuildValue("(zz)",
682 julyname, janname));
Guido van Rossum57731601999-03-29 19:12:04 +0000683 } else {
Fred Drake9bb74322002-04-01 14:49:59 +0000684 PyModule_AddIntConstant(m, "timezone", janzone);
685 PyModule_AddIntConstant(m, "altzone", julyzone);
686 PyModule_AddIntConstant(m, "daylight",
687 janzone != julyzone);
688 PyModule_AddObject(m, "tzname",
689 Py_BuildValue("(zz)",
690 janname, julyname));
Guido van Rossum57731601999-03-29 19:12:04 +0000691 }
Guido van Rossum234f9421993-06-17 12:35:49 +0000692 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000693#else
694#ifdef macintosh
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000695 /* The only thing we can obtain is the current timezone
696 ** (and whether dst is currently _active_, but that is not what
697 ** we're looking for:-( )
698 */
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000699 initmactimezone();
Fred Drake9bb74322002-04-01 14:49:59 +0000700 PyModule_AddIntConstant(m, "timezone", timezone);
701 PyModule_AddIntConstant(m, "altzone", timezone);
702 PyModule_AddIntConstant(m, "daylight", 0);
703 PyModule_AddObject(m, "tzname", Py_BuildValue("(zz)", "", ""));
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000704#endif /* macintosh */
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000705#endif /* HAVE_STRUCT_TM_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000706#ifdef __CYGWIN__
707 tzset();
Fred Drake9bb74322002-04-01 14:49:59 +0000708 PyModule_AddIntConstant(m, "timezone", _timezone);
709 PyModule_AddIntConstant(m, "altzone", _timezone);
710 PyModule_AddIntConstant(m, "daylight", _daylight);
711 PyModule_AddObject(m, "tzname",
712 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +0000713#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000714#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Mark Hammond975e3922002-07-16 01:29:19 +0000715#ifdef MS_WINDOWS
716 /* Helper to allow interrupts for Windows.
717 If Ctrl+C event delivered while not sleeping
718 it will be ignored.
719 */
720 main_thread = PyThread_get_thread_ident();
721 hInterruptEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
722 SetConsoleCtrlHandler( PyCtrlHandler, TRUE);
723#endif /* MS_WINDOWS */
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000724 PyStructSequence_InitType(&StructTimeType, &struct_time_type_desc);
Fred Drake9bb74322002-04-01 14:49:59 +0000725 Py_INCREF(&StructTimeType);
726 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000727}
728
729
Guido van Rossumb6775db1994-08-01 11:34:53 +0000730/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000731
Guido van Rossumb6775db1994-08-01 11:34:53 +0000732static double
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000733floattime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000734{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000735 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000736 (1) gettimeofday() -- resolution in microseconds
737 (2) ftime() -- resolution in milliseconds
738 (3) time() -- resolution in seconds
739 In all cases the return value is a float in seconds.
740 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
741 fail, so we fall back on ftime() or time().
742 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000743#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000744 {
745 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000746#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000747 if (gettimeofday(&t) == 0)
748 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000749#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000750 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
751 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000752#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000753 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000754#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000755 {
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000756#if defined(HAVE_FTIME)
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000757 struct timeb t;
758 ftime(&t);
759 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000760#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000761 time_t secs;
762 time(&secs);
763 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000764#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000765 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000766}
767
Guido van Rossumb6775db1994-08-01 11:34:53 +0000768
769/* Implement floatsleep() for various platforms.
770 When interrupted (or when another error occurs), return -1 and
771 set an exception; else return 0. */
772
773static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000774floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +0000775{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000776/* XXX Should test for MS_WINDOWS first! */
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000777#if defined(HAVE_SELECT) && !defined(__BEOS__) && !defined(__EMX__)
Guido van Rossum426035c1991-02-19 12:27:35 +0000778 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000779 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000780 frac = fmod(secs, 1.0);
781 secs = floor(secs);
782 t.tv_sec = (long)secs;
783 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000784 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000785 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000786#ifdef EINTR
Guido van Rossuma5456d51999-08-19 14:40:27 +0000787 if (errno != EINTR) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000788#else
789 if (1) {
790#endif
Andrew M. Kuchlingc24ca4b2000-03-24 20:35:20 +0000791 Py_BLOCK_THREADS
Guido van Rossuma5456d51999-08-19 14:40:27 +0000792 PyErr_SetFromErrno(PyExc_IOError);
793 return -1;
794 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000795 }
Guido van Rossum8607ae21997-11-03 22:04:46 +0000796 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000797#elif defined(macintosh)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000798#define MacTicks (* (long *)0x16A)
799 long deadline;
800 deadline = MacTicks + (long)(secs * 60.0);
801 while (MacTicks < deadline) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000802 /* XXX Should call some yielding function here */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000803 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000804 return -1;
805 }
Martin v. Löwis02af9642002-01-16 11:04:06 +0000806#elif defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +0000807 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000808 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbceeac81996-05-23 22:53:47 +0000809 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000810 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000811#elif defined(MS_WINDOWS)
Fred Drake0e123952000-06-29 21:31:02 +0000812 {
813 double millisecs = secs * 1000.0;
Tim Peters513a1cd2003-01-19 04:54:58 +0000814 unsigned long ul_millis;
815
Fred Drake0e123952000-06-29 21:31:02 +0000816 if (millisecs > (double)ULONG_MAX) {
Tim Peters513a1cd2003-01-19 04:54:58 +0000817 PyErr_SetString(PyExc_OverflowError,
818 "sleep length is too large");
Fred Drake0e123952000-06-29 21:31:02 +0000819 return -1;
820 }
Fred Drake0e123952000-06-29 21:31:02 +0000821 Py_BEGIN_ALLOW_THREADS
Tim Peters513a1cd2003-01-19 04:54:58 +0000822 /* Allow sleep(0) to maintain win32 semantics, and as decreed
823 * by Guido, only the main thread can be interrupted.
824 */
825 ul_millis = (unsigned long)millisecs;
826 if (ul_millis == 0 ||
827 main_thread != PyThread_get_thread_ident())
828 Sleep(ul_millis);
Mark Hammond975e3922002-07-16 01:29:19 +0000829 else {
830 DWORD rc;
831 ResetEvent(hInterruptEvent);
Tim Peters513a1cd2003-01-19 04:54:58 +0000832 rc = WaitForSingleObject(hInterruptEvent, ul_millis);
833 if (rc == WAIT_OBJECT_0) {
834 /* Yield to make sure real Python signal
835 * handler called.
836 */
Mark Hammond975e3922002-07-16 01:29:19 +0000837 Sleep(1);
838 Py_BLOCK_THREADS
Mark Hammond975e3922002-07-16 01:29:19 +0000839 errno = EINTR;
840 PyErr_SetFromErrno(PyExc_IOError);
841 return -1;
842 }
843 }
Fred Drake0e123952000-06-29 21:31:02 +0000844 Py_END_ALLOW_THREADS
845 }
Martin v. Löwis02af9642002-01-16 11:04:06 +0000846#elif defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000847 /* This Sleep *IS* Interruptable by Exceptions */
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000848 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000849 if (DosSleep(secs * 1000) != NO_ERROR) {
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000850 Py_BLOCK_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000851 PyErr_SetFromErrno(PyExc_IOError);
852 return -1;
853 }
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000854 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000855#elif defined(__BEOS__)
Guido van Rossumbcc20741998-08-04 22:53:56 +0000856 /* This sleep *CAN BE* interrupted. */
857 {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000858 if( secs <= 0.0 ) {
859 return;
860 }
Guido van Rossum10b164a2001-09-25 13:59:01 +0000861
Guido van Rossumbcc20741998-08-04 22:53:56 +0000862 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000863 /* BeOS snooze() is in microseconds... */
864 if( snooze( (bigtime_t)( secs * 1000.0 * 1000.0 ) ) == B_INTERRUPTED ) {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000865 Py_BLOCK_THREADS
866 PyErr_SetFromErrno( PyExc_IOError );
867 return -1;
868 }
869 Py_END_ALLOW_THREADS
870 }
Martin v. Löwis02af9642002-01-16 11:04:06 +0000871#elif defined(RISCOS)
Guido van Rossumbceccf52001-04-10 22:07:43 +0000872 if (secs <= 0.0)
873 return 0;
874 Py_BEGIN_ALLOW_THREADS
875 /* This sleep *CAN BE* interrupted. */
876 if ( sleep(secs) )
877 return -1;
878 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000879#elif defined(PLAN9)
880 {
881 double millisecs = secs * 1000.0;
882 if (millisecs > (double)LONG_MAX) {
883 PyErr_SetString(PyExc_OverflowError, "sleep length is too large");
884 return -1;
885 }
886 /* This sleep *CAN BE* interrupted. */
887 Py_BEGIN_ALLOW_THREADS
888 if(sleep((long)millisecs) < 0){
889 Py_BLOCK_THREADS
890 PyErr_SetFromErrno(PyExc_IOError);
891 return -1;
892 }
893 Py_END_ALLOW_THREADS
894 }
895#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000896 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000897 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000898 sleep((int)secs);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000899 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000900#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000901
Guido van Rossumb6775db1994-08-01 11:34:53 +0000902 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000903}