blob: 0a54a9384787f9771e37d5fdaa68f6575922711f [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 Rossum3f5da241990-12-20 15:06:42 +00005
Guido van Rossum87ce7bb1998-06-09 16:30:31 +00006#include <ctype.h>
7
Guido van Rossum6d946f91992-08-14 13:49:30 +00008#ifdef macintosh
Guido van Rossumb6775db1994-08-01 11:34:53 +00009#include <time.h>
Guido van Rossumc410e922000-04-26 20:40:13 +000010#include <OSUtils.h>
Jack Jansen63596ae2000-12-12 22:42:30 +000011#ifdef USE_GUSI211
Guido van Rossumc410e922000-04-26 20:40:13 +000012/* GUSI, the I/O library which has the time() function and such uses the
13** Mac epoch of 1904. MSL, the C library which has localtime() and so uses
14** the ANSI epoch of 1900.
15*/
16#define GUSI_TO_MSL_EPOCH (4*365*24*60*60)
17#endif /* USE_GUSI2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000018#else
Guido van Rossum48a680c2001-03-02 06:34:14 +000019#ifndef RISCOS
Guido van Rossumb6775db1994-08-01 11:34:53 +000020#include <sys/types.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +000021#endif /* RISCOS */
Guido van Rossum6d946f91992-08-14 13:49:30 +000022#endif
23
Guido van Rossumb6775db1994-08-01 11:34:53 +000024#ifdef QUICKWIN
25#include <io.h>
26#endif
27
28#ifdef HAVE_UNISTD_H
Guido van Rossum2762f251992-03-27 17:22:13 +000029#include <unistd.h>
30#endif
31
Guido van Rossumb6775db1994-08-01 11:34:53 +000032#ifdef HAVE_FTIME
33#include <sys/timeb.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000034#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000035extern int ftime(struct timeb *);
Guido van Rossum52174571996-12-09 18:38:52 +000036#endif /* MS_WINDOWS */
37#endif /* HAVE_FTIME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038
Guido van Rossum7bf22de1997-12-02 20:34:19 +000039#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000040#include <i86.h>
41#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000042#ifdef MS_WINDOWS
Guido van Rossum258ccd42001-03-02 06:53:29 +000043#include <windows.h>
Tim Peters58e0a8c2001-05-14 22:32:33 +000044#if defined(MS_WIN16) || defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000045/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000046#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000047#define tzname _tzname
48#define daylight _daylight
Tim Peters58e0a8c2001-05-14 22:32:33 +000049#endif /* MS_WIN16 || __BORLANDC__ */
50#ifdef MS_WIN16
Guido van Rossumcc081121995-03-14 15:05:41 +000051#define altzone _altzone
Guido van Rossumb2fb3641996-09-07 00:47:35 +000052#endif /* MS_WIN16 */
Guido van Rossumcac6c721996-09-06 13:34:02 +000053#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000054#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000055
Tim Peters58e0a8c2001-05-14 22:32:33 +000056#if defined(MS_WIN32) && !defined(MS_WIN64) && !defined(__BORLANDC__)
Fred Drakedfb4ebd2000-06-29 20:56:28 +000057/* Win32 has better clock replacement
58 XXX Win64 does not yet, but might when the platform matures. */
Guido van Rossum3917c221997-04-02 05:35:28 +000059#include <largeint.h>
60#undef HAVE_CLOCK /* We have our own version down below */
Fred Drakedfb4ebd2000-06-29 20:56:28 +000061#endif /* MS_WIN32 && !MS_WIN64 */
Guido van Rossum3917c221997-04-02 05:35:28 +000062
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000063#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000064#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000065#endif
66
Guido van Rossumbcc20741998-08-04 22:53:56 +000067#ifdef __BEOS__
Fred Drake56221a72000-08-15 18:52:33 +000068#include <time.h>
Guido van Rossumbcc20741998-08-04 22:53:56 +000069/* For bigtime_t, snooze(). - [cjh] */
70#include <support/SupportDefs.h>
71#include <kernel/OS.h>
72#endif
73
Guido van Rossum234f9421993-06-17 12:35:49 +000074/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000075static int floatsleep(double);
Thomas Woutersed77bac2000-07-24 15:26:39 +000076static double floattime(void);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077
Guido van Rossumcfbaecc1998-08-25 14:51:12 +000078/* For Y2K check */
79static PyObject *moddict;
80
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000081#ifdef macintosh
82/* Our own timezone. We have enough information to deduce whether
83** DST is on currently, but unfortunately we cannot put it to good
84** use because we don't know the rules (and that is needed to have
85** localtime() return correct tm_isdst values for times other than
86** the current time. So, we cop out and only tell the user the current
87** timezone.
88*/
89static long timezone;
90
91static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +000092initmactimezone(void)
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000093{
94 MachineLocation loc;
95 long delta;
96
97 ReadLocation(&loc);
98
99 if (loc.latitude == 0 && loc.longitude == 0 && loc.u.gmtDelta == 0)
100 return;
101
102 delta = loc.u.gmtDelta & 0x00FFFFFF;
103
104 if (delta & 0x00800000)
105 delta |= 0xFF000000;
106
107 timezone = -delta;
108}
109#endif /* macintosh */
110
111
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000112static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000113time_time(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000115 double secs;
Thomas Woutersfe385252001-01-19 23:16:56 +0000116 if (!PyArg_ParseTuple(args, ":time"))
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000117 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118 secs = floattime();
119 if (secs == 0.0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000120 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000121 return NULL;
122 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000123 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000124}
125
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000126static char time_doc[] =
127"time() -> floating point number\n\
128\n\
129Return the current time in seconds since the Epoch.\n\
130Fractions of a second may be present if the system clock provides them.";
131
Guido van Rossumb6775db1994-08-01 11:34:53 +0000132#ifdef HAVE_CLOCK
133
134#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000135#ifdef CLK_TCK
136#define CLOCKS_PER_SEC CLK_TCK
137#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000138#define CLOCKS_PER_SEC 1000000
139#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000140#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000141
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000142static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000143time_clock(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000144{
Thomas Woutersfe385252001-01-19 23:16:56 +0000145 if (!PyArg_ParseTuple(args, ":clock"))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 return NULL;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000147 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000149#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150
Tim Peters58e0a8c2001-05-14 22:32:33 +0000151#if defined(MS_WIN32) && !defined(MS_WIN64) && !defined(__BORLANDC__)
Guido van Rossum3917c221997-04-02 05:35:28 +0000152/* Due to Mark Hammond */
153static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000154time_clock(PyObject *self, PyObject *args)
Guido van Rossum3917c221997-04-02 05:35:28 +0000155{
156 static LARGE_INTEGER ctrStart;
157 static LARGE_INTEGER divisor = {0,0};
158 LARGE_INTEGER now, diff, rem;
159
Thomas Woutersfe385252001-01-19 23:16:56 +0000160 if (!PyArg_ParseTuple(args, ":clock"))
Guido van Rossum3917c221997-04-02 05:35:28 +0000161 return NULL;
162
163 if (LargeIntegerEqualToZero(divisor)) {
164 QueryPerformanceCounter(&ctrStart);
165 if (!QueryPerformanceFrequency(&divisor) ||
166 LargeIntegerEqualToZero(divisor)) {
167 /* Unlikely to happen -
168 this works on all intel machines at least!
169 Revert to clock() */
170 return PyFloat_FromDouble(clock());
171 }
172 }
173 QueryPerformanceCounter(&now);
174 diff = LargeIntegerSubtract(now, ctrStart);
175 diff = LargeIntegerDivide(diff, divisor, &rem);
176 /* XXX - we assume both divide results fit in 32 bits. This is
177 true on Intels. First person who can afford a machine that
178 doesnt deserves to fix it :-)
179 */
180 return PyFloat_FromDouble((double)diff.LowPart +
181 ((double)rem.LowPart / (double)divisor.LowPart));
182}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000183
Guido van Rossum3917c221997-04-02 05:35:28 +0000184#define HAVE_CLOCK /* So it gets included in the methods */
Fred Drakedfb4ebd2000-06-29 20:56:28 +0000185#endif /* MS_WIN32 && !MS_WIN64 */
Guido van Rossum3917c221997-04-02 05:35:28 +0000186
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000187#ifdef HAVE_CLOCK
188static char clock_doc[] =
189"clock() -> floating point number\n\
190\n\
191Return the CPU time or real time since the start of the process or since\n\
192the first call to clock(). This has as much precision as the system records.";
193#endif
194
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000195static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000196time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197{
Guido van Rossum775f4da1993-01-09 17:18:52 +0000198 double secs;
Thomas Woutersfe385252001-01-19 23:16:56 +0000199 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200 return NULL;
Guido van Rossum8607ae21997-11-03 22:04:46 +0000201 if (floatsleep(secs) != 0)
202 return NULL;
203 Py_INCREF(Py_None);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000204 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205}
206
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000207static char sleep_doc[] =
208"sleep(seconds)\n\
209\n\
210Delay execution for a given number of seconds. The argument may be\n\
211a floating point number for subsecond precision.";
212
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000213static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000214tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000215{
216 return Py_BuildValue("(iiiiiiiii)",
217 p->tm_year + 1900,
218 p->tm_mon + 1, /* Want January == 1 */
219 p->tm_mday,
220 p->tm_hour,
221 p->tm_min,
222 p->tm_sec,
223 (p->tm_wday + 6) % 7, /* Want Monday == 0 */
224 p->tm_yday + 1, /* Want January, 1 == 1 */
225 p->tm_isdst);
226}
227
228static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000229time_convert(time_t when, struct tm * (*function)(const time_t *))
Guido van Rossum234f9421993-06-17 12:35:49 +0000230{
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000231 struct tm *p;
232 errno = 0;
Jack Jansenee398fa2000-07-03 21:37:27 +0000233#if defined(macintosh) && defined(USE_GUSI204)
Guido van Rossumc410e922000-04-26 20:40:13 +0000234 when = when + GUSI_TO_MSL_EPOCH;
235#endif
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000236 p = function(&when);
237 if (p == NULL) {
238#ifdef EINVAL
Guido van Rossum0b1ff661996-11-02 17:31:22 +0000239 if (errno == 0)
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000240 errno = EINVAL;
241#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000242 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000243 }
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000244 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000245}
246
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000247static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000248time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000249{
250 double when;
Thomas Woutersfe385252001-01-19 23:16:56 +0000251 if (PyTuple_Size(args) == 0)
252 when = floattime();
253 if (!PyArg_ParseTuple(args, "|d:gmtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000254 return NULL;
255 return time_convert((time_t)when, gmtime);
256}
257
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000258static char gmtime_doc[] =
Thomas Woutersfe385252001-01-19 23:16:56 +0000259"gmtime([seconds]) -> tuple\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000260\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000261Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
262GMT). When 'seconds' is not passed in, convert the current time instead.";
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000263
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000264static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000265time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000266{
267 double when;
Thomas Woutersfe385252001-01-19 23:16:56 +0000268 if (PyTuple_Size(args) == 0)
269 when = floattime();
270 if (!PyArg_ParseTuple(args, "|d:localtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000271 return NULL;
272 return time_convert((time_t)when, localtime);
273}
274
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000275static char localtime_doc[] =
Thomas Woutersfe385252001-01-19 23:16:56 +0000276"localtime([seconds]) -> tuple\n\
277Convert seconds since the Epoch to a time tuple expressing local time.\n\
278When 'seconds' is not passed in, convert the current time instead.";
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000279
Guido van Rossum9e90a671993-06-24 11:10:19 +0000280static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000281gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000282{
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000283 int y;
Thomas Wouters334fb892000-07-25 12:56:38 +0000284 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000285
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000286 if (!PyArg_Parse(args, "(iiiiiiiii)",
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000287 &y,
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000288 &p->tm_mon,
289 &p->tm_mday,
290 &p->tm_hour,
291 &p->tm_min,
292 &p->tm_sec,
293 &p->tm_wday,
294 &p->tm_yday,
295 &p->tm_isdst))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000296 return 0;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000297 if (y < 1900) {
298 PyObject *accept = PyDict_GetItemString(moddict,
299 "accept2dyear");
300 if (accept == NULL || !PyInt_Check(accept) ||
301 PyInt_AsLong(accept) == 0) {
302 PyErr_SetString(PyExc_ValueError,
303 "year >= 1900 required");
304 return 0;
305 }
306 if (69 <= y && y <= 99)
307 y += 1900;
308 else if (0 <= y && y <= 68)
309 y += 2000;
310 else {
311 PyErr_SetString(PyExc_ValueError,
312 "year out of range (00-99, 1900-*)");
313 return 0;
314 }
315 }
316 p->tm_year = y - 1900;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000317 p->tm_mon--;
318 p->tm_wday = (p->tm_wday + 1) % 7;
319 p->tm_yday--;
320 return 1;
321}
322
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000323#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000324static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000325time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000326{
Thomas Woutersfe385252001-01-19 23:16:56 +0000327 PyObject *tup = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000328 struct tm buf;
329 const char *fmt;
Guido van Rossumfa481162000-06-28 21:33:59 +0000330 size_t fmtlen, buflen;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000331 char *outbuf = 0;
Guido van Rossumfa481162000-06-28 21:33:59 +0000332 size_t i;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000333
Thomas Wouters334fb892000-07-25 12:56:38 +0000334 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000335
Thomas Woutersfe385252001-01-19 23:16:56 +0000336 if (!PyArg_ParseTuple(args, "s|O:strftime", &fmt, &tup))
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000337 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000338
339 if (tup == NULL) {
340 time_t tt = time(NULL);
341 buf = *localtime(&tt);
342 } else if (!gettmarg(tup, &buf))
343 return NULL;
344
Guido van Rossumc222ec21999-02-23 00:00:10 +0000345 fmtlen = strlen(fmt);
346
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000347 /* I hate these functions that presume you know how big the output
348 * will be ahead of time...
349 */
Guido van Rossumc222ec21999-02-23 00:00:10 +0000350 for (i = 1024; ; i += i) {
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000351 outbuf = malloc(i);
352 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000353 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000354 }
Guido van Rossumc222ec21999-02-23 00:00:10 +0000355 buflen = strftime(outbuf, i, fmt, &buf);
356 if (buflen > 0 || i >= 256 * fmtlen) {
357 /* If the buffer is 256 times as long as the format,
358 it's probably not failing for lack of room!
359 More likely, the format yields an empty result,
360 e.g. an empty format, or %Z when the timezone
361 is unknown. */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000362 PyObject *ret;
Guido van Rossumc222ec21999-02-23 00:00:10 +0000363 ret = PyString_FromStringAndSize(outbuf, buflen);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000364 free(outbuf);
365 return ret;
366 }
367 free(outbuf);
368 }
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000369}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000370
371static char strftime_doc[] =
Thomas Woutersfe385252001-01-19 23:16:56 +0000372"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000373\n\
374Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000375See the library reference manual for formatting codes. When the time tuple\n\
376is not present, current time as returned by localtime() is used.";
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000377#endif /* HAVE_STRFTIME */
378
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000379#ifdef HAVE_STRPTIME
Fred Drakeaff60182000-05-09 19:52:40 +0000380
381#if 0
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +0000382/* Enable this if it's not declared in <time.h> */
383extern char *strptime(const char *, const char *, struct tm *);
Fred Drakeaff60182000-05-09 19:52:40 +0000384#endif
Guido van Rossumc2068731998-10-07 16:35:25 +0000385
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000386static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000387time_strptime(PyObject *self, PyObject *args)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000388{
389 struct tm tm;
390 char *fmt = "%a %b %d %H:%M:%S %Y";
391 char *buf;
392 char *s;
393
Jeremy Hylton7ceab652000-03-14 21:17:16 +0000394 if (!PyArg_ParseTuple(args, "s|s:strptime", &buf, &fmt))
395 return NULL;
Thomas Wouters334fb892000-07-25 12:56:38 +0000396 memset((void *) &tm, '\0', sizeof(tm));
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000397 s = strptime(buf, fmt, &tm);
398 if (s == NULL) {
399 PyErr_SetString(PyExc_ValueError, "format mismatch");
400 return NULL;
401 }
Martin v. Löwis2b6727b2001-03-06 12:12:02 +0000402 while (*s && isspace(Py_CHARMASK(*s)))
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000403 s++;
404 if (*s) {
405 PyErr_Format(PyExc_ValueError,
406 "unconverted data remains: '%.400s'", s);
407 return NULL;
408 }
409 return tmtotuple(&tm);
410}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000411
412static char strptime_doc[] =
Guido van Rossum446ccfe1999-01-07 18:29:26 +0000413"strptime(string, format) -> tuple\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000414Parse a string to a time tuple according to a format specification.\n\
415See the library reference manual for formatting codes (same as strftime()).";
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000416#endif /* HAVE_STRPTIME */
417
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000418static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000419time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000420{
Thomas Woutersfe385252001-01-19 23:16:56 +0000421 PyObject *tup = NULL;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000422 struct tm buf;
423 char *p;
Thomas Woutersfe385252001-01-19 23:16:56 +0000424 if (!PyArg_ParseTuple(args, "|O:asctime", &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000425 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000426 if (tup == NULL) {
427 time_t tt = time(NULL);
428 buf = *localtime(&tt);
429 } else if (!gettmarg(tup, &buf))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000430 return NULL;
431 p = asctime(&buf);
432 if (p[24] == '\n')
433 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000434 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000435}
436
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000437static char asctime_doc[] =
Thomas Woutersfe385252001-01-19 23:16:56 +0000438"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000439\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000440Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
441When the time tuple is not present, current time as returned by localtime()\n\
442is used.";
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000443
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000444static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000445time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000446{
447 double dt;
448 time_t tt;
449 char *p;
Thomas Woutersfe385252001-01-19 23:16:56 +0000450
451 if (PyTuple_Size(args) == 0)
452 tt = time(NULL);
453 else {
454 if (!PyArg_ParseTuple(args, "|d:ctime", &dt))
455 return NULL;
456 tt = (time_t)dt;
457 }
Jack Jansenee398fa2000-07-03 21:37:27 +0000458#if defined(macintosh) && defined(USE_GUSI204)
Guido van Rossumc410e922000-04-26 20:40:13 +0000459 tt = tt + GUSI_TO_MSL_EPOCH;
460#endif
Guido van Rossum9e90a671993-06-24 11:10:19 +0000461 p = ctime(&tt);
Guido van Rossum78535701998-03-03 22:19:10 +0000462 if (p == NULL) {
463 PyErr_SetString(PyExc_ValueError, "unconvertible time");
464 return NULL;
465 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000466 if (p[24] == '\n')
467 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000468 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000469}
470
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000471static char ctime_doc[] =
472"ctime(seconds) -> string\n\
473\n\
474Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000475This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
476not present, current time as returned by localtime() is used.";
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000477
Guido van Rossum60cd8131998-03-06 17:16:21 +0000478#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000479static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000480time_mktime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000481{
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000482 PyObject *tup;
Guido van Rossum234f9421993-06-17 12:35:49 +0000483 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000484 time_t tt;
Guido van Rossum43713e52000-02-29 13:59:29 +0000485 if (!PyArg_ParseTuple(args, "O:mktime", &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000486 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000487 tt = time(&tt);
488 buf = *localtime(&tt);
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000489 if (!gettmarg(tup, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000490 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000491 tt = mktime(&buf);
492 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000493 PyErr_SetString(PyExc_OverflowError,
494 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000495 return NULL;
496 }
Jack Jansen63596ae2000-12-12 22:42:30 +0000497#if defined(macintosh) && defined(USE_GUSI211)
Guido van Rossumc410e922000-04-26 20:40:13 +0000498 tt = tt - GUSI_TO_MSL_EPOCH;
499#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000500 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000501}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000502
503static char mktime_doc[] =
504"mktime(tuple) -> floating point number\n\
505\n\
506Convert a time tuple in local time to seconds since the Epoch.";
Guido van Rossum60cd8131998-03-06 17:16:21 +0000507#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000508
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000509static PyMethodDef time_methods[] = {
Thomas Woutersfe385252001-01-19 23:16:56 +0000510 {"time", time_time, METH_VARARGS, time_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000511#ifdef HAVE_CLOCK
Thomas Woutersfe385252001-01-19 23:16:56 +0000512 {"clock", time_clock, METH_VARARGS, clock_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000513#endif
Thomas Woutersfe385252001-01-19 23:16:56 +0000514 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
515 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
516 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000517 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
Thomas Woutersfe385252001-01-19 23:16:56 +0000518 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000519#ifdef HAVE_MKTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000520 {"mktime", time_mktime, METH_VARARGS, mktime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000521#endif
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000522#ifdef HAVE_STRFTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000523 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000524#endif
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000525#ifdef HAVE_STRPTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000526 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000527#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000528 {NULL, NULL} /* sentinel */
529};
530
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000531static void
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000532ins(PyObject *d, char *name, PyObject *v)
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000533{
Barry Warsaw9bfd2bf2000-09-01 09:01:32 +0000534 /* Don't worry too much about errors, they'll be caught by the
535 * caller of inittime().
536 */
537 if (v)
538 PyDict_SetItemString(d, name, v);
539 Py_XDECREF(v);
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000540}
541
Barry Warsaw9bfd2bf2000-09-01 09:01:32 +0000542
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000543static char module_doc[] =
544"This module provides various functions to manipulate time values.\n\
545\n\
546There are two standard representations of time. One is the number\n\
547of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
548or a floating point number (to represent fractions of seconds).\n\
549The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
550The actual value can be retrieved by calling gmtime(0).\n\
551\n\
552The other representation is a tuple of 9 integers giving local time.\n\
553The tuple items are:\n\
554 year (four digits, e.g. 1998)\n\
555 month (1-12)\n\
556 day (1-31)\n\
557 hours (0-23)\n\
558 minutes (0-59)\n\
Guido van Rossum360eb9f1999-02-22 16:19:52 +0000559 seconds (0-59)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000560 weekday (0-6, Monday is 0)\n\
561 Julian day (day in the year, 1-366)\n\
562 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
563If the DST flag is 0, the time is given in the regular time zone;\n\
564if it is 1, the time is given in the DST time zone;\n\
565if it is -1, mktime() should guess based on the date and time.\n\
566\n\
567Variables:\n\
568\n\
569timezone -- difference in seconds between UTC and local standard time\n\
570altzone -- difference in seconds between UTC and local DST time\n\
571daylight -- whether local time should reflect DST\n\
572tzname -- tuple of (standard time zone name, DST time zone name)\n\
573\n\
574Functions:\n\
575\n\
576time() -- return current time in seconds since the Epoch as a float\n\
577clock() -- return CPU time since process start as a float\n\
578sleep() -- delay for a number of seconds given as a float\n\
579gmtime() -- convert seconds since Epoch to UTC tuple\n\
580localtime() -- convert seconds since Epoch to local time tuple\n\
581asctime() -- convert time tuple to string\n\
582ctime() -- convert time in seconds to string\n\
583mktime() -- convert local time tuple to seconds since Epoch\n\
584strftime() -- convert time tuple to string according to format specification\n\
585strptime() -- parse string to time tuple according to format specification\n\
586";
587
588
Guido van Rossum3886bb61998-12-04 18:50:17 +0000589DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000590inittime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000591{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000592 PyObject *m, *d;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000593 char *p;
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000594 m = Py_InitModule3("time", time_methods, module_doc);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000595 d = PyModule_GetDict(m);
Guido van Rossumc2068731998-10-07 16:35:25 +0000596 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
597 p = getenv("PYTHONY2K");
598 ins(d, "accept2dyear", PyInt_FromLong((long) (!p || !*p)));
599 /* Squirrel away the module's dictionary for the y2k check */
600 Py_INCREF(d);
601 moddict = d;
Guido van Rossumea424e11999-04-23 20:59:05 +0000602#if defined(HAVE_TZNAME) && !defined(__GLIBC__)
Guido van Rossum234f9421993-06-17 12:35:49 +0000603 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000604#ifdef PYOS_OS2
605 ins(d, "timezone", PyInt_FromLong((long)_timezone));
606#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000607 ins(d, "timezone", PyInt_FromLong((long)timezone));
Guido van Rossum26452411998-09-28 22:07:11 +0000608#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000609#ifdef HAVE_ALTZONE
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000610 ins(d, "altzone", PyInt_FromLong((long)altzone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000611#else
Guido van Rossum26452411998-09-28 22:07:11 +0000612#ifdef PYOS_OS2
613 ins(d, "altzone", PyInt_FromLong((long)_timezone-3600));
614#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000615 ins(d, "altzone", PyInt_FromLong((long)timezone-3600));
Guido van Rossum26452411998-09-28 22:07:11 +0000616#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000617#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000618 ins(d, "daylight", PyInt_FromLong((long)daylight));
619 ins(d, "tzname", Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossumea424e11999-04-23 20:59:05 +0000620#else /* !HAVE_TZNAME || __GLIBC__ */
Guido van Rossum0ffdd051999-04-05 21:54:14 +0000621#ifdef HAVE_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000622 {
623#define YEAR ((time_t)((365 * 24 + 6) * 3600))
624 time_t t;
625 struct tm *p;
Guido van Rossum57731601999-03-29 19:12:04 +0000626 long janzone, julyzone;
627 char janname[10], julyname[10];
Guido van Rossum234f9421993-06-17 12:35:49 +0000628 t = (time((time_t *)0) / YEAR) * YEAR;
629 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000630 janzone = -p->tm_gmtoff;
631 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
632 janname[9] = '\0';
Guido van Rossum234f9421993-06-17 12:35:49 +0000633 t += YEAR/2;
634 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000635 julyzone = -p->tm_gmtoff;
636 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
637 julyname[9] = '\0';
638
639 if( janzone < julyzone ) {
640 /* DST is reversed in the southern hemisphere */
641 ins(d, "timezone", PyInt_FromLong(julyzone));
642 ins(d, "altzone", PyInt_FromLong(janzone));
643 ins(d, "daylight",
644 PyInt_FromLong((long)(janzone != julyzone)));
645 ins(d, "tzname",
646 Py_BuildValue("(zz)", julyname, janname));
647 } else {
648 ins(d, "timezone", PyInt_FromLong(janzone));
649 ins(d, "altzone", PyInt_FromLong(julyzone));
650 ins(d, "daylight",
651 PyInt_FromLong((long)(janzone != julyzone)));
652 ins(d, "tzname",
653 Py_BuildValue("(zz)", janname, julyname));
654 }
Guido van Rossum234f9421993-06-17 12:35:49 +0000655 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000656#else
657#ifdef macintosh
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000658 /* The only thing we can obtain is the current timezone
659 ** (and whether dst is currently _active_, but that is not what
660 ** we're looking for:-( )
661 */
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000662 initmactimezone();
663 ins(d, "timezone", PyInt_FromLong(timezone));
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000664 ins(d, "altzone", PyInt_FromLong(timezone));
665 ins(d, "daylight", PyInt_FromLong((long)0));
666 ins(d, "tzname", Py_BuildValue("(zz)", "", ""));
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000667#endif /* macintosh */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000668#endif /* HAVE_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000669#ifdef __CYGWIN__
670 tzset();
671 ins(d, "timezone", PyInt_FromLong(_timezone));
672 ins(d, "altzone", PyInt_FromLong(_timezone));
673 ins(d, "daylight", PyInt_FromLong(_daylight));
674 ins(d, "tzname", Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
675#endif /* __CYGWIN__ */
Guido van Rossumea424e11999-04-23 20:59:05 +0000676#endif /* !HAVE_TZNAME || __GLIBC__ */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000677}
678
679
Guido van Rossumb6775db1994-08-01 11:34:53 +0000680/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000681
Guido van Rossumb6775db1994-08-01 11:34:53 +0000682static double
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000683floattime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000684{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000685 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000686 (1) gettimeofday() -- resolution in microseconds
687 (2) ftime() -- resolution in milliseconds
688 (3) time() -- resolution in seconds
689 In all cases the return value is a float in seconds.
690 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
691 fail, so we fall back on ftime() or time().
692 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000693#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000694 {
695 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000696#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000697 if (gettimeofday(&t) == 0)
698 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000699#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000700 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
701 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000702#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000703 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000704#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000705 {
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000706#if defined(HAVE_FTIME)
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000707 struct timeb t;
708 ftime(&t);
709 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000710#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000711 time_t secs;
712 time(&secs);
713 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000714#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000715 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000716}
717
Guido van Rossumb6775db1994-08-01 11:34:53 +0000718
719/* Implement floatsleep() for various platforms.
720 When interrupted (or when another error occurs), return -1 and
721 set an exception; else return 0. */
722
723static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000724floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +0000725{
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000726/* XXX Should test for MS_WIN32 first! */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000727#if defined(HAVE_SELECT) && !defined(__BEOS__)
Guido van Rossum426035c1991-02-19 12:27:35 +0000728 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000729 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000730 frac = fmod(secs, 1.0);
731 secs = floor(secs);
732 t.tv_sec = (long)secs;
733 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000734 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000735 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000736#ifdef EINTR
Guido van Rossuma5456d51999-08-19 14:40:27 +0000737 if (errno != EINTR) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000738#else
739 if (1) {
740#endif
Andrew M. Kuchlingc24ca4b2000-03-24 20:35:20 +0000741 Py_BLOCK_THREADS
Guido van Rossuma5456d51999-08-19 14:40:27 +0000742 PyErr_SetFromErrno(PyExc_IOError);
743 return -1;
744 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000745 }
Guido van Rossum8607ae21997-11-03 22:04:46 +0000746 Py_END_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000747#else /* !HAVE_SELECT || __BEOS__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000748#ifdef macintosh
749#define MacTicks (* (long *)0x16A)
750 long deadline;
751 deadline = MacTicks + (long)(secs * 60.0);
752 while (MacTicks < deadline) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000753 /* XXX Should call some yielding function here */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000754 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000755 return -1;
756 }
757#else /* !macintosh */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000758#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +0000759 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000760 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbceeac81996-05-23 22:53:47 +0000761 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000762 Py_END_ALLOW_THREADS
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000763#else /* !__WATCOMC__ || __QNX__ */
Guido van Rossume22e6441993-07-09 10:51:31 +0000764#ifdef MSDOS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000765 struct timeb t1, t2;
766 double frac;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000767 extern double fmod(double, double);
768 extern double floor(double);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000769 if (secs <= 0.0)
770 return;
771 frac = fmod(secs, 1.0);
772 secs = floor(secs);
773 ftime(&t1);
774 t2.time = t1.time + (int)secs;
775 t2.millitm = t1.millitm + (int)(frac*1000.0);
776 while (t2.millitm >= 1000) {
777 t2.time++;
778 t2.millitm -= 1000;
779 }
780 for (;;) {
781#ifdef QUICKWIN
Guido van Rossum8607ae21997-11-03 22:04:46 +0000782 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000783 _wyield();
Guido van Rossum8607ae21997-11-03 22:04:46 +0000784 Py_END_ALLOW_THREADS
Guido van Rossum80c9d881991-04-16 08:47:51 +0000785#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000786 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000787 return -1;
788 ftime(&t1);
789 if (t1.time > t2.time ||
790 t1.time == t2.time && t1.millitm >= t2.millitm)
791 break;
792 }
793#else /* !MSDOS */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000794#ifdef MS_WIN32
Fred Drake0e123952000-06-29 21:31:02 +0000795 {
796 double millisecs = secs * 1000.0;
797 if (millisecs > (double)ULONG_MAX) {
798 PyErr_SetString(PyExc_OverflowError, "sleep length is too large");
799 return -1;
800 }
801 /* XXX Can't interrupt this sleep */
802 Py_BEGIN_ALLOW_THREADS
803 Sleep((unsigned long)millisecs);
804 Py_END_ALLOW_THREADS
805 }
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000806#else /* !MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000807#ifdef PYOS_OS2
808 /* This Sleep *IS* Interruptable by Exceptions */
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000809 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000810 if (DosSleep(secs * 1000) != NO_ERROR) {
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000811 Py_BLOCK_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000812 PyErr_SetFromErrno(PyExc_IOError);
813 return -1;
814 }
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000815 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000816#else /* !PYOS_OS2 */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000817#ifdef __BEOS__
818 /* This sleep *CAN BE* interrupted. */
819 {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000820 if( secs <= 0.0 ) {
821 return;
822 }
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000823
Guido van Rossumbcc20741998-08-04 22:53:56 +0000824 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000825 /* BeOS snooze() is in microseconds... */
826 if( snooze( (bigtime_t)( secs * 1000.0 * 1000.0 ) ) == B_INTERRUPTED ) {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000827 Py_BLOCK_THREADS
828 PyErr_SetFromErrno( PyExc_IOError );
829 return -1;
830 }
831 Py_END_ALLOW_THREADS
832 }
833#else /* !__BEOS__ */
Guido van Rossumbceccf52001-04-10 22:07:43 +0000834#ifdef RISCOS
835 if (secs <= 0.0)
836 return 0;
837 Py_BEGIN_ALLOW_THREADS
838 /* This sleep *CAN BE* interrupted. */
839 if ( sleep(secs) )
840 return -1;
841 Py_END_ALLOW_THREADS
842#else /* !RISCOS */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000843 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000844 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000845 sleep((int)secs);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000846 Py_END_ALLOW_THREADS
Guido van Rossumbceccf52001-04-10 22:07:43 +0000847#endif /* !RISCOS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000848#endif /* !__BEOS__ */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000849#endif /* !PYOS_OS2 */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000850#endif /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000851#endif /* !MSDOS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000852#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000853#endif /* !macintosh */
854#endif /* !HAVE_SELECT */
855 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000856}