blob: b9f0c49a05824bf94485da4253af476c649432e0 [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 Rossum99d90c01996-08-08 19:17:45 +000036#ifdef HAVE_SELECT
37#include "mymath.h"
38#endif
39
Guido van Rossum6d946f91992-08-14 13:49:30 +000040#ifdef macintosh
Guido van Rossumb6775db1994-08-01 11:34:53 +000041#include <time.h>
42#else
43#include <sys/types.h>
Guido van Rossum6d946f91992-08-14 13:49:30 +000044#endif
45
Guido van Rossumb6775db1994-08-01 11:34:53 +000046#ifdef QUICKWIN
47#include <io.h>
48#endif
49
50#ifdef HAVE_UNISTD_H
Guido van Rossum2762f251992-03-27 17:22:13 +000051#include <unistd.h>
52#endif
53
Guido van Rossumb6775db1994-08-01 11:34:53 +000054#ifdef HAVE_SELECT
55#include "myselect.h"
56#else
57#include "mytime.h"
58#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059
Guido van Rossumb6775db1994-08-01 11:34:53 +000060#ifdef HAVE_FTIME
61#include <sys/timeb.h>
Guido van Rossum52174571996-12-09 18:38:52 +000062#ifndef MS_WINDOWS
Guido van Rossum1bb126f1996-12-06 20:17:44 +000063extern int ftime();
Guido van Rossum52174571996-12-09 18:38:52 +000064#endif /* MS_WINDOWS */
65#endif /* HAVE_FTIME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066
Guido van Rossumbceeac81996-05-23 22:53:47 +000067#ifdef __WATCOMC__
68#include <i86.h>
69#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000070#ifdef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +000071#include <windows.h>
Guido van Rossumb2fb3641996-09-07 00:47:35 +000072#ifdef MS_WIN16
73/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000074#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000075#define tzname _tzname
76#define daylight _daylight
77#define altzone _altzone
Guido van Rossumb2fb3641996-09-07 00:47:35 +000078#endif /* MS_WIN16 */
Guido van Rossumcac6c721996-09-06 13:34:02 +000079#endif /* MS_WINDOWS */
80#endif /* !__WATCOMC__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000081
82/* Forward declarations */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000083static int floatsleep Py_PROTO((double));
84static double floattime Py_PROTO(());
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000086static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087time_time(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000088 PyObject *self;
89 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090{
Guido van Rossumb6775db1994-08-01 11:34:53 +000091 double secs;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000092 if (!PyArg_NoArgs(args))
Guido van Rossuma2b7f401993-01-04 09:09:59 +000093 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +000094 secs = floattime();
95 if (secs == 0.0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000096 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma2b7f401993-01-04 09:09:59 +000097 return NULL;
98 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000099 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000100}
101
102#ifdef HAVE_CLOCK
103
104#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000105#ifdef CLK_TCK
106#define CLOCKS_PER_SEC CLK_TCK
107#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000108#define CLOCKS_PER_SEC 1000000
109#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000110#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000111
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000112static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000113time_clock(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000114 PyObject *self;
115 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000116{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000117 if (!PyArg_NoArgs(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118 return NULL;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000119 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000121#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000123static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124time_sleep(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000125 PyObject *self;
126 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127{
Guido van Rossum775f4da1993-01-09 17:18:52 +0000128 double secs;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000129 if (!PyArg_Parse(args, "d", &secs))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000130 return NULL;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000131 Py_BEGIN_ALLOW_THREADS
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000132 if (floatsleep(secs) != 0) {
133 Py_BLOCK_THREADS
134 return NULL;
135 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000136 Py_END_ALLOW_THREADS
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000137 Py_INCREF(Py_None);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000138 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139}
140
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000141static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000142time_convert(when, function)
143 time_t when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000144 struct tm * (*function) Py_PROTO((const time_t *));
Guido van Rossum234f9421993-06-17 12:35:49 +0000145{
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000146 struct tm *p;
147 errno = 0;
148 p = function(&when);
149 if (p == NULL) {
150#ifdef EINVAL
Guido van Rossum0b1ff661996-11-02 17:31:22 +0000151 if (errno == 0)
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000152 errno = EINVAL;
153#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000154 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000155 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000156 return Py_BuildValue("(iiiiiiiii)",
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000157 p->tm_year + 1900,
158 p->tm_mon + 1, /* Want January == 1 */
159 p->tm_mday,
160 p->tm_hour,
161 p->tm_min,
162 p->tm_sec,
163 (p->tm_wday + 6) % 7, /* Want Monday == 0 */
164 p->tm_yday + 1, /* Want January, 1 == 1 */
165 p->tm_isdst);
Guido van Rossum234f9421993-06-17 12:35:49 +0000166}
167
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000168static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000169time_gmtime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000170 PyObject *self;
171 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000172{
173 double when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000174 if (!PyArg_Parse(args, "d", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000175 return NULL;
176 return time_convert((time_t)when, gmtime);
177}
178
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000179static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000180time_localtime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000181 PyObject *self;
182 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000183{
184 double when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000185 if (!PyArg_Parse(args, "d", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000186 return NULL;
187 return time_convert((time_t)when, localtime);
188}
189
Guido van Rossum9e90a671993-06-24 11:10:19 +0000190static int
191gettmarg(args, p)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000192 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000193 struct tm *p;
194{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000195 if (!PyArg_Parse(args, "(iiiiiiiii)",
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000196 &p->tm_year,
197 &p->tm_mon,
198 &p->tm_mday,
199 &p->tm_hour,
200 &p->tm_min,
201 &p->tm_sec,
202 &p->tm_wday,
203 &p->tm_yday,
204 &p->tm_isdst))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000205 return 0;
206 if (p->tm_year >= 1900)
207 p->tm_year -= 1900;
208 p->tm_mon--;
209 p->tm_wday = (p->tm_wday + 1) % 7;
210 p->tm_yday--;
211 return 1;
212}
213
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000214#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000215static PyObject *
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000216time_strftime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000217 PyObject *self;
218 PyObject *args;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000219{
220 struct tm buf;
221 const char *fmt;
222 char *outbuf = 0;
223 int i;
224
225 if (!PyArg_ParseTuple(args, "s(iiiiiiiii)",
226 &fmt,
227 &(buf.tm_year),
228 &(buf.tm_mon),
229 &(buf.tm_mday),
230 &(buf.tm_hour),
231 &(buf.tm_min),
232 &(buf.tm_sec),
233 &(buf.tm_wday),
234 &(buf.tm_yday),
235 &(buf.tm_isdst)))
236 return NULL;
237 if (buf.tm_year >= 1900)
238 buf.tm_year -= 1900;
239 buf.tm_mon--;
240 buf.tm_wday = (buf.tm_wday + 1) % 7;
241 buf.tm_yday--;
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000242 /* I hate these functions that presume you know how big the output
243 * will be ahead of time...
244 */
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000245 for (i = 1024 ; i < 8192 ; i += 1024) {
246 outbuf = malloc(i);
247 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000248 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000249 }
250 if (strftime(outbuf, i-1, fmt, &buf) != 0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000251 PyObject *ret;
252 ret = PyString_FromString(outbuf);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000253 free(outbuf);
254 return ret;
255 }
256 free(outbuf);
257 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000258 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000259}
260#endif /* HAVE_STRFTIME */
261
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000262static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000263time_asctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000264 PyObject *self;
265 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000266{
267 struct tm buf;
268 char *p;
269 if (!gettmarg(args, &buf))
270 return NULL;
271 p = asctime(&buf);
272 if (p[24] == '\n')
273 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000274 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000275}
276
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000277static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000278time_ctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000279 PyObject *self;
280 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000281{
282 double dt;
283 time_t tt;
284 char *p;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000285 if (!PyArg_Parse(args, "d", &dt))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000286 return NULL;
Guido van Rossumcac6c721996-09-06 13:34:02 +0000287 tt = (time_t)dt;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000288 p = ctime(&tt);
289 if (p[24] == '\n')
290 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000291 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000292}
293
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000294static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000295time_mktime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000296 PyObject *self;
297 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000298{
299 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000300 time_t tt;
301 tt = time(&tt);
302 buf = *localtime(&tt);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000303 if (!gettmarg(args, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000304 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000305 tt = mktime(&buf);
306 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000307 PyErr_SetString(PyExc_OverflowError,
308 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000309 return NULL;
310 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000311 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000312}
313
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000314static PyMethodDef time_methods[] = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 {"time", time_time},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000316#ifdef HAVE_CLOCK
317 {"clock", time_clock},
318#endif
319 {"sleep", time_sleep},
Guido van Rossum234f9421993-06-17 12:35:49 +0000320 {"gmtime", time_gmtime},
321 {"localtime", time_localtime},
Guido van Rossum9e90a671993-06-24 11:10:19 +0000322 {"asctime", time_asctime},
323 {"ctime", time_ctime},
Guido van Rossum234f9421993-06-17 12:35:49 +0000324 {"mktime", time_mktime},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000325#ifdef HAVE_STRFTIME
Guido van Rossum5416e201996-02-13 00:14:09 +0000326 {"strftime", time_strftime, 1},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000327#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328 {NULL, NULL} /* sentinel */
329};
330
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000331static void
332ins(d, name, v)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000333 PyObject *d;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000334 char *name;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000335 PyObject *v;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000336{
337 if (v == NULL)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000338 Py_FatalError("Can't initialize time module -- NULL value");
339 if (PyDict_SetItemString(d, name, v) != 0)
340 Py_FatalError(
Guido van Rossum52174571996-12-09 18:38:52 +0000341 "Can't initialize time module -- PyDict_SetItemString failed");
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000342 Py_DECREF(v);
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000343}
344
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345void
346inittime()
347{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000348 PyObject *m, *d;
349 m = Py_InitModule("time", time_methods);
350 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000351#ifdef HAVE_TZNAME
Guido van Rossum234f9421993-06-17 12:35:49 +0000352 tzset();
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000353 ins(d, "timezone", PyInt_FromLong((long)timezone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000354#ifdef HAVE_ALTZONE
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000355 ins(d, "altzone", PyInt_FromLong((long)altzone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000356#else
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000357 ins(d, "altzone", PyInt_FromLong((long)timezone-3600));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000358#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000359 ins(d, "daylight", PyInt_FromLong((long)daylight));
360 ins(d, "tzname", Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000361#else /* !HAVE_TZNAME */
362#if HAVE_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000363 {
364#define YEAR ((time_t)((365 * 24 + 6) * 3600))
365 time_t t;
366 struct tm *p;
367 long winterzone, summerzone;
368 char wintername[10], summername[10];
Guido van Rossumb6775db1994-08-01 11:34:53 +0000369 /* XXX This won't work on the southern hemisphere.
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000370 XXX Anybody got a better idea? */
Guido van Rossum234f9421993-06-17 12:35:49 +0000371 t = (time((time_t *)0) / YEAR) * YEAR;
372 p = localtime(&t);
373 winterzone = -p->tm_gmtoff;
374 strncpy(wintername, p->tm_zone ? p->tm_zone : " ", 9);
375 wintername[9] = '\0';
376 t += YEAR/2;
377 p = localtime(&t);
378 summerzone = -p->tm_gmtoff;
379 strncpy(summername, p->tm_zone ? p->tm_zone : " ", 9);
380 summername[9] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000381 ins(d, "timezone", PyInt_FromLong(winterzone));
382 ins(d, "altzone", PyInt_FromLong(summerzone));
383 ins(d, "daylight",
384 PyInt_FromLong((long)(winterzone != summerzone)));
385 ins(d, "tzname",
386 Py_BuildValue("(zz)", wintername, summername));
Guido van Rossum234f9421993-06-17 12:35:49 +0000387 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000388#endif /* HAVE_TM_ZONE */
389#endif /* !HAVE_TZNAME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000390 if (PyErr_Occurred())
391 Py_FatalError("Can't initialize time module");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392}
393
394
Guido van Rossumb6775db1994-08-01 11:34:53 +0000395/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396
Guido van Rossumb6775db1994-08-01 11:34:53 +0000397static double
398floattime()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000399{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000400 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000401 (1) gettimeofday() -- resolution in microseconds
402 (2) ftime() -- resolution in milliseconds
403 (3) time() -- resolution in seconds
404 In all cases the return value is a float in seconds.
405 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
406 fail, so we fall back on ftime() or time().
407 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000408#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000409 {
410 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000411#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000412 if (gettimeofday(&t) == 0)
413 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000414#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000415 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
416 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000417#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000418 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000419#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000420 {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000421#ifdef HAVE_FTIME
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000422 struct timeb t;
423 ftime(&t);
424 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000425#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000426 time_t secs;
427 time(&secs);
428 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000429#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000430 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000431}
432
Guido van Rossumb6775db1994-08-01 11:34:53 +0000433
434/* Implement floatsleep() for various platforms.
435 When interrupted (or when another error occurs), return -1 and
436 set an exception; else return 0. */
437
438static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000439#ifdef MPW
440floatsleep(double secs)
441#else
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000442 floatsleep(secs)
Guido van Rossum775f4da1993-01-09 17:18:52 +0000443 double secs;
Guido van Rossuma320fd31995-03-09 12:14:15 +0000444#endif /* MPW */
Guido van Rossum426035c1991-02-19 12:27:35 +0000445{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000446#ifdef HAVE_SELECT
Guido van Rossum426035c1991-02-19 12:27:35 +0000447 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000448 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000449 frac = fmod(secs, 1.0);
450 secs = floor(secs);
451 t.tv_sec = (long)secs;
452 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000453 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000454 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000455 return -1;
456 }
457#else /* !HAVE_SELECT */
458#ifdef macintosh
459#define MacTicks (* (long *)0x16A)
460 long deadline;
461 deadline = MacTicks + (long)(secs * 60.0);
462 while (MacTicks < deadline) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000463 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000464 return -1;
465 }
466#else /* !macintosh */
Guido van Rossumbceeac81996-05-23 22:53:47 +0000467#ifdef __WATCOMC__
468 /* XXX Can't interrupt this sleep */
469 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
470#else /* !__WATCOMC__ */
Guido van Rossume22e6441993-07-09 10:51:31 +0000471#ifdef MSDOS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000472 struct timeb t1, t2;
473 double frac;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000474 extern double fmod Py_PROTO((double, double));
475 extern double floor Py_PROTO((double));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000476 if (secs <= 0.0)
477 return;
478 frac = fmod(secs, 1.0);
479 secs = floor(secs);
480 ftime(&t1);
481 t2.time = t1.time + (int)secs;
482 t2.millitm = t1.millitm + (int)(frac*1000.0);
483 while (t2.millitm >= 1000) {
484 t2.time++;
485 t2.millitm -= 1000;
486 }
487 for (;;) {
488#ifdef QUICKWIN
489 _wyield();
Guido van Rossum80c9d881991-04-16 08:47:51 +0000490#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000491 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000492 return -1;
493 ftime(&t1);
494 if (t1.time > t2.time ||
495 t1.time == t2.time && t1.millitm >= t2.millitm)
496 break;
497 }
498#else /* !MSDOS */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000499#ifdef MS_WIN32
Guido van Rossumb6775db1994-08-01 11:34:53 +0000500 /* XXX Can't interrupt this sleep */
501 Sleep((int)(secs*1000));
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000502#else /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000503 /* XXX Can't interrupt this sleep */
504 sleep((int)secs);
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000505#endif /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000506#endif /* !MSDOS */
Guido van Rossumbceeac81996-05-23 22:53:47 +0000507#endif /* !__WATCOMC__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000508#endif /* !macintosh */
509#endif /* !HAVE_SELECT */
510 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000511}