blob: b65bfbcee8ae58f83a0d3ae6dd57fce28f55bf9f [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Time module */
33
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000034#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035
Guido van Rossum87ce7bb1998-06-09 16:30:31 +000036#include <ctype.h>
37
Guido van Rossum99d90c01996-08-08 19:17:45 +000038#ifdef HAVE_SELECT
39#include "mymath.h"
40#endif
41
Guido van Rossum6d946f91992-08-14 13:49:30 +000042#ifdef macintosh
Guido van Rossumb6775db1994-08-01 11:34:53 +000043#include <time.h>
44#else
45#include <sys/types.h>
Guido van Rossum6d946f91992-08-14 13:49:30 +000046#endif
47
Guido van Rossumb6775db1994-08-01 11:34:53 +000048#ifdef QUICKWIN
49#include <io.h>
50#endif
51
52#ifdef HAVE_UNISTD_H
Guido van Rossum2762f251992-03-27 17:22:13 +000053#include <unistd.h>
54#endif
55
Guido van Rossumbcc20741998-08-04 22:53:56 +000056#if defined(HAVE_SELECT) && !defined(__BEOS__)
Guido van Rossumb6775db1994-08-01 11:34:53 +000057#include "myselect.h"
58#else
59#include "mytime.h"
60#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000061
Guido van Rossumb6775db1994-08-01 11:34:53 +000062#ifdef HAVE_FTIME
Guido van Rossumbcc20741998-08-04 22:53:56 +000063#ifndef __BEOS__
64/* We have ftime(), but not in the headers (PR2). - [cjh] */
Guido van Rossumb6775db1994-08-01 11:34:53 +000065#include <sys/timeb.h>
Guido van Rossumbcc20741998-08-04 22:53:56 +000066#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000067#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
Guido van Rossum1bb126f1996-12-06 20:17:44 +000068extern int ftime();
Guido van Rossum52174571996-12-09 18:38:52 +000069#endif /* MS_WINDOWS */
70#endif /* HAVE_FTIME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071
Guido van Rossum7bf22de1997-12-02 20:34:19 +000072#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000073#include <i86.h>
74#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000075#ifdef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +000076#include <windows.h>
Guido van Rossumb2fb3641996-09-07 00:47:35 +000077#ifdef MS_WIN16
78/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000079#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000080#define tzname _tzname
81#define daylight _daylight
82#define altzone _altzone
Guido van Rossumb2fb3641996-09-07 00:47:35 +000083#endif /* MS_WIN16 */
Guido van Rossumcac6c721996-09-06 13:34:02 +000084#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000085#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000086
Guido van Rossum3917c221997-04-02 05:35:28 +000087#ifdef MS_WIN32
88/* Win32 has better clock replacement */
89#include <largeint.h>
90#undef HAVE_CLOCK /* We have our own version down below */
91#endif /* MS_WIN32 */
92
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000093#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000094#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000095#endif
96
Guido van Rossumbcc20741998-08-04 22:53:56 +000097#ifdef __BEOS__
98/* For bigtime_t, snooze(). - [cjh] */
99#include <support/SupportDefs.h>
100#include <kernel/OS.h>
101#endif
102
Guido van Rossum234f9421993-06-17 12:35:49 +0000103/* Forward declarations */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000104static int floatsleep Py_PROTO((double));
105static double floattime Py_PROTO(());
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000107/* For Y2K check */
108static PyObject *moddict;
109
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000110#ifdef macintosh
111/* Our own timezone. We have enough information to deduce whether
112** DST is on currently, but unfortunately we cannot put it to good
113** use because we don't know the rules (and that is needed to have
114** localtime() return correct tm_isdst values for times other than
115** the current time. So, we cop out and only tell the user the current
116** timezone.
117*/
118static long timezone;
119
120static void
121initmactimezone()
122{
123 MachineLocation loc;
124 long delta;
125
126 ReadLocation(&loc);
127
128 if (loc.latitude == 0 && loc.longitude == 0 && loc.u.gmtDelta == 0)
129 return;
130
131 delta = loc.u.gmtDelta & 0x00FFFFFF;
132
133 if (delta & 0x00800000)
134 delta |= 0xFF000000;
135
136 timezone = -delta;
137}
138#endif /* macintosh */
139
140
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000141static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142time_time(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000143 PyObject *self;
144 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000146 double secs;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000147 if (!PyArg_NoArgs(args))
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000148 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000149 secs = floattime();
150 if (secs == 0.0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000151 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000152 return NULL;
153 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000154 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000155}
156
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000157static char time_doc[] =
158"time() -> floating point number\n\
159\n\
160Return the current time in seconds since the Epoch.\n\
161Fractions of a second may be present if the system clock provides them.";
162
Guido van Rossumb6775db1994-08-01 11:34:53 +0000163#ifdef HAVE_CLOCK
164
165#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000166#ifdef CLK_TCK
167#define CLOCKS_PER_SEC CLK_TCK
168#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000169#define CLOCKS_PER_SEC 1000000
170#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000171#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000172
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000173static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000174time_clock(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000175 PyObject *self;
176 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000177{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000178 if (!PyArg_NoArgs(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179 return NULL;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000180 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000182#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183
Guido van Rossum3917c221997-04-02 05:35:28 +0000184#ifdef MS_WIN32
185/* Due to Mark Hammond */
186static PyObject *
187time_clock(self, args)
188 PyObject *self;
189 PyObject *args;
190{
191 static LARGE_INTEGER ctrStart;
192 static LARGE_INTEGER divisor = {0,0};
193 LARGE_INTEGER now, diff, rem;
194
195 if (!PyArg_NoArgs(args))
196 return NULL;
197
198 if (LargeIntegerEqualToZero(divisor)) {
199 QueryPerformanceCounter(&ctrStart);
200 if (!QueryPerformanceFrequency(&divisor) ||
201 LargeIntegerEqualToZero(divisor)) {
202 /* Unlikely to happen -
203 this works on all intel machines at least!
204 Revert to clock() */
205 return PyFloat_FromDouble(clock());
206 }
207 }
208 QueryPerformanceCounter(&now);
209 diff = LargeIntegerSubtract(now, ctrStart);
210 diff = LargeIntegerDivide(diff, divisor, &rem);
211 /* XXX - we assume both divide results fit in 32 bits. This is
212 true on Intels. First person who can afford a machine that
213 doesnt deserves to fix it :-)
214 */
215 return PyFloat_FromDouble((double)diff.LowPart +
216 ((double)rem.LowPart / (double)divisor.LowPart));
217}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000218
Guido van Rossum3917c221997-04-02 05:35:28 +0000219#define HAVE_CLOCK /* So it gets included in the methods */
220#endif /* MS_WIN32 */
221
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000222#ifdef HAVE_CLOCK
223static char clock_doc[] =
224"clock() -> floating point number\n\
225\n\
226Return the CPU time or real time since the start of the process or since\n\
227the first call to clock(). This has as much precision as the system records.";
228#endif
229
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000230static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231time_sleep(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000232 PyObject *self;
233 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234{
Guido van Rossum775f4da1993-01-09 17:18:52 +0000235 double secs;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000236 if (!PyArg_Parse(args, "d", &secs))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237 return NULL;
Guido van Rossum8607ae21997-11-03 22:04:46 +0000238 if (floatsleep(secs) != 0)
239 return NULL;
240 Py_INCREF(Py_None);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000241 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242}
243
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000244static char sleep_doc[] =
245"sleep(seconds)\n\
246\n\
247Delay execution for a given number of seconds. The argument may be\n\
248a floating point number for subsecond precision.";
249
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000250static PyObject *
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000251tmtotuple(p)
252 struct tm *p;
253{
254 return Py_BuildValue("(iiiiiiiii)",
255 p->tm_year + 1900,
256 p->tm_mon + 1, /* Want January == 1 */
257 p->tm_mday,
258 p->tm_hour,
259 p->tm_min,
260 p->tm_sec,
261 (p->tm_wday + 6) % 7, /* Want Monday == 0 */
262 p->tm_yday + 1, /* Want January, 1 == 1 */
263 p->tm_isdst);
264}
265
266static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000267time_convert(when, function)
268 time_t when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000269 struct tm * (*function) Py_PROTO((const time_t *));
Guido van Rossum234f9421993-06-17 12:35:49 +0000270{
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000271 struct tm *p;
272 errno = 0;
273 p = function(&when);
274 if (p == NULL) {
275#ifdef EINVAL
Guido van Rossum0b1ff661996-11-02 17:31:22 +0000276 if (errno == 0)
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000277 errno = EINVAL;
278#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000279 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000280 }
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000281 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000282}
283
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000284static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000285time_gmtime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000286 PyObject *self;
287 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000288{
289 double when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000290 if (!PyArg_Parse(args, "d", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000291 return NULL;
292 return time_convert((time_t)when, gmtime);
293}
294
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000295static char gmtime_doc[] =
296"gmtime(seconds) -> tuple\n\
297\n\
298Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a. GMT).";
299
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000300static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000301time_localtime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000302 PyObject *self;
303 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000304{
305 double when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000306 if (!PyArg_Parse(args, "d", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000307 return NULL;
308 return time_convert((time_t)when, localtime);
309}
310
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000311static char localtime_doc[] =
312"localtime(seconds) -> tuple\n\
313Convert seconds since the Epoch to a time tuple expressing local time.";
314
Guido van Rossum9e90a671993-06-24 11:10:19 +0000315static int
316gettmarg(args, p)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000317 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000318 struct tm *p;
319{
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000320 int y;
321 memset((ANY *) p, '\0', sizeof(struct tm));
322
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000323 if (!PyArg_Parse(args, "(iiiiiiiii)",
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000324 &y,
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000325 &p->tm_mon,
326 &p->tm_mday,
327 &p->tm_hour,
328 &p->tm_min,
329 &p->tm_sec,
330 &p->tm_wday,
331 &p->tm_yday,
332 &p->tm_isdst))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000333 return 0;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000334 if (y < 1900) {
335 PyObject *accept = PyDict_GetItemString(moddict,
336 "accept2dyear");
337 if (accept == NULL || !PyInt_Check(accept) ||
338 PyInt_AsLong(accept) == 0) {
339 PyErr_SetString(PyExc_ValueError,
340 "year >= 1900 required");
341 return 0;
342 }
343 if (69 <= y && y <= 99)
344 y += 1900;
345 else if (0 <= y && y <= 68)
346 y += 2000;
347 else {
348 PyErr_SetString(PyExc_ValueError,
349 "year out of range (00-99, 1900-*)");
350 return 0;
351 }
352 }
353 p->tm_year = y - 1900;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000354 p->tm_mon--;
355 p->tm_wday = (p->tm_wday + 1) % 7;
356 p->tm_yday--;
357 return 1;
358}
359
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000360#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000361static PyObject *
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000362time_strftime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000363 PyObject *self;
364 PyObject *args;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000365{
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000366 PyObject *tup;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000367 struct tm buf;
368 const char *fmt;
Guido van Rossumc222ec21999-02-23 00:00:10 +0000369 int fmtlen, buflen;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000370 char *outbuf = 0;
371 int i;
372
Guido van Rossum1f41f841998-04-27 19:04:26 +0000373 memset((ANY *) &buf, '\0', sizeof(buf));
374
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000375 if (!PyArg_ParseTuple(args, "sO", &fmt, &tup) || !gettmarg(tup, &buf))
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000376 return NULL;
Guido van Rossumc222ec21999-02-23 00:00:10 +0000377 fmtlen = strlen(fmt);
378
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000379 /* I hate these functions that presume you know how big the output
380 * will be ahead of time...
381 */
Guido van Rossumc222ec21999-02-23 00:00:10 +0000382 for (i = 1024; ; i += i) {
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000383 outbuf = malloc(i);
384 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000385 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000386 }
Guido van Rossumc222ec21999-02-23 00:00:10 +0000387 buflen = strftime(outbuf, i, fmt, &buf);
388 if (buflen > 0 || i >= 256 * fmtlen) {
389 /* If the buffer is 256 times as long as the format,
390 it's probably not failing for lack of room!
391 More likely, the format yields an empty result,
392 e.g. an empty format, or %Z when the timezone
393 is unknown. */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000394 PyObject *ret;
Guido van Rossumc222ec21999-02-23 00:00:10 +0000395 ret = PyString_FromStringAndSize(outbuf, buflen);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000396 free(outbuf);
397 return ret;
398 }
399 free(outbuf);
400 }
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000401}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000402
403static char strftime_doc[] =
404"strftime(format, tuple) -> string\n\
405\n\
406Convert a time tuple to a string according to a format specification.\n\
407See the library reference manual for formatting codes.";
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000408#endif /* HAVE_STRFTIME */
409
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000410#ifdef HAVE_STRPTIME
Guido van Rossum0a6363d1999-01-03 13:00:34 +0000411/* extern char *strptime(); /* Enable this if it's not declared in <time.h> */
Guido van Rossumc2068731998-10-07 16:35:25 +0000412
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000413static PyObject *
414time_strptime(self, args)
415 PyObject *self;
416 PyObject *args;
417{
418 struct tm tm;
419 char *fmt = "%a %b %d %H:%M:%S %Y";
420 char *buf;
421 char *s;
422
423 if (!PyArg_ParseTuple(args, "s|s", &buf, &fmt)) {
424 PyErr_SetString(PyExc_ValueError, "invalid argument");
425 return NULL;
426 }
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000427 memset((ANY *) &tm, '\0', sizeof(tm));
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000428 s = strptime(buf, fmt, &tm);
429 if (s == NULL) {
430 PyErr_SetString(PyExc_ValueError, "format mismatch");
431 return NULL;
432 }
433 while (*s && isspace(*s))
434 s++;
435 if (*s) {
436 PyErr_Format(PyExc_ValueError,
437 "unconverted data remains: '%.400s'", s);
438 return NULL;
439 }
440 return tmtotuple(&tm);
441}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000442
443static char strptime_doc[] =
Guido van Rossum446ccfe1999-01-07 18:29:26 +0000444"strptime(string, format) -> tuple\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000445Parse a string to a time tuple according to a format specification.\n\
446See the library reference manual for formatting codes (same as strftime()).";
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000447#endif /* HAVE_STRPTIME */
448
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000449static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000450time_asctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000451 PyObject *self;
452 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000453{
454 struct tm buf;
455 char *p;
456 if (!gettmarg(args, &buf))
457 return NULL;
458 p = asctime(&buf);
459 if (p[24] == '\n')
460 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000461 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000462}
463
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000464static char asctime_doc[] =
465"asctime(tuple) -> string\n\
466\n\
467Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.";
468
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000469static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000470time_ctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000471 PyObject *self;
472 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000473{
474 double dt;
475 time_t tt;
476 char *p;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000477 if (!PyArg_Parse(args, "d", &dt))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000478 return NULL;
Guido van Rossumcac6c721996-09-06 13:34:02 +0000479 tt = (time_t)dt;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000480 p = ctime(&tt);
Guido van Rossum78535701998-03-03 22:19:10 +0000481 if (p == NULL) {
482 PyErr_SetString(PyExc_ValueError, "unconvertible time");
483 return NULL;
484 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000485 if (p[24] == '\n')
486 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000487 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000488}
489
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000490static char ctime_doc[] =
491"ctime(seconds) -> string\n\
492\n\
493Convert a time in seconds since the Epoch to a string in local time.\n\
494This is equivalent to asctime(localtime(seconds)).";
495
Guido van Rossum60cd8131998-03-06 17:16:21 +0000496#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000497static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000498time_mktime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000499 PyObject *self;
500 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000501{
502 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000503 time_t tt;
504 tt = time(&tt);
505 buf = *localtime(&tt);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000506 if (!gettmarg(args, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000507 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000508 tt = mktime(&buf);
509 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000510 PyErr_SetString(PyExc_OverflowError,
511 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000512 return NULL;
513 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000514 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000515}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000516
517static char mktime_doc[] =
518"mktime(tuple) -> floating point number\n\
519\n\
520Convert a time tuple in local time to seconds since the Epoch.";
Guido van Rossum60cd8131998-03-06 17:16:21 +0000521#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000522
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000523static PyMethodDef time_methods[] = {
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000524 {"time", time_time, 0, time_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000525#ifdef HAVE_CLOCK
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000526 {"clock", time_clock, 0, clock_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000527#endif
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000528 {"sleep", time_sleep, 0, sleep_doc},
529 {"gmtime", time_gmtime, 0, gmtime_doc},
530 {"localtime", time_localtime, 0, localtime_doc},
531 {"asctime", time_asctime, 0, asctime_doc},
532 {"ctime", time_ctime, 0, ctime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000533#ifdef HAVE_MKTIME
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000534 {"mktime", time_mktime, 0, mktime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000535#endif
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000536#ifdef HAVE_STRFTIME
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000537 {"strftime", time_strftime, 1, strftime_doc},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000538#endif
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000539#ifdef HAVE_STRPTIME
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000540 {"strptime", time_strptime, 1, strptime_doc},
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000541#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000542 {NULL, NULL} /* sentinel */
543};
544
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000545static void
546ins(d, name, v)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000547 PyObject *d;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000548 char *name;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000549 PyObject *v;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000550{
551 if (v == NULL)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000552 Py_FatalError("Can't initialize time module -- NULL value");
553 if (PyDict_SetItemString(d, name, v) != 0)
554 Py_FatalError(
Guido van Rossum52174571996-12-09 18:38:52 +0000555 "Can't initialize time module -- PyDict_SetItemString failed");
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000556 Py_DECREF(v);
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000557}
558
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000559static char module_doc[] =
560"This module provides various functions to manipulate time values.\n\
561\n\
562There are two standard representations of time. One is the number\n\
563of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
564or a floating point number (to represent fractions of seconds).\n\
565The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
566The actual value can be retrieved by calling gmtime(0).\n\
567\n\
568The other representation is a tuple of 9 integers giving local time.\n\
569The tuple items are:\n\
570 year (four digits, e.g. 1998)\n\
571 month (1-12)\n\
572 day (1-31)\n\
573 hours (0-23)\n\
574 minutes (0-59)\n\
Guido van Rossum360eb9f1999-02-22 16:19:52 +0000575 seconds (0-59)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000576 weekday (0-6, Monday is 0)\n\
577 Julian day (day in the year, 1-366)\n\
578 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
579If the DST flag is 0, the time is given in the regular time zone;\n\
580if it is 1, the time is given in the DST time zone;\n\
581if it is -1, mktime() should guess based on the date and time.\n\
582\n\
583Variables:\n\
584\n\
585timezone -- difference in seconds between UTC and local standard time\n\
586altzone -- difference in seconds between UTC and local DST time\n\
587daylight -- whether local time should reflect DST\n\
588tzname -- tuple of (standard time zone name, DST time zone name)\n\
589\n\
590Functions:\n\
591\n\
592time() -- return current time in seconds since the Epoch as a float\n\
593clock() -- return CPU time since process start as a float\n\
594sleep() -- delay for a number of seconds given as a float\n\
595gmtime() -- convert seconds since Epoch to UTC tuple\n\
596localtime() -- convert seconds since Epoch to local time tuple\n\
597asctime() -- convert time tuple to string\n\
598ctime() -- convert time in seconds to string\n\
599mktime() -- convert local time tuple to seconds since Epoch\n\
600strftime() -- convert time tuple to string according to format specification\n\
601strptime() -- parse string to time tuple according to format specification\n\
602";
603
604
Guido van Rossum3886bb61998-12-04 18:50:17 +0000605DL_EXPORT(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000606inittime()
607{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000608 PyObject *m, *d;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000609 char *p;
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000610 m = Py_InitModule3("time", time_methods, module_doc);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000611 d = PyModule_GetDict(m);
Guido van Rossumc2068731998-10-07 16:35:25 +0000612 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
613 p = getenv("PYTHONY2K");
614 ins(d, "accept2dyear", PyInt_FromLong((long) (!p || !*p)));
615 /* Squirrel away the module's dictionary for the y2k check */
616 Py_INCREF(d);
617 moddict = d;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000618#ifdef HAVE_TZNAME
Guido van Rossum234f9421993-06-17 12:35:49 +0000619 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000620#ifdef PYOS_OS2
621 ins(d, "timezone", PyInt_FromLong((long)_timezone));
622#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000623 ins(d, "timezone", PyInt_FromLong((long)timezone));
Guido van Rossum26452411998-09-28 22:07:11 +0000624#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000625#ifdef HAVE_ALTZONE
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000626 ins(d, "altzone", PyInt_FromLong((long)altzone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000627#else
Guido van Rossum26452411998-09-28 22:07:11 +0000628#ifdef PYOS_OS2
629 ins(d, "altzone", PyInt_FromLong((long)_timezone-3600));
630#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000631 ins(d, "altzone", PyInt_FromLong((long)timezone-3600));
Guido van Rossum26452411998-09-28 22:07:11 +0000632#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000633#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000634 ins(d, "daylight", PyInt_FromLong((long)daylight));
635 ins(d, "tzname", Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000636#else /* !HAVE_TZNAME */
637#if HAVE_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000638 {
639#define YEAR ((time_t)((365 * 24 + 6) * 3600))
640 time_t t;
641 struct tm *p;
642 long winterzone, summerzone;
643 char wintername[10], summername[10];
Guido van Rossumb6775db1994-08-01 11:34:53 +0000644 /* XXX This won't work on the southern hemisphere.
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000645 XXX Anybody got a better idea? */
Guido van Rossum234f9421993-06-17 12:35:49 +0000646 t = (time((time_t *)0) / YEAR) * YEAR;
647 p = localtime(&t);
648 winterzone = -p->tm_gmtoff;
649 strncpy(wintername, p->tm_zone ? p->tm_zone : " ", 9);
650 wintername[9] = '\0';
651 t += YEAR/2;
652 p = localtime(&t);
653 summerzone = -p->tm_gmtoff;
654 strncpy(summername, p->tm_zone ? p->tm_zone : " ", 9);
655 summername[9] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000656 ins(d, "timezone", PyInt_FromLong(winterzone));
657 ins(d, "altzone", PyInt_FromLong(summerzone));
658 ins(d, "daylight",
659 PyInt_FromLong((long)(winterzone != summerzone)));
660 ins(d, "tzname",
661 Py_BuildValue("(zz)", wintername, summername));
Guido van Rossum234f9421993-06-17 12:35:49 +0000662 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000663#else
664#ifdef macintosh
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000665 /* The only thing we can obtain is the current timezone
666 ** (and whether dst is currently _active_, but that is not what
667 ** we're looking for:-( )
668 */
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000669 initmactimezone();
670 ins(d, "timezone", PyInt_FromLong(timezone));
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000671 ins(d, "altzone", PyInt_FromLong(timezone));
672 ins(d, "daylight", PyInt_FromLong((long)0));
673 ins(d, "tzname", Py_BuildValue("(zz)", "", ""));
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000674#endif /* macintosh */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000675#endif /* HAVE_TM_ZONE */
676#endif /* !HAVE_TZNAME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000677 if (PyErr_Occurred())
678 Py_FatalError("Can't initialize time module");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000679}
680
681
Guido van Rossumb6775db1994-08-01 11:34:53 +0000682/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000683
Guido van Rossumb6775db1994-08-01 11:34:53 +0000684static double
685floattime()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000686{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000687 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000688 (1) gettimeofday() -- resolution in microseconds
689 (2) ftime() -- resolution in milliseconds
690 (3) time() -- resolution in seconds
691 In all cases the return value is a float in seconds.
692 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
693 fail, so we fall back on ftime() or time().
694 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000695#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000696 {
697 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000698#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000699 if (gettimeofday(&t) == 0)
700 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000701#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000702 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
703 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000704#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000705 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000706#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000707 {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000708#if defined(HAVE_FTIME) && !defined(__BEOS__)
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000709 struct timeb t;
710 ftime(&t);
711 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000712#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000713 time_t secs;
714 time(&secs);
715 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000716#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000717 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000718}
719
Guido van Rossumb6775db1994-08-01 11:34:53 +0000720
721/* Implement floatsleep() for various platforms.
722 When interrupted (or when another error occurs), return -1 and
723 set an exception; else return 0. */
724
725static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000726#ifdef MPW
727floatsleep(double secs)
728#else
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000729 floatsleep(secs)
Guido van Rossum775f4da1993-01-09 17:18:52 +0000730 double secs;
Guido van Rossuma320fd31995-03-09 12:14:15 +0000731#endif /* MPW */
Guido van Rossum426035c1991-02-19 12:27:35 +0000732{
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000733/* XXX Should test for MS_WIN32 first! */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000734#if defined(HAVE_SELECT) && !defined(__BEOS__)
Guido van Rossum426035c1991-02-19 12:27:35 +0000735 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000736 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000737 frac = fmod(secs, 1.0);
738 secs = floor(secs);
739 t.tv_sec = (long)secs;
740 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000741 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000742 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000743 Py_BLOCK_THREADS
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000744 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000745 return -1;
746 }
Guido van Rossum8607ae21997-11-03 22:04:46 +0000747 Py_END_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000748#else /* !HAVE_SELECT || __BEOS__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000749#ifdef macintosh
750#define MacTicks (* (long *)0x16A)
751 long deadline;
752 deadline = MacTicks + (long)(secs * 60.0);
753 while (MacTicks < deadline) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000754 /* XXX Should call some yielding function here */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000755 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000756 return -1;
757 }
758#else /* !macintosh */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000759#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +0000760 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000761 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbceeac81996-05-23 22:53:47 +0000762 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000763 Py_END_ALLOW_THREADS
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000764#else /* !__WATCOMC__ || __QNX__ */
Guido van Rossume22e6441993-07-09 10:51:31 +0000765#ifdef MSDOS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000766 struct timeb t1, t2;
767 double frac;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000768 extern double fmod Py_PROTO((double, double));
769 extern double floor Py_PROTO((double));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000770 if (secs <= 0.0)
771 return;
772 frac = fmod(secs, 1.0);
773 secs = floor(secs);
774 ftime(&t1);
775 t2.time = t1.time + (int)secs;
776 t2.millitm = t1.millitm + (int)(frac*1000.0);
777 while (t2.millitm >= 1000) {
778 t2.time++;
779 t2.millitm -= 1000;
780 }
781 for (;;) {
782#ifdef QUICKWIN
Guido van Rossum8607ae21997-11-03 22:04:46 +0000783 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000784 _wyield();
Guido van Rossum8607ae21997-11-03 22:04:46 +0000785 Py_END_ALLOW_THREADS
Guido van Rossum80c9d881991-04-16 08:47:51 +0000786#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000787 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000788 return -1;
789 ftime(&t1);
790 if (t1.time > t2.time ||
791 t1.time == t2.time && t1.millitm >= t2.millitm)
792 break;
793 }
794#else /* !MSDOS */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000795#ifdef MS_WIN32
Guido van Rossumb6775db1994-08-01 11:34:53 +0000796 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000797 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000798 Sleep((int)(secs*1000));
Guido van Rossum8607ae21997-11-03 22:04:46 +0000799 Py_END_ALLOW_THREADS
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000800#else /* !MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000801#ifdef PYOS_OS2
802 /* This Sleep *IS* Interruptable by Exceptions */
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000803 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000804 if (DosSleep(secs * 1000) != NO_ERROR) {
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000805 Py_BLOCK_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000806 PyErr_SetFromErrno(PyExc_IOError);
807 return -1;
808 }
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000809 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000810#else /* !PYOS_OS2 */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000811#ifdef __BEOS__
812 /* This sleep *CAN BE* interrupted. */
813 {
814 bigtime_t frac, seconds;
815
816 extern double fmod Py_PROTO((double,double));
817 extern double floor Py_PROTO((double));
818
819 if( secs <= 0.0 ) {
820 return;
821 }
822
823 frac = (bigtime_t)fmod( secs, 1.0 );
824 seconds = (bigtime_t)floor( secs );
825
826 Py_BEGIN_ALLOW_THREADS
827 if( snooze( seconds * (bigtime_t)1000 + frac ) == B_INTERRUPTED ) {
828 Py_BLOCK_THREADS
829 PyErr_SetFromErrno( PyExc_IOError );
830 return -1;
831 }
832 Py_END_ALLOW_THREADS
833 }
834#else /* !__BEOS__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000835 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000836 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000837 sleep((int)secs);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000838 Py_END_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000839#endif /* !__BEOS__ */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000840#endif /* !PYOS_OS2 */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000841#endif /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000842#endif /* !MSDOS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000843#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000844#endif /* !macintosh */
845#endif /* !HAVE_SELECT */
846 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000847}