blob: 3cf30d6c46aa12776cca9a9226e122426d37bfc9 [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;
369 char *outbuf = 0;
370 int i;
371
Guido van Rossum1f41f841998-04-27 19:04:26 +0000372 memset((ANY *) &buf, '\0', sizeof(buf));
373
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000374 if (!PyArg_ParseTuple(args, "sO", &fmt, &tup) || !gettmarg(tup, &buf))
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000375 return NULL;
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000376 /* I hate these functions that presume you know how big the output
377 * will be ahead of time...
378 */
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000379 for (i = 1024 ; i <= 8192 ; i += 1024) {
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000380 outbuf = malloc(i);
381 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000382 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000383 }
384 if (strftime(outbuf, i-1, fmt, &buf) != 0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000385 PyObject *ret;
386 ret = PyString_FromString(outbuf);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000387 free(outbuf);
388 return ret;
389 }
390 free(outbuf);
391 }
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000392 PyErr_SetString(PyExc_ValueError,
393 "bad strftime format or result too big");
394 return NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000395}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000396
397static char strftime_doc[] =
398"strftime(format, tuple) -> string\n\
399\n\
400Convert a time tuple to a string according to a format specification.\n\
401See the library reference manual for formatting codes.";
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000402#endif /* HAVE_STRFTIME */
403
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000404#ifdef HAVE_STRPTIME
Guido van Rossum0a6363d1999-01-03 13:00:34 +0000405/* extern char *strptime(); /* Enable this if it's not declared in <time.h> */
Guido van Rossumc2068731998-10-07 16:35:25 +0000406
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000407static PyObject *
408time_strptime(self, args)
409 PyObject *self;
410 PyObject *args;
411{
412 struct tm tm;
413 char *fmt = "%a %b %d %H:%M:%S %Y";
414 char *buf;
415 char *s;
416
417 if (!PyArg_ParseTuple(args, "s|s", &buf, &fmt)) {
418 PyErr_SetString(PyExc_ValueError, "invalid argument");
419 return NULL;
420 }
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000421 memset((ANY *) &tm, '\0', sizeof(tm));
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000422 s = strptime(buf, fmt, &tm);
423 if (s == NULL) {
424 PyErr_SetString(PyExc_ValueError, "format mismatch");
425 return NULL;
426 }
427 while (*s && isspace(*s))
428 s++;
429 if (*s) {
430 PyErr_Format(PyExc_ValueError,
431 "unconverted data remains: '%.400s'", s);
432 return NULL;
433 }
434 return tmtotuple(&tm);
435}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000436
437static char strptime_doc[] =
438"strptime(format, string) -> tuple\n\
439Parse a string to a time tuple according to a format specification.\n\
440See the library reference manual for formatting codes (same as strftime()).";
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000441#endif /* HAVE_STRPTIME */
442
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000443static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000444time_asctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000445 PyObject *self;
446 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000447{
448 struct tm buf;
449 char *p;
450 if (!gettmarg(args, &buf))
451 return NULL;
452 p = asctime(&buf);
453 if (p[24] == '\n')
454 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000455 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000456}
457
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000458static char asctime_doc[] =
459"asctime(tuple) -> string\n\
460\n\
461Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.";
462
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000463static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000464time_ctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000465 PyObject *self;
466 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000467{
468 double dt;
469 time_t tt;
470 char *p;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000471 if (!PyArg_Parse(args, "d", &dt))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000472 return NULL;
Guido van Rossumcac6c721996-09-06 13:34:02 +0000473 tt = (time_t)dt;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000474 p = ctime(&tt);
Guido van Rossum78535701998-03-03 22:19:10 +0000475 if (p == NULL) {
476 PyErr_SetString(PyExc_ValueError, "unconvertible time");
477 return NULL;
478 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000479 if (p[24] == '\n')
480 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000481 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000482}
483
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000484static char ctime_doc[] =
485"ctime(seconds) -> string\n\
486\n\
487Convert a time in seconds since the Epoch to a string in local time.\n\
488This is equivalent to asctime(localtime(seconds)).";
489
Guido van Rossum60cd8131998-03-06 17:16:21 +0000490#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000491static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000492time_mktime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000493 PyObject *self;
494 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000495{
496 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000497 time_t tt;
498 tt = time(&tt);
499 buf = *localtime(&tt);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000500 if (!gettmarg(args, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000501 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000502 tt = mktime(&buf);
503 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000504 PyErr_SetString(PyExc_OverflowError,
505 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000506 return NULL;
507 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000508 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000509}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000510
511static char mktime_doc[] =
512"mktime(tuple) -> floating point number\n\
513\n\
514Convert a time tuple in local time to seconds since the Epoch.";
Guido van Rossum60cd8131998-03-06 17:16:21 +0000515#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000516
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000517static PyMethodDef time_methods[] = {
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000518 {"time", time_time, 0, time_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000519#ifdef HAVE_CLOCK
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000520 {"clock", time_clock, 0, clock_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000521#endif
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000522 {"sleep", time_sleep, 0, sleep_doc},
523 {"gmtime", time_gmtime, 0, gmtime_doc},
524 {"localtime", time_localtime, 0, localtime_doc},
525 {"asctime", time_asctime, 0, asctime_doc},
526 {"ctime", time_ctime, 0, ctime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000527#ifdef HAVE_MKTIME
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000528 {"mktime", time_mktime, 0, mktime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000529#endif
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000530#ifdef HAVE_STRFTIME
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000531 {"strftime", time_strftime, 1, strftime_doc},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000532#endif
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000533#ifdef HAVE_STRPTIME
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000534 {"strptime", time_strptime, 1, strptime_doc},
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000535#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000536 {NULL, NULL} /* sentinel */
537};
538
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000539static void
540ins(d, name, v)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000541 PyObject *d;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000542 char *name;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000543 PyObject *v;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000544{
545 if (v == NULL)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000546 Py_FatalError("Can't initialize time module -- NULL value");
547 if (PyDict_SetItemString(d, name, v) != 0)
548 Py_FatalError(
Guido van Rossum52174571996-12-09 18:38:52 +0000549 "Can't initialize time module -- PyDict_SetItemString failed");
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000550 Py_DECREF(v);
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000551}
552
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000553static char module_doc[] =
554"This module provides various functions to manipulate time values.\n\
555\n\
556There are two standard representations of time. One is the number\n\
557of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
558or a floating point number (to represent fractions of seconds).\n\
559The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
560The actual value can be retrieved by calling gmtime(0).\n\
561\n\
562The other representation is a tuple of 9 integers giving local time.\n\
563The tuple items are:\n\
564 year (four digits, e.g. 1998)\n\
565 month (1-12)\n\
566 day (1-31)\n\
567 hours (0-23)\n\
568 minutes (0-59)\n\
569 seconds (0-61, to allow for leap seconds)\n\
570 weekday (0-6, Monday is 0)\n\
571 Julian day (day in the year, 1-366)\n\
572 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
573If the DST flag is 0, the time is given in the regular time zone;\n\
574if it is 1, the time is given in the DST time zone;\n\
575if it is -1, mktime() should guess based on the date and time.\n\
576\n\
577Variables:\n\
578\n\
579timezone -- difference in seconds between UTC and local standard time\n\
580altzone -- difference in seconds between UTC and local DST time\n\
581daylight -- whether local time should reflect DST\n\
582tzname -- tuple of (standard time zone name, DST time zone name)\n\
583\n\
584Functions:\n\
585\n\
586time() -- return current time in seconds since the Epoch as a float\n\
587clock() -- return CPU time since process start as a float\n\
588sleep() -- delay for a number of seconds given as a float\n\
589gmtime() -- convert seconds since Epoch to UTC tuple\n\
590localtime() -- convert seconds since Epoch to local time tuple\n\
591asctime() -- convert time tuple to string\n\
592ctime() -- convert time in seconds to string\n\
593mktime() -- convert local time tuple to seconds since Epoch\n\
594strftime() -- convert time tuple to string according to format specification\n\
595strptime() -- parse string to time tuple according to format specification\n\
596";
597
598
Guido van Rossum3886bb61998-12-04 18:50:17 +0000599DL_EXPORT(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000600inittime()
601{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000602 PyObject *m, *d;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000603 char *p;
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000604 m = Py_InitModule3("time", time_methods, module_doc);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000605 d = PyModule_GetDict(m);
Guido van Rossumc2068731998-10-07 16:35:25 +0000606 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
607 p = getenv("PYTHONY2K");
608 ins(d, "accept2dyear", PyInt_FromLong((long) (!p || !*p)));
609 /* Squirrel away the module's dictionary for the y2k check */
610 Py_INCREF(d);
611 moddict = d;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000612#ifdef HAVE_TZNAME
Guido van Rossum234f9421993-06-17 12:35:49 +0000613 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000614#ifdef PYOS_OS2
615 ins(d, "timezone", PyInt_FromLong((long)_timezone));
616#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000617 ins(d, "timezone", PyInt_FromLong((long)timezone));
Guido van Rossum26452411998-09-28 22:07:11 +0000618#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000619#ifdef HAVE_ALTZONE
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000620 ins(d, "altzone", PyInt_FromLong((long)altzone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000621#else
Guido van Rossum26452411998-09-28 22:07:11 +0000622#ifdef PYOS_OS2
623 ins(d, "altzone", PyInt_FromLong((long)_timezone-3600));
624#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000625 ins(d, "altzone", PyInt_FromLong((long)timezone-3600));
Guido van Rossum26452411998-09-28 22:07:11 +0000626#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000627#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000628 ins(d, "daylight", PyInt_FromLong((long)daylight));
629 ins(d, "tzname", Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000630#else /* !HAVE_TZNAME */
631#if HAVE_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000632 {
633#define YEAR ((time_t)((365 * 24 + 6) * 3600))
634 time_t t;
635 struct tm *p;
636 long winterzone, summerzone;
637 char wintername[10], summername[10];
Guido van Rossumb6775db1994-08-01 11:34:53 +0000638 /* XXX This won't work on the southern hemisphere.
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000639 XXX Anybody got a better idea? */
Guido van Rossum234f9421993-06-17 12:35:49 +0000640 t = (time((time_t *)0) / YEAR) * YEAR;
641 p = localtime(&t);
642 winterzone = -p->tm_gmtoff;
643 strncpy(wintername, p->tm_zone ? p->tm_zone : " ", 9);
644 wintername[9] = '\0';
645 t += YEAR/2;
646 p = localtime(&t);
647 summerzone = -p->tm_gmtoff;
648 strncpy(summername, p->tm_zone ? p->tm_zone : " ", 9);
649 summername[9] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000650 ins(d, "timezone", PyInt_FromLong(winterzone));
651 ins(d, "altzone", PyInt_FromLong(summerzone));
652 ins(d, "daylight",
653 PyInt_FromLong((long)(winterzone != summerzone)));
654 ins(d, "tzname",
655 Py_BuildValue("(zz)", wintername, summername));
Guido van Rossum234f9421993-06-17 12:35:49 +0000656 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000657#else
658#ifdef macintosh
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000659 /* The only thing we can obtain is the current timezone
660 ** (and whether dst is currently _active_, but that is not what
661 ** we're looking for:-( )
662 */
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000663 initmactimezone();
664 ins(d, "timezone", PyInt_FromLong(timezone));
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000665 ins(d, "altzone", PyInt_FromLong(timezone));
666 ins(d, "daylight", PyInt_FromLong((long)0));
667 ins(d, "tzname", Py_BuildValue("(zz)", "", ""));
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000668#endif /* macintosh */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000669#endif /* HAVE_TM_ZONE */
670#endif /* !HAVE_TZNAME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000671 if (PyErr_Occurred())
672 Py_FatalError("Can't initialize time module");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000673}
674
675
Guido van Rossumb6775db1994-08-01 11:34:53 +0000676/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000677
Guido van Rossumb6775db1994-08-01 11:34:53 +0000678static double
679floattime()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000680{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000681 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000682 (1) gettimeofday() -- resolution in microseconds
683 (2) ftime() -- resolution in milliseconds
684 (3) time() -- resolution in seconds
685 In all cases the return value is a float in seconds.
686 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
687 fail, so we fall back on ftime() or time().
688 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000689#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000690 {
691 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000692#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000693 if (gettimeofday(&t) == 0)
694 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000695#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000696 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
697 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000698#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000699 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000700#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000701 {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000702#if defined(HAVE_FTIME) && !defined(__BEOS__)
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000703 struct timeb t;
704 ftime(&t);
705 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000706#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000707 time_t secs;
708 time(&secs);
709 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000710#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000711 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000712}
713
Guido van Rossumb6775db1994-08-01 11:34:53 +0000714
715/* Implement floatsleep() for various platforms.
716 When interrupted (or when another error occurs), return -1 and
717 set an exception; else return 0. */
718
719static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000720#ifdef MPW
721floatsleep(double secs)
722#else
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000723 floatsleep(secs)
Guido van Rossum775f4da1993-01-09 17:18:52 +0000724 double secs;
Guido van Rossuma320fd31995-03-09 12:14:15 +0000725#endif /* MPW */
Guido van Rossum426035c1991-02-19 12:27:35 +0000726{
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000727/* XXX Should test for MS_WIN32 first! */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000728#if defined(HAVE_SELECT) && !defined(__BEOS__)
Guido van Rossum426035c1991-02-19 12:27:35 +0000729 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000730 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000731 frac = fmod(secs, 1.0);
732 secs = floor(secs);
733 t.tv_sec = (long)secs;
734 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000735 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000736 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000737 Py_BLOCK_THREADS
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000738 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000739 return -1;
740 }
Guido van Rossum8607ae21997-11-03 22:04:46 +0000741 Py_END_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000742#else /* !HAVE_SELECT || __BEOS__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000743#ifdef macintosh
744#define MacTicks (* (long *)0x16A)
745 long deadline;
746 deadline = MacTicks + (long)(secs * 60.0);
747 while (MacTicks < deadline) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000748 /* XXX Should call some yielding function here */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000749 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000750 return -1;
751 }
752#else /* !macintosh */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000753#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +0000754 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000755 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbceeac81996-05-23 22:53:47 +0000756 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000757 Py_END_ALLOW_THREADS
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000758#else /* !__WATCOMC__ || __QNX__ */
Guido van Rossume22e6441993-07-09 10:51:31 +0000759#ifdef MSDOS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000760 struct timeb t1, t2;
761 double frac;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000762 extern double fmod Py_PROTO((double, double));
763 extern double floor Py_PROTO((double));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000764 if (secs <= 0.0)
765 return;
766 frac = fmod(secs, 1.0);
767 secs = floor(secs);
768 ftime(&t1);
769 t2.time = t1.time + (int)secs;
770 t2.millitm = t1.millitm + (int)(frac*1000.0);
771 while (t2.millitm >= 1000) {
772 t2.time++;
773 t2.millitm -= 1000;
774 }
775 for (;;) {
776#ifdef QUICKWIN
Guido van Rossum8607ae21997-11-03 22:04:46 +0000777 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000778 _wyield();
Guido van Rossum8607ae21997-11-03 22:04:46 +0000779 Py_END_ALLOW_THREADS
Guido van Rossum80c9d881991-04-16 08:47:51 +0000780#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000781 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000782 return -1;
783 ftime(&t1);
784 if (t1.time > t2.time ||
785 t1.time == t2.time && t1.millitm >= t2.millitm)
786 break;
787 }
788#else /* !MSDOS */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000789#ifdef MS_WIN32
Guido van Rossumb6775db1994-08-01 11:34:53 +0000790 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000791 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000792 Sleep((int)(secs*1000));
Guido van Rossum8607ae21997-11-03 22:04:46 +0000793 Py_END_ALLOW_THREADS
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000794#else /* !MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000795#ifdef PYOS_OS2
796 /* This Sleep *IS* Interruptable by Exceptions */
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000797 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000798 if (DosSleep(secs * 1000) != NO_ERROR) {
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000799 Py_BLOCK_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000800 PyErr_SetFromErrno(PyExc_IOError);
801 return -1;
802 }
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000803 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000804#else /* !PYOS_OS2 */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000805#ifdef __BEOS__
806 /* This sleep *CAN BE* interrupted. */
807 {
808 bigtime_t frac, seconds;
809
810 extern double fmod Py_PROTO((double,double));
811 extern double floor Py_PROTO((double));
812
813 if( secs <= 0.0 ) {
814 return;
815 }
816
817 frac = (bigtime_t)fmod( secs, 1.0 );
818 seconds = (bigtime_t)floor( secs );
819
820 Py_BEGIN_ALLOW_THREADS
821 if( snooze( seconds * (bigtime_t)1000 + frac ) == B_INTERRUPTED ) {
822 Py_BLOCK_THREADS
823 PyErr_SetFromErrno( PyExc_IOError );
824 return -1;
825 }
826 Py_END_ALLOW_THREADS
827 }
828#else /* !__BEOS__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000829 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000830 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000831 sleep((int)secs);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000832 Py_END_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000833#endif /* !__BEOS__ */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000834#endif /* !PYOS_OS2 */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000835#endif /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000836#endif /* !MSDOS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000837#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000838#endif /* !macintosh */
839#endif /* !HAVE_SELECT */
840 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000841}