blob: d5a598b6b79a314aef7d2a600e0be3964663e1f0 [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
63#include <sys/timeb.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000064#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
Guido van Rossum1bb126f1996-12-06 20:17:44 +000065extern int ftime();
Guido van Rossum52174571996-12-09 18:38:52 +000066#endif /* MS_WINDOWS */
67#endif /* HAVE_FTIME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068
Guido van Rossum7bf22de1997-12-02 20:34:19 +000069#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000070#include <i86.h>
71#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000072#ifdef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +000073#include <windows.h>
Guido van Rossumb2fb3641996-09-07 00:47:35 +000074#ifdef MS_WIN16
75/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000076#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000077#define tzname _tzname
78#define daylight _daylight
79#define altzone _altzone
Guido van Rossumb2fb3641996-09-07 00:47:35 +000080#endif /* MS_WIN16 */
Guido van Rossumcac6c721996-09-06 13:34:02 +000081#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000082#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000083
Guido van Rossum3917c221997-04-02 05:35:28 +000084#ifdef MS_WIN32
85/* Win32 has better clock replacement */
86#include <largeint.h>
87#undef HAVE_CLOCK /* We have our own version down below */
88#endif /* MS_WIN32 */
89
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000090#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000091#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000092#endif
93
Guido van Rossumbcc20741998-08-04 22:53:56 +000094#ifdef __BEOS__
95/* For bigtime_t, snooze(). - [cjh] */
96#include <support/SupportDefs.h>
97#include <kernel/OS.h>
Guido van Rossumd3eb5771999-03-09 16:07:23 +000098#ifndef CLOCKS_PER_SEC
99/* C'mon, fix the bloody headers... - [cjh] */
100#define CLOCKS_PER_SEC 1000
101#endif
Guido van Rossumbcc20741998-08-04 22:53:56 +0000102#endif
103
Guido van Rossum234f9421993-06-17 12:35:49 +0000104/* Forward declarations */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000105static int floatsleep Py_PROTO((double));
106static double floattime Py_PROTO(());
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000108/* For Y2K check */
109static PyObject *moddict;
110
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000111#ifdef macintosh
112/* Our own timezone. We have enough information to deduce whether
113** DST is on currently, but unfortunately we cannot put it to good
114** use because we don't know the rules (and that is needed to have
115** localtime() return correct tm_isdst values for times other than
116** the current time. So, we cop out and only tell the user the current
117** timezone.
118*/
119static long timezone;
120
121static void
122initmactimezone()
123{
124 MachineLocation loc;
125 long delta;
126
127 ReadLocation(&loc);
128
129 if (loc.latitude == 0 && loc.longitude == 0 && loc.u.gmtDelta == 0)
130 return;
131
132 delta = loc.u.gmtDelta & 0x00FFFFFF;
133
134 if (delta & 0x00800000)
135 delta |= 0xFF000000;
136
137 timezone = -delta;
138}
139#endif /* macintosh */
140
141
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000142static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143time_time(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000144 PyObject *self;
145 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000147 double secs;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000148 if (!PyArg_NoArgs(args))
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000149 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000150 secs = floattime();
151 if (secs == 0.0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000152 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000153 return NULL;
154 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000155 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000156}
157
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000158static char time_doc[] =
159"time() -> floating point number\n\
160\n\
161Return the current time in seconds since the Epoch.\n\
162Fractions of a second may be present if the system clock provides them.";
163
Guido van Rossumb6775db1994-08-01 11:34:53 +0000164#ifdef HAVE_CLOCK
165
166#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000167#ifdef CLK_TCK
168#define CLOCKS_PER_SEC CLK_TCK
169#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000170#define CLOCKS_PER_SEC 1000000
171#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000172#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000173
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000174static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000175time_clock(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000176 PyObject *self;
177 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000178{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000179 if (!PyArg_NoArgs(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180 return NULL;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000181 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000183#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184
Guido van Rossum3917c221997-04-02 05:35:28 +0000185#ifdef MS_WIN32
186/* Due to Mark Hammond */
187static PyObject *
188time_clock(self, args)
189 PyObject *self;
190 PyObject *args;
191{
192 static LARGE_INTEGER ctrStart;
193 static LARGE_INTEGER divisor = {0,0};
194 LARGE_INTEGER now, diff, rem;
195
196 if (!PyArg_NoArgs(args))
197 return NULL;
198
199 if (LargeIntegerEqualToZero(divisor)) {
200 QueryPerformanceCounter(&ctrStart);
201 if (!QueryPerformanceFrequency(&divisor) ||
202 LargeIntegerEqualToZero(divisor)) {
203 /* Unlikely to happen -
204 this works on all intel machines at least!
205 Revert to clock() */
206 return PyFloat_FromDouble(clock());
207 }
208 }
209 QueryPerformanceCounter(&now);
210 diff = LargeIntegerSubtract(now, ctrStart);
211 diff = LargeIntegerDivide(diff, divisor, &rem);
212 /* XXX - we assume both divide results fit in 32 bits. This is
213 true on Intels. First person who can afford a machine that
214 doesnt deserves to fix it :-)
215 */
216 return PyFloat_FromDouble((double)diff.LowPart +
217 ((double)rem.LowPart / (double)divisor.LowPart));
218}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000219
Guido van Rossum3917c221997-04-02 05:35:28 +0000220#define HAVE_CLOCK /* So it gets included in the methods */
221#endif /* MS_WIN32 */
222
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000223#ifdef HAVE_CLOCK
224static char clock_doc[] =
225"clock() -> floating point number\n\
226\n\
227Return the CPU time or real time since the start of the process or since\n\
228the first call to clock(). This has as much precision as the system records.";
229#endif
230
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000231static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232time_sleep(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000233 PyObject *self;
234 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235{
Guido van Rossum775f4da1993-01-09 17:18:52 +0000236 double secs;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000237 if (!PyArg_Parse(args, "d", &secs))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238 return NULL;
Guido van Rossum8607ae21997-11-03 22:04:46 +0000239 if (floatsleep(secs) != 0)
240 return NULL;
241 Py_INCREF(Py_None);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000242 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243}
244
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000245static char sleep_doc[] =
246"sleep(seconds)\n\
247\n\
248Delay execution for a given number of seconds. The argument may be\n\
249a floating point number for subsecond precision.";
250
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000251static PyObject *
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000252tmtotuple(p)
253 struct tm *p;
254{
255 return Py_BuildValue("(iiiiiiiii)",
256 p->tm_year + 1900,
257 p->tm_mon + 1, /* Want January == 1 */
258 p->tm_mday,
259 p->tm_hour,
260 p->tm_min,
261 p->tm_sec,
262 (p->tm_wday + 6) % 7, /* Want Monday == 0 */
263 p->tm_yday + 1, /* Want January, 1 == 1 */
264 p->tm_isdst);
265}
266
267static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000268time_convert(when, function)
269 time_t when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000270 struct tm * (*function) Py_PROTO((const time_t *));
Guido van Rossum234f9421993-06-17 12:35:49 +0000271{
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000272 struct tm *p;
273 errno = 0;
274 p = function(&when);
275 if (p == NULL) {
276#ifdef EINVAL
Guido van Rossum0b1ff661996-11-02 17:31:22 +0000277 if (errno == 0)
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000278 errno = EINVAL;
279#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000280 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000281 }
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000282 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000283}
284
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000285static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000286time_gmtime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000287 PyObject *self;
288 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000289{
290 double when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000291 if (!PyArg_Parse(args, "d", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000292 return NULL;
293 return time_convert((time_t)when, gmtime);
294}
295
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000296static char gmtime_doc[] =
297"gmtime(seconds) -> tuple\n\
298\n\
299Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a. GMT).";
300
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000301static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000302time_localtime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000303 PyObject *self;
304 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000305{
306 double when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000307 if (!PyArg_Parse(args, "d", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000308 return NULL;
309 return time_convert((time_t)when, localtime);
310}
311
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000312static char localtime_doc[] =
313"localtime(seconds) -> tuple\n\
314Convert seconds since the Epoch to a time tuple expressing local time.";
315
Guido van Rossum9e90a671993-06-24 11:10:19 +0000316static int
317gettmarg(args, p)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000318 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000319 struct tm *p;
320{
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000321 int y;
322 memset((ANY *) p, '\0', sizeof(struct tm));
323
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000324 if (!PyArg_Parse(args, "(iiiiiiiii)",
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000325 &y,
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000326 &p->tm_mon,
327 &p->tm_mday,
328 &p->tm_hour,
329 &p->tm_min,
330 &p->tm_sec,
331 &p->tm_wday,
332 &p->tm_yday,
333 &p->tm_isdst))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000334 return 0;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000335 if (y < 1900) {
336 PyObject *accept = PyDict_GetItemString(moddict,
337 "accept2dyear");
338 if (accept == NULL || !PyInt_Check(accept) ||
339 PyInt_AsLong(accept) == 0) {
340 PyErr_SetString(PyExc_ValueError,
341 "year >= 1900 required");
342 return 0;
343 }
344 if (69 <= y && y <= 99)
345 y += 1900;
346 else if (0 <= y && y <= 68)
347 y += 2000;
348 else {
349 PyErr_SetString(PyExc_ValueError,
350 "year out of range (00-99, 1900-*)");
351 return 0;
352 }
353 }
354 p->tm_year = y - 1900;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000355 p->tm_mon--;
356 p->tm_wday = (p->tm_wday + 1) % 7;
357 p->tm_yday--;
358 return 1;
359}
360
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000361#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000362static PyObject *
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000363time_strftime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000364 PyObject *self;
365 PyObject *args;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000366{
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000367 PyObject *tup;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000368 struct tm buf;
369 const char *fmt;
Guido van Rossumc222ec21999-02-23 00:00:10 +0000370 int fmtlen, buflen;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000371 char *outbuf = 0;
372 int i;
373
Guido van Rossum1f41f841998-04-27 19:04:26 +0000374 memset((ANY *) &buf, '\0', sizeof(buf));
375
Jeremy Hylton7ceab652000-03-14 21:17:16 +0000376 if (!PyArg_ParseTuple(args, "sO:strftime", &fmt, &tup)
377 || !gettmarg(tup, &buf))
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000378 return NULL;
Guido van Rossumc222ec21999-02-23 00:00:10 +0000379 fmtlen = strlen(fmt);
380
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000381 /* I hate these functions that presume you know how big the output
382 * will be ahead of time...
383 */
Guido van Rossumc222ec21999-02-23 00:00:10 +0000384 for (i = 1024; ; i += i) {
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000385 outbuf = malloc(i);
386 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000387 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000388 }
Guido van Rossumc222ec21999-02-23 00:00:10 +0000389 buflen = strftime(outbuf, i, fmt, &buf);
390 if (buflen > 0 || i >= 256 * fmtlen) {
391 /* If the buffer is 256 times as long as the format,
392 it's probably not failing for lack of room!
393 More likely, the format yields an empty result,
394 e.g. an empty format, or %Z when the timezone
395 is unknown. */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000396 PyObject *ret;
Guido van Rossumc222ec21999-02-23 00:00:10 +0000397 ret = PyString_FromStringAndSize(outbuf, buflen);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000398 free(outbuf);
399 return ret;
400 }
401 free(outbuf);
402 }
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000403}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000404
405static char strftime_doc[] =
406"strftime(format, tuple) -> string\n\
407\n\
408Convert a time tuple to a string according to a format specification.\n\
409See the library reference manual for formatting codes.";
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000410#endif /* HAVE_STRFTIME */
411
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000412#ifdef HAVE_STRPTIME
Guido van Rossum0a6363d1999-01-03 13:00:34 +0000413/* extern char *strptime(); /* Enable this if it's not declared in <time.h> */
Guido van Rossumc2068731998-10-07 16:35:25 +0000414
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000415static PyObject *
416time_strptime(self, args)
417 PyObject *self;
418 PyObject *args;
419{
420 struct tm tm;
421 char *fmt = "%a %b %d %H:%M:%S %Y";
422 char *buf;
423 char *s;
424
Jeremy Hylton7ceab652000-03-14 21:17:16 +0000425 if (!PyArg_ParseTuple(args, "s|s:strptime", &buf, &fmt))
426 return NULL;
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{
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000454 PyObject *tup;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000455 struct tm buf;
456 char *p;
Guido van Rossum43713e52000-02-29 13:59:29 +0000457 if (!PyArg_ParseTuple(args, "O:asctime", &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000458 return NULL;
459 if (!gettmarg(tup, &buf))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000460 return NULL;
461 p = asctime(&buf);
462 if (p[24] == '\n')
463 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000464 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000465}
466
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000467static char asctime_doc[] =
468"asctime(tuple) -> string\n\
469\n\
470Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.";
471
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000472static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000473time_ctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000474 PyObject *self;
475 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000476{
477 double dt;
478 time_t tt;
479 char *p;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000480 if (!PyArg_Parse(args, "d", &dt))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000481 return NULL;
Guido van Rossumcac6c721996-09-06 13:34:02 +0000482 tt = (time_t)dt;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000483 p = ctime(&tt);
Guido van Rossum78535701998-03-03 22:19:10 +0000484 if (p == NULL) {
485 PyErr_SetString(PyExc_ValueError, "unconvertible time");
486 return NULL;
487 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000488 if (p[24] == '\n')
489 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000490 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000491}
492
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000493static char ctime_doc[] =
494"ctime(seconds) -> string\n\
495\n\
496Convert a time in seconds since the Epoch to a string in local time.\n\
497This is equivalent to asctime(localtime(seconds)).";
498
Guido van Rossum60cd8131998-03-06 17:16:21 +0000499#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000500static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000501time_mktime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000502 PyObject *self;
503 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000504{
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000505 PyObject *tup;
Guido van Rossum234f9421993-06-17 12:35:49 +0000506 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000507 time_t tt;
Guido van Rossum43713e52000-02-29 13:59:29 +0000508 if (!PyArg_ParseTuple(args, "O:mktime", &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000509 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000510 tt = time(&tt);
511 buf = *localtime(&tt);
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000512 if (!gettmarg(tup, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000513 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000514 tt = mktime(&buf);
515 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000516 PyErr_SetString(PyExc_OverflowError,
517 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000518 return NULL;
519 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000520 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000521}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000522
523static char mktime_doc[] =
524"mktime(tuple) -> floating point number\n\
525\n\
526Convert a time tuple in local time to seconds since the Epoch.";
Guido van Rossum60cd8131998-03-06 17:16:21 +0000527#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000528
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000529static PyMethodDef time_methods[] = {
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000530 {"time", time_time, 0, time_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000531#ifdef HAVE_CLOCK
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000532 {"clock", time_clock, 0, clock_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000533#endif
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000534 {"sleep", time_sleep, 0, sleep_doc},
535 {"gmtime", time_gmtime, 0, gmtime_doc},
536 {"localtime", time_localtime, 0, localtime_doc},
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000537 {"asctime", time_asctime, 1, asctime_doc},
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000538 {"ctime", time_ctime, 0, ctime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000539#ifdef HAVE_MKTIME
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000540 {"mktime", time_mktime, 1, mktime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000541#endif
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000542#ifdef HAVE_STRFTIME
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000543 {"strftime", time_strftime, 1, strftime_doc},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000544#endif
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000545#ifdef HAVE_STRPTIME
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000546 {"strptime", time_strptime, 1, strptime_doc},
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000547#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548 {NULL, NULL} /* sentinel */
549};
550
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000551static void
552ins(d, name, v)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000553 PyObject *d;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000554 char *name;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000555 PyObject *v;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000556{
557 if (v == NULL)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000558 Py_FatalError("Can't initialize time module -- NULL value");
559 if (PyDict_SetItemString(d, name, v) != 0)
560 Py_FatalError(
Guido van Rossum52174571996-12-09 18:38:52 +0000561 "Can't initialize time module -- PyDict_SetItemString failed");
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000562 Py_DECREF(v);
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000563}
564
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000565static char module_doc[] =
566"This module provides various functions to manipulate time values.\n\
567\n\
568There are two standard representations of time. One is the number\n\
569of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
570or a floating point number (to represent fractions of seconds).\n\
571The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
572The actual value can be retrieved by calling gmtime(0).\n\
573\n\
574The other representation is a tuple of 9 integers giving local time.\n\
575The tuple items are:\n\
576 year (four digits, e.g. 1998)\n\
577 month (1-12)\n\
578 day (1-31)\n\
579 hours (0-23)\n\
580 minutes (0-59)\n\
Guido van Rossum360eb9f1999-02-22 16:19:52 +0000581 seconds (0-59)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000582 weekday (0-6, Monday is 0)\n\
583 Julian day (day in the year, 1-366)\n\
584 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
585If the DST flag is 0, the time is given in the regular time zone;\n\
586if it is 1, the time is given in the DST time zone;\n\
587if it is -1, mktime() should guess based on the date and time.\n\
588\n\
589Variables:\n\
590\n\
591timezone -- difference in seconds between UTC and local standard time\n\
592altzone -- difference in seconds between UTC and local DST time\n\
593daylight -- whether local time should reflect DST\n\
594tzname -- tuple of (standard time zone name, DST time zone name)\n\
595\n\
596Functions:\n\
597\n\
598time() -- return current time in seconds since the Epoch as a float\n\
599clock() -- return CPU time since process start as a float\n\
600sleep() -- delay for a number of seconds given as a float\n\
601gmtime() -- convert seconds since Epoch to UTC tuple\n\
602localtime() -- convert seconds since Epoch to local time tuple\n\
603asctime() -- convert time tuple to string\n\
604ctime() -- convert time in seconds to string\n\
605mktime() -- convert local time tuple to seconds since Epoch\n\
606strftime() -- convert time tuple to string according to format specification\n\
607strptime() -- parse string to time tuple according to format specification\n\
608";
609
610
Guido van Rossum3886bb61998-12-04 18:50:17 +0000611DL_EXPORT(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000612inittime()
613{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000614 PyObject *m, *d;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000615 char *p;
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000616 m = Py_InitModule3("time", time_methods, module_doc);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000617 d = PyModule_GetDict(m);
Guido van Rossumc2068731998-10-07 16:35:25 +0000618 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
619 p = getenv("PYTHONY2K");
620 ins(d, "accept2dyear", PyInt_FromLong((long) (!p || !*p)));
621 /* Squirrel away the module's dictionary for the y2k check */
622 Py_INCREF(d);
623 moddict = d;
Guido van Rossumea424e11999-04-23 20:59:05 +0000624#if defined(HAVE_TZNAME) && !defined(__GLIBC__)
Guido van Rossum234f9421993-06-17 12:35:49 +0000625 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000626#ifdef PYOS_OS2
627 ins(d, "timezone", PyInt_FromLong((long)_timezone));
628#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000629 ins(d, "timezone", PyInt_FromLong((long)timezone));
Guido van Rossum26452411998-09-28 22:07:11 +0000630#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000631#ifdef HAVE_ALTZONE
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000632 ins(d, "altzone", PyInt_FromLong((long)altzone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000633#else
Guido van Rossum26452411998-09-28 22:07:11 +0000634#ifdef PYOS_OS2
635 ins(d, "altzone", PyInt_FromLong((long)_timezone-3600));
636#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000637 ins(d, "altzone", PyInt_FromLong((long)timezone-3600));
Guido van Rossum26452411998-09-28 22:07:11 +0000638#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000639#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000640 ins(d, "daylight", PyInt_FromLong((long)daylight));
641 ins(d, "tzname", Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossumea424e11999-04-23 20:59:05 +0000642#else /* !HAVE_TZNAME || __GLIBC__ */
Guido van Rossum0ffdd051999-04-05 21:54:14 +0000643#ifdef HAVE_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000644 {
645#define YEAR ((time_t)((365 * 24 + 6) * 3600))
646 time_t t;
647 struct tm *p;
Guido van Rossum57731601999-03-29 19:12:04 +0000648 long janzone, julyzone;
649 char janname[10], julyname[10];
Guido van Rossum234f9421993-06-17 12:35:49 +0000650 t = (time((time_t *)0) / YEAR) * YEAR;
651 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000652 janzone = -p->tm_gmtoff;
653 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
654 janname[9] = '\0';
Guido van Rossum234f9421993-06-17 12:35:49 +0000655 t += YEAR/2;
656 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000657 julyzone = -p->tm_gmtoff;
658 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
659 julyname[9] = '\0';
660
661 if( janzone < julyzone ) {
662 /* DST is reversed in the southern hemisphere */
663 ins(d, "timezone", PyInt_FromLong(julyzone));
664 ins(d, "altzone", PyInt_FromLong(janzone));
665 ins(d, "daylight",
666 PyInt_FromLong((long)(janzone != julyzone)));
667 ins(d, "tzname",
668 Py_BuildValue("(zz)", julyname, janname));
669 } else {
670 ins(d, "timezone", PyInt_FromLong(janzone));
671 ins(d, "altzone", PyInt_FromLong(julyzone));
672 ins(d, "daylight",
673 PyInt_FromLong((long)(janzone != julyzone)));
674 ins(d, "tzname",
675 Py_BuildValue("(zz)", janname, julyname));
676 }
Guido van Rossum234f9421993-06-17 12:35:49 +0000677 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000678#else
679#ifdef macintosh
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000680 /* The only thing we can obtain is the current timezone
681 ** (and whether dst is currently _active_, but that is not what
682 ** we're looking for:-( )
683 */
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000684 initmactimezone();
685 ins(d, "timezone", PyInt_FromLong(timezone));
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000686 ins(d, "altzone", PyInt_FromLong(timezone));
687 ins(d, "daylight", PyInt_FromLong((long)0));
688 ins(d, "tzname", Py_BuildValue("(zz)", "", ""));
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000689#endif /* macintosh */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000690#endif /* HAVE_TM_ZONE */
Guido van Rossumea424e11999-04-23 20:59:05 +0000691#endif /* !HAVE_TZNAME || __GLIBC__ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000692 if (PyErr_Occurred())
693 Py_FatalError("Can't initialize time module");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000694}
695
696
Guido van Rossumb6775db1994-08-01 11:34:53 +0000697/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698
Guido van Rossumb6775db1994-08-01 11:34:53 +0000699static double
700floattime()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000701{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000702 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000703 (1) gettimeofday() -- resolution in microseconds
704 (2) ftime() -- resolution in milliseconds
705 (3) time() -- resolution in seconds
706 In all cases the return value is a float in seconds.
707 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
708 fail, so we fall back on ftime() or time().
709 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000710#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000711 {
712 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000713#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000714 if (gettimeofday(&t) == 0)
715 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000716#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000717 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
718 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000719#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000720 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000721#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000722 {
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000723#if defined(HAVE_FTIME)
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000724 struct timeb t;
725 ftime(&t);
726 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000727#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000728 time_t secs;
729 time(&secs);
730 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000731#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000732 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000733}
734
Guido van Rossumb6775db1994-08-01 11:34:53 +0000735
736/* Implement floatsleep() for various platforms.
737 When interrupted (or when another error occurs), return -1 and
738 set an exception; else return 0. */
739
740static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000741#ifdef MPW
742floatsleep(double secs)
743#else
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000744 floatsleep(secs)
Guido van Rossum775f4da1993-01-09 17:18:52 +0000745 double secs;
Guido van Rossuma320fd31995-03-09 12:14:15 +0000746#endif /* MPW */
Guido van Rossum426035c1991-02-19 12:27:35 +0000747{
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000748/* XXX Should test for MS_WIN32 first! */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000749#if defined(HAVE_SELECT) && !defined(__BEOS__)
Guido van Rossum426035c1991-02-19 12:27:35 +0000750 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000751 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000752 frac = fmod(secs, 1.0);
753 secs = floor(secs);
754 t.tv_sec = (long)secs;
755 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000756 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000757 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000758 Py_BLOCK_THREADS
Guido van Rossum09cbb011999-11-08 15:32:27 +0000759#ifdef EINTR
Guido van Rossuma5456d51999-08-19 14:40:27 +0000760 if (errno != EINTR) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000761#else
762 if (1) {
763#endif
Guido van Rossuma5456d51999-08-19 14:40:27 +0000764 PyErr_SetFromErrno(PyExc_IOError);
765 return -1;
766 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000767 }
Guido van Rossum8607ae21997-11-03 22:04:46 +0000768 Py_END_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000769#else /* !HAVE_SELECT || __BEOS__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000770#ifdef macintosh
771#define MacTicks (* (long *)0x16A)
772 long deadline;
773 deadline = MacTicks + (long)(secs * 60.0);
774 while (MacTicks < deadline) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000775 /* XXX Should call some yielding function here */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000776 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000777 return -1;
778 }
779#else /* !macintosh */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000780#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +0000781 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000782 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbceeac81996-05-23 22:53:47 +0000783 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000784 Py_END_ALLOW_THREADS
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000785#else /* !__WATCOMC__ || __QNX__ */
Guido van Rossume22e6441993-07-09 10:51:31 +0000786#ifdef MSDOS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000787 struct timeb t1, t2;
788 double frac;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000789 extern double fmod Py_PROTO((double, double));
790 extern double floor Py_PROTO((double));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000791 if (secs <= 0.0)
792 return;
793 frac = fmod(secs, 1.0);
794 secs = floor(secs);
795 ftime(&t1);
796 t2.time = t1.time + (int)secs;
797 t2.millitm = t1.millitm + (int)(frac*1000.0);
798 while (t2.millitm >= 1000) {
799 t2.time++;
800 t2.millitm -= 1000;
801 }
802 for (;;) {
803#ifdef QUICKWIN
Guido van Rossum8607ae21997-11-03 22:04:46 +0000804 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000805 _wyield();
Guido van Rossum8607ae21997-11-03 22:04:46 +0000806 Py_END_ALLOW_THREADS
Guido van Rossum80c9d881991-04-16 08:47:51 +0000807#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000808 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000809 return -1;
810 ftime(&t1);
811 if (t1.time > t2.time ||
812 t1.time == t2.time && t1.millitm >= t2.millitm)
813 break;
814 }
815#else /* !MSDOS */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000816#ifdef MS_WIN32
Guido van Rossumb6775db1994-08-01 11:34:53 +0000817 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000818 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000819 Sleep((int)(secs*1000));
Guido van Rossum8607ae21997-11-03 22:04:46 +0000820 Py_END_ALLOW_THREADS
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000821#else /* !MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000822#ifdef PYOS_OS2
823 /* This Sleep *IS* Interruptable by Exceptions */
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000824 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000825 if (DosSleep(secs * 1000) != NO_ERROR) {
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000826 Py_BLOCK_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000827 PyErr_SetFromErrno(PyExc_IOError);
828 return -1;
829 }
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000830 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000831#else /* !PYOS_OS2 */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000832#ifdef __BEOS__
833 /* This sleep *CAN BE* interrupted. */
834 {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000835 if( secs <= 0.0 ) {
836 return;
837 }
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000838
Guido van Rossumbcc20741998-08-04 22:53:56 +0000839 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000840 /* BeOS snooze() is in microseconds... */
841 if( snooze( (bigtime_t)( secs * 1000.0 * 1000.0 ) ) == B_INTERRUPTED ) {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000842 Py_BLOCK_THREADS
843 PyErr_SetFromErrno( PyExc_IOError );
844 return -1;
845 }
846 Py_END_ALLOW_THREADS
847 }
848#else /* !__BEOS__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000849 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000850 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000851 sleep((int)secs);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000852 Py_END_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000853#endif /* !__BEOS__ */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000854#endif /* !PYOS_OS2 */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000855#endif /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000856#endif /* !MSDOS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000857#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000858#endif /* !macintosh */
859#endif /* !HAVE_SELECT */
860 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000861}