blob: 1f5593366b306d4638bed87bb3c516dac0190339 [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 Rossuma78bfe11997-02-14 16:35:10 +0000245 for (i = 1024 ; i <= 8192 ; i += 1024) {
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000246 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 }
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000258 PyErr_SetString(PyExc_ValueError,
259 "bad strftime format or result too big");
260 return NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000261}
262#endif /* HAVE_STRFTIME */
263
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000264static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000265time_asctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000266 PyObject *self;
267 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000268{
269 struct tm buf;
270 char *p;
271 if (!gettmarg(args, &buf))
272 return NULL;
273 p = asctime(&buf);
274 if (p[24] == '\n')
275 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000276 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000277}
278
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000279static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000280time_ctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000281 PyObject *self;
282 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000283{
284 double dt;
285 time_t tt;
286 char *p;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000287 if (!PyArg_Parse(args, "d", &dt))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000288 return NULL;
Guido van Rossumcac6c721996-09-06 13:34:02 +0000289 tt = (time_t)dt;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000290 p = ctime(&tt);
291 if (p[24] == '\n')
292 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000293 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000294}
295
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000296static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000297time_mktime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000298 PyObject *self;
299 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000300{
301 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000302 time_t tt;
303 tt = time(&tt);
304 buf = *localtime(&tt);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000305 if (!gettmarg(args, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000306 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000307 tt = mktime(&buf);
308 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000309 PyErr_SetString(PyExc_OverflowError,
310 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000311 return NULL;
312 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000313 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000314}
315
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000316static PyMethodDef time_methods[] = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317 {"time", time_time},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000318#ifdef HAVE_CLOCK
319 {"clock", time_clock},
320#endif
321 {"sleep", time_sleep},
Guido van Rossum234f9421993-06-17 12:35:49 +0000322 {"gmtime", time_gmtime},
323 {"localtime", time_localtime},
Guido van Rossum9e90a671993-06-24 11:10:19 +0000324 {"asctime", time_asctime},
325 {"ctime", time_ctime},
Guido van Rossum234f9421993-06-17 12:35:49 +0000326 {"mktime", time_mktime},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000327#ifdef HAVE_STRFTIME
Guido van Rossum5416e201996-02-13 00:14:09 +0000328 {"strftime", time_strftime, 1},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000329#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330 {NULL, NULL} /* sentinel */
331};
332
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000333static void
334ins(d, name, v)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000335 PyObject *d;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000336 char *name;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000337 PyObject *v;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000338{
339 if (v == NULL)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000340 Py_FatalError("Can't initialize time module -- NULL value");
341 if (PyDict_SetItemString(d, name, v) != 0)
342 Py_FatalError(
Guido van Rossum52174571996-12-09 18:38:52 +0000343 "Can't initialize time module -- PyDict_SetItemString failed");
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000344 Py_DECREF(v);
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000345}
346
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347void
348inittime()
349{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000350 PyObject *m, *d;
351 m = Py_InitModule("time", time_methods);
352 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000353#ifdef HAVE_TZNAME
Guido van Rossum234f9421993-06-17 12:35:49 +0000354 tzset();
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000355 ins(d, "timezone", PyInt_FromLong((long)timezone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000356#ifdef HAVE_ALTZONE
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000357 ins(d, "altzone", PyInt_FromLong((long)altzone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000358#else
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000359 ins(d, "altzone", PyInt_FromLong((long)timezone-3600));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000360#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000361 ins(d, "daylight", PyInt_FromLong((long)daylight));
362 ins(d, "tzname", Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000363#else /* !HAVE_TZNAME */
364#if HAVE_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000365 {
366#define YEAR ((time_t)((365 * 24 + 6) * 3600))
367 time_t t;
368 struct tm *p;
369 long winterzone, summerzone;
370 char wintername[10], summername[10];
Guido van Rossumb6775db1994-08-01 11:34:53 +0000371 /* XXX This won't work on the southern hemisphere.
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000372 XXX Anybody got a better idea? */
Guido van Rossum234f9421993-06-17 12:35:49 +0000373 t = (time((time_t *)0) / YEAR) * YEAR;
374 p = localtime(&t);
375 winterzone = -p->tm_gmtoff;
376 strncpy(wintername, p->tm_zone ? p->tm_zone : " ", 9);
377 wintername[9] = '\0';
378 t += YEAR/2;
379 p = localtime(&t);
380 summerzone = -p->tm_gmtoff;
381 strncpy(summername, p->tm_zone ? p->tm_zone : " ", 9);
382 summername[9] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000383 ins(d, "timezone", PyInt_FromLong(winterzone));
384 ins(d, "altzone", PyInt_FromLong(summerzone));
385 ins(d, "daylight",
386 PyInt_FromLong((long)(winterzone != summerzone)));
387 ins(d, "tzname",
388 Py_BuildValue("(zz)", wintername, summername));
Guido van Rossum234f9421993-06-17 12:35:49 +0000389 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000390#endif /* HAVE_TM_ZONE */
391#endif /* !HAVE_TZNAME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000392 if (PyErr_Occurred())
393 Py_FatalError("Can't initialize time module");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394}
395
396
Guido van Rossumb6775db1994-08-01 11:34:53 +0000397/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398
Guido van Rossumb6775db1994-08-01 11:34:53 +0000399static double
400floattime()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000402 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000403 (1) gettimeofday() -- resolution in microseconds
404 (2) ftime() -- resolution in milliseconds
405 (3) time() -- resolution in seconds
406 In all cases the return value is a float in seconds.
407 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
408 fail, so we fall back on ftime() or time().
409 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000410#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000411 {
412 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000413#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000414 if (gettimeofday(&t) == 0)
415 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000416#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000417 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
418 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000419#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000420 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000421#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000422 {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000423#ifdef HAVE_FTIME
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000424 struct timeb t;
425 ftime(&t);
426 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000427#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000428 time_t secs;
429 time(&secs);
430 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000431#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000432 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000433}
434
Guido van Rossumb6775db1994-08-01 11:34:53 +0000435
436/* Implement floatsleep() for various platforms.
437 When interrupted (or when another error occurs), return -1 and
438 set an exception; else return 0. */
439
440static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000441#ifdef MPW
442floatsleep(double secs)
443#else
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000444 floatsleep(secs)
Guido van Rossum775f4da1993-01-09 17:18:52 +0000445 double secs;
Guido van Rossuma320fd31995-03-09 12:14:15 +0000446#endif /* MPW */
Guido van Rossum426035c1991-02-19 12:27:35 +0000447{
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000448/* XXX Should test for MS_WIN32 first! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000449#ifdef HAVE_SELECT
Guido van Rossum426035c1991-02-19 12:27:35 +0000450 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000451 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000452 frac = fmod(secs, 1.0);
453 secs = floor(secs);
454 t.tv_sec = (long)secs;
455 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000456 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000457 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000458 return -1;
459 }
460#else /* !HAVE_SELECT */
461#ifdef macintosh
462#define MacTicks (* (long *)0x16A)
463 long deadline;
464 deadline = MacTicks + (long)(secs * 60.0);
465 while (MacTicks < deadline) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000466 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000467 return -1;
468 }
469#else /* !macintosh */
Guido van Rossumbceeac81996-05-23 22:53:47 +0000470#ifdef __WATCOMC__
471 /* XXX Can't interrupt this sleep */
472 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
473#else /* !__WATCOMC__ */
Guido van Rossume22e6441993-07-09 10:51:31 +0000474#ifdef MSDOS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000475 struct timeb t1, t2;
476 double frac;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000477 extern double fmod Py_PROTO((double, double));
478 extern double floor Py_PROTO((double));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000479 if (secs <= 0.0)
480 return;
481 frac = fmod(secs, 1.0);
482 secs = floor(secs);
483 ftime(&t1);
484 t2.time = t1.time + (int)secs;
485 t2.millitm = t1.millitm + (int)(frac*1000.0);
486 while (t2.millitm >= 1000) {
487 t2.time++;
488 t2.millitm -= 1000;
489 }
490 for (;;) {
491#ifdef QUICKWIN
492 _wyield();
Guido van Rossum80c9d881991-04-16 08:47:51 +0000493#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000494 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000495 return -1;
496 ftime(&t1);
497 if (t1.time > t2.time ||
498 t1.time == t2.time && t1.millitm >= t2.millitm)
499 break;
500 }
501#else /* !MSDOS */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000502#ifdef MS_WIN32
Guido van Rossumb6775db1994-08-01 11:34:53 +0000503 /* XXX Can't interrupt this sleep */
504 Sleep((int)(secs*1000));
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000505#else /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000506 /* XXX Can't interrupt this sleep */
507 sleep((int)secs);
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000508#endif /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000509#endif /* !MSDOS */
Guido van Rossumbceeac81996-05-23 22:53:47 +0000510#endif /* !__WATCOMC__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000511#endif /* !macintosh */
512#endif /* !HAVE_SELECT */
513 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000514}