blob: cde48974c5d91300672e40b649affde61ca75510 [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
405static PyObject *
406time_strptime(self, args)
407 PyObject *self;
408 PyObject *args;
409{
410 struct tm tm;
411 char *fmt = "%a %b %d %H:%M:%S %Y";
412 char *buf;
413 char *s;
414
415 if (!PyArg_ParseTuple(args, "s|s", &buf, &fmt)) {
416 PyErr_SetString(PyExc_ValueError, "invalid argument");
417 return NULL;
418 }
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000419 memset((ANY *) &tm, '\0', sizeof(tm));
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000420 s = strptime(buf, fmt, &tm);
421 if (s == NULL) {
422 PyErr_SetString(PyExc_ValueError, "format mismatch");
423 return NULL;
424 }
425 while (*s && isspace(*s))
426 s++;
427 if (*s) {
428 PyErr_Format(PyExc_ValueError,
429 "unconverted data remains: '%.400s'", s);
430 return NULL;
431 }
432 return tmtotuple(&tm);
433}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000434
435static char strptime_doc[] =
436"strptime(format, string) -> tuple\n\
437Parse a string to a time tuple according to a format specification.\n\
438See the library reference manual for formatting codes (same as strftime()).";
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000439#endif /* HAVE_STRPTIME */
440
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000441static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000442time_asctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000443 PyObject *self;
444 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000445{
446 struct tm buf;
447 char *p;
448 if (!gettmarg(args, &buf))
449 return NULL;
450 p = asctime(&buf);
451 if (p[24] == '\n')
452 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000453 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000454}
455
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000456static char asctime_doc[] =
457"asctime(tuple) -> string\n\
458\n\
459Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.";
460
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000461static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000462time_ctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000463 PyObject *self;
464 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000465{
466 double dt;
467 time_t tt;
468 char *p;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000469 if (!PyArg_Parse(args, "d", &dt))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000470 return NULL;
Guido van Rossumcac6c721996-09-06 13:34:02 +0000471 tt = (time_t)dt;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000472 p = ctime(&tt);
Guido van Rossum78535701998-03-03 22:19:10 +0000473 if (p == NULL) {
474 PyErr_SetString(PyExc_ValueError, "unconvertible time");
475 return NULL;
476 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000477 if (p[24] == '\n')
478 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000479 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000480}
481
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000482static char ctime_doc[] =
483"ctime(seconds) -> string\n\
484\n\
485Convert a time in seconds since the Epoch to a string in local time.\n\
486This is equivalent to asctime(localtime(seconds)).";
487
Guido van Rossum60cd8131998-03-06 17:16:21 +0000488#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000489static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000490time_mktime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000491 PyObject *self;
492 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000493{
494 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000495 time_t tt;
496 tt = time(&tt);
497 buf = *localtime(&tt);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000498 if (!gettmarg(args, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000499 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000500 tt = mktime(&buf);
501 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000502 PyErr_SetString(PyExc_OverflowError,
503 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000504 return NULL;
505 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000506 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000507}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000508
509static char mktime_doc[] =
510"mktime(tuple) -> floating point number\n\
511\n\
512Convert a time tuple in local time to seconds since the Epoch.";
Guido van Rossum60cd8131998-03-06 17:16:21 +0000513#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000514
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000515static PyMethodDef time_methods[] = {
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000516 {"time", time_time, 0, time_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000517#ifdef HAVE_CLOCK
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000518 {"clock", time_clock, 0, clock_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000519#endif
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000520 {"sleep", time_sleep, 0, sleep_doc},
521 {"gmtime", time_gmtime, 0, gmtime_doc},
522 {"localtime", time_localtime, 0, localtime_doc},
523 {"asctime", time_asctime, 0, asctime_doc},
524 {"ctime", time_ctime, 0, ctime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000525#ifdef HAVE_MKTIME
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000526 {"mktime", time_mktime, 0, mktime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000527#endif
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000528#ifdef HAVE_STRFTIME
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000529 {"strftime", time_strftime, 1, strftime_doc},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000530#endif
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000531#ifdef HAVE_STRPTIME
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000532 {"strptime", time_strptime, 1, strptime_doc},
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000533#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000534 {NULL, NULL} /* sentinel */
535};
536
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000537static void
538ins(d, name, v)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000539 PyObject *d;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000540 char *name;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000541 PyObject *v;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000542{
543 if (v == NULL)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000544 Py_FatalError("Can't initialize time module -- NULL value");
545 if (PyDict_SetItemString(d, name, v) != 0)
546 Py_FatalError(
Guido van Rossum52174571996-12-09 18:38:52 +0000547 "Can't initialize time module -- PyDict_SetItemString failed");
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000548 Py_DECREF(v);
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000549}
550
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000551static char module_doc[] =
552"This module provides various functions to manipulate time values.\n\
553\n\
554There are two standard representations of time. One is the number\n\
555of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
556or a floating point number (to represent fractions of seconds).\n\
557The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
558The actual value can be retrieved by calling gmtime(0).\n\
559\n\
560The other representation is a tuple of 9 integers giving local time.\n\
561The tuple items are:\n\
562 year (four digits, e.g. 1998)\n\
563 month (1-12)\n\
564 day (1-31)\n\
565 hours (0-23)\n\
566 minutes (0-59)\n\
567 seconds (0-61, to allow for leap seconds)\n\
568 weekday (0-6, Monday is 0)\n\
569 Julian day (day in the year, 1-366)\n\
570 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
571If the DST flag is 0, the time is given in the regular time zone;\n\
572if it is 1, the time is given in the DST time zone;\n\
573if it is -1, mktime() should guess based on the date and time.\n\
574\n\
575Variables:\n\
576\n\
577timezone -- difference in seconds between UTC and local standard time\n\
578altzone -- difference in seconds between UTC and local DST time\n\
579daylight -- whether local time should reflect DST\n\
580tzname -- tuple of (standard time zone name, DST time zone name)\n\
581\n\
582Functions:\n\
583\n\
584time() -- return current time in seconds since the Epoch as a float\n\
585clock() -- return CPU time since process start as a float\n\
586sleep() -- delay for a number of seconds given as a float\n\
587gmtime() -- convert seconds since Epoch to UTC tuple\n\
588localtime() -- convert seconds since Epoch to local time tuple\n\
589asctime() -- convert time tuple to string\n\
590ctime() -- convert time in seconds to string\n\
591mktime() -- convert local time tuple to seconds since Epoch\n\
592strftime() -- convert time tuple to string according to format specification\n\
593strptime() -- parse string to time tuple according to format specification\n\
594";
595
596
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000597void
598inittime()
599{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000600 PyObject *m, *d;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000601 char *p;
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000602 m = Py_InitModule3("time", time_methods, module_doc);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000603 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000604#ifdef HAVE_TZNAME
Guido van Rossum234f9421993-06-17 12:35:49 +0000605 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000606#ifdef PYOS_OS2
607 ins(d, "timezone", PyInt_FromLong((long)_timezone));
608#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000609 ins(d, "timezone", PyInt_FromLong((long)timezone));
Guido van Rossum26452411998-09-28 22:07:11 +0000610#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000611#ifdef HAVE_ALTZONE
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000612 ins(d, "altzone", PyInt_FromLong((long)altzone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000613#else
Guido van Rossum26452411998-09-28 22:07:11 +0000614#ifdef PYOS_OS2
615 ins(d, "altzone", PyInt_FromLong((long)_timezone-3600));
616#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000617 ins(d, "altzone", PyInt_FromLong((long)timezone-3600));
Guido van Rossum26452411998-09-28 22:07:11 +0000618#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000619#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000620 ins(d, "daylight", PyInt_FromLong((long)daylight));
621 ins(d, "tzname", Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000622 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
623 p = getenv("PYTHONY2K");
624 ins(d, "accept2dyear", PyInt_FromLong((long) (!p || !*p)));
625 /* Squirrel away the module's dictionary for the y2k check */
626 Py_INCREF(d);
627 moddict = d;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000628#else /* !HAVE_TZNAME */
629#if HAVE_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000630 {
631#define YEAR ((time_t)((365 * 24 + 6) * 3600))
632 time_t t;
633 struct tm *p;
634 long winterzone, summerzone;
635 char wintername[10], summername[10];
Guido van Rossumb6775db1994-08-01 11:34:53 +0000636 /* XXX This won't work on the southern hemisphere.
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000637 XXX Anybody got a better idea? */
Guido van Rossum234f9421993-06-17 12:35:49 +0000638 t = (time((time_t *)0) / YEAR) * YEAR;
639 p = localtime(&t);
640 winterzone = -p->tm_gmtoff;
641 strncpy(wintername, p->tm_zone ? p->tm_zone : " ", 9);
642 wintername[9] = '\0';
643 t += YEAR/2;
644 p = localtime(&t);
645 summerzone = -p->tm_gmtoff;
646 strncpy(summername, p->tm_zone ? p->tm_zone : " ", 9);
647 summername[9] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000648 ins(d, "timezone", PyInt_FromLong(winterzone));
649 ins(d, "altzone", PyInt_FromLong(summerzone));
650 ins(d, "daylight",
651 PyInt_FromLong((long)(winterzone != summerzone)));
652 ins(d, "tzname",
653 Py_BuildValue("(zz)", wintername, summername));
Guido van Rossum234f9421993-06-17 12:35:49 +0000654 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000655#else
656#ifdef macintosh
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000657 /* The only thing we can obtain is the current timezone
658 ** (and whether dst is currently _active_, but that is not what
659 ** we're looking for:-( )
660 */
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000661 initmactimezone();
662 ins(d, "timezone", PyInt_FromLong(timezone));
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000663 ins(d, "altzone", PyInt_FromLong(timezone));
664 ins(d, "daylight", PyInt_FromLong((long)0));
665 ins(d, "tzname", Py_BuildValue("(zz)", "", ""));
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000666#endif /* macintosh */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000667#endif /* HAVE_TM_ZONE */
668#endif /* !HAVE_TZNAME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000669 if (PyErr_Occurred())
670 Py_FatalError("Can't initialize time module");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000671}
672
673
Guido van Rossumb6775db1994-08-01 11:34:53 +0000674/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000675
Guido van Rossumb6775db1994-08-01 11:34:53 +0000676static double
677floattime()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000678{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000679 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000680 (1) gettimeofday() -- resolution in microseconds
681 (2) ftime() -- resolution in milliseconds
682 (3) time() -- resolution in seconds
683 In all cases the return value is a float in seconds.
684 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
685 fail, so we fall back on ftime() or time().
686 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000687#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000688 {
689 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000690#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000691 if (gettimeofday(&t) == 0)
692 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000693#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000694 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
695 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000696#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000697 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000698#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000699 {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000700#if defined(HAVE_FTIME) && !defined(__BEOS__)
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000701 struct timeb t;
702 ftime(&t);
703 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000704#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000705 time_t secs;
706 time(&secs);
707 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000708#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000709 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000710}
711
Guido van Rossumb6775db1994-08-01 11:34:53 +0000712
713/* Implement floatsleep() for various platforms.
714 When interrupted (or when another error occurs), return -1 and
715 set an exception; else return 0. */
716
717static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000718#ifdef MPW
719floatsleep(double secs)
720#else
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000721 floatsleep(secs)
Guido van Rossum775f4da1993-01-09 17:18:52 +0000722 double secs;
Guido van Rossuma320fd31995-03-09 12:14:15 +0000723#endif /* MPW */
Guido van Rossum426035c1991-02-19 12:27:35 +0000724{
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000725/* XXX Should test for MS_WIN32 first! */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000726#if defined(HAVE_SELECT) && !defined(__BEOS__)
Guido van Rossum426035c1991-02-19 12:27:35 +0000727 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000728 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000729 frac = fmod(secs, 1.0);
730 secs = floor(secs);
731 t.tv_sec = (long)secs;
732 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000733 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000734 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000735 Py_BLOCK_THREADS
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000736 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000737 return -1;
738 }
Guido van Rossum8607ae21997-11-03 22:04:46 +0000739 Py_END_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000740#else /* !HAVE_SELECT || __BEOS__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000741#ifdef macintosh
742#define MacTicks (* (long *)0x16A)
743 long deadline;
744 deadline = MacTicks + (long)(secs * 60.0);
745 while (MacTicks < deadline) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000746 /* XXX Should call some yielding function here */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000747 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000748 return -1;
749 }
750#else /* !macintosh */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000751#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +0000752 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000753 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbceeac81996-05-23 22:53:47 +0000754 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000755 Py_END_ALLOW_THREADS
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000756#else /* !__WATCOMC__ || __QNX__ */
Guido van Rossume22e6441993-07-09 10:51:31 +0000757#ifdef MSDOS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000758 struct timeb t1, t2;
759 double frac;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000760 extern double fmod Py_PROTO((double, double));
761 extern double floor Py_PROTO((double));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000762 if (secs <= 0.0)
763 return;
764 frac = fmod(secs, 1.0);
765 secs = floor(secs);
766 ftime(&t1);
767 t2.time = t1.time + (int)secs;
768 t2.millitm = t1.millitm + (int)(frac*1000.0);
769 while (t2.millitm >= 1000) {
770 t2.time++;
771 t2.millitm -= 1000;
772 }
773 for (;;) {
774#ifdef QUICKWIN
Guido van Rossum8607ae21997-11-03 22:04:46 +0000775 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000776 _wyield();
Guido van Rossum8607ae21997-11-03 22:04:46 +0000777 Py_END_ALLOW_THREADS
Guido van Rossum80c9d881991-04-16 08:47:51 +0000778#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000779 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000780 return -1;
781 ftime(&t1);
782 if (t1.time > t2.time ||
783 t1.time == t2.time && t1.millitm >= t2.millitm)
784 break;
785 }
786#else /* !MSDOS */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000787#ifdef MS_WIN32
Guido van Rossumb6775db1994-08-01 11:34:53 +0000788 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000789 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000790 Sleep((int)(secs*1000));
Guido van Rossum8607ae21997-11-03 22:04:46 +0000791 Py_END_ALLOW_THREADS
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000792#else /* !MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000793#ifdef PYOS_OS2
794 /* This Sleep *IS* Interruptable by Exceptions */
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000795 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000796 if (DosSleep(secs * 1000) != NO_ERROR) {
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000797 Py_BLOCK_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000798 PyErr_SetFromErrno(PyExc_IOError);
799 return -1;
800 }
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000801 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000802#else /* !PYOS_OS2 */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000803#ifdef __BEOS__
804 /* This sleep *CAN BE* interrupted. */
805 {
806 bigtime_t frac, seconds;
807
808 extern double fmod Py_PROTO((double,double));
809 extern double floor Py_PROTO((double));
810
811 if( secs <= 0.0 ) {
812 return;
813 }
814
815 frac = (bigtime_t)fmod( secs, 1.0 );
816 seconds = (bigtime_t)floor( secs );
817
818 Py_BEGIN_ALLOW_THREADS
819 if( snooze( seconds * (bigtime_t)1000 + frac ) == B_INTERRUPTED ) {
820 Py_BLOCK_THREADS
821 PyErr_SetFromErrno( PyExc_IOError );
822 return -1;
823 }
824 Py_END_ALLOW_THREADS
825 }
826#else /* !__BEOS__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000827 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000828 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000829 sleep((int)secs);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000830 Py_END_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000831#endif /* !__BEOS__ */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000832#endif /* !PYOS_OS2 */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000833#endif /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000834#endif /* !MSDOS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000835#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000836#endif /* !macintosh */
837#endif /* !HAVE_SELECT */
838 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000839}