blob: 9a8fb8b5b55cc492e5433cd7062c3293ee78cc21 [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
Guido van Rossum3917c221997-04-02 05:35:28 +000082#ifdef MS_WIN32
83/* Win32 has better clock replacement */
84#include <largeint.h>
85#undef HAVE_CLOCK /* We have our own version down below */
86#endif /* MS_WIN32 */
87
Guido van Rossum234f9421993-06-17 12:35:49 +000088/* Forward declarations */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000089static int floatsleep Py_PROTO((double));
90static double floattime Py_PROTO(());
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000092static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093time_time(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000094 PyObject *self;
95 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096{
Guido van Rossumb6775db1994-08-01 11:34:53 +000097 double secs;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000098 if (!PyArg_NoArgs(args))
Guido van Rossuma2b7f401993-01-04 09:09:59 +000099 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000100 secs = floattime();
101 if (secs == 0.0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000102 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000103 return NULL;
104 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000105 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000106}
107
108#ifdef HAVE_CLOCK
109
110#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000111#ifdef CLK_TCK
112#define CLOCKS_PER_SEC CLK_TCK
113#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000114#define CLOCKS_PER_SEC 1000000
115#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000116#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000117
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000118static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000119time_clock(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000120 PyObject *self;
121 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000122{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000123 if (!PyArg_NoArgs(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124 return NULL;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000125 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000127#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128
Guido van Rossum3917c221997-04-02 05:35:28 +0000129#ifdef MS_WIN32
130/* Due to Mark Hammond */
131static PyObject *
132time_clock(self, args)
133 PyObject *self;
134 PyObject *args;
135{
136 static LARGE_INTEGER ctrStart;
137 static LARGE_INTEGER divisor = {0,0};
138 LARGE_INTEGER now, diff, rem;
139
140 if (!PyArg_NoArgs(args))
141 return NULL;
142
143 if (LargeIntegerEqualToZero(divisor)) {
144 QueryPerformanceCounter(&ctrStart);
145 if (!QueryPerformanceFrequency(&divisor) ||
146 LargeIntegerEqualToZero(divisor)) {
147 /* Unlikely to happen -
148 this works on all intel machines at least!
149 Revert to clock() */
150 return PyFloat_FromDouble(clock());
151 }
152 }
153 QueryPerformanceCounter(&now);
154 diff = LargeIntegerSubtract(now, ctrStart);
155 diff = LargeIntegerDivide(diff, divisor, &rem);
156 /* XXX - we assume both divide results fit in 32 bits. This is
157 true on Intels. First person who can afford a machine that
158 doesnt deserves to fix it :-)
159 */
160 return PyFloat_FromDouble((double)diff.LowPart +
161 ((double)rem.LowPart / (double)divisor.LowPart));
162}
163#define HAVE_CLOCK /* So it gets included in the methods */
164#endif /* MS_WIN32 */
165
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000166static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167time_sleep(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000168 PyObject *self;
169 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170{
Guido van Rossum775f4da1993-01-09 17:18:52 +0000171 double secs;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000172 if (!PyArg_Parse(args, "d", &secs))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173 return NULL;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000174 Py_BEGIN_ALLOW_THREADS
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000175 if (floatsleep(secs) != 0) {
176 Py_BLOCK_THREADS
Guido van Rossum3917c221997-04-02 05:35:28 +0000177 return NULL;
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000178 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000179 Py_END_ALLOW_THREADS
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000180 Py_INCREF(Py_None);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000181 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182}
183
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000184static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000185time_convert(when, function)
186 time_t when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000187 struct tm * (*function) Py_PROTO((const time_t *));
Guido van Rossum234f9421993-06-17 12:35:49 +0000188{
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000189 struct tm *p;
190 errno = 0;
191 p = function(&when);
192 if (p == NULL) {
193#ifdef EINVAL
Guido van Rossum0b1ff661996-11-02 17:31:22 +0000194 if (errno == 0)
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000195 errno = EINVAL;
196#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000197 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000198 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000199 return Py_BuildValue("(iiiiiiiii)",
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000200 p->tm_year + 1900,
201 p->tm_mon + 1, /* Want January == 1 */
202 p->tm_mday,
203 p->tm_hour,
204 p->tm_min,
205 p->tm_sec,
206 (p->tm_wday + 6) % 7, /* Want Monday == 0 */
207 p->tm_yday + 1, /* Want January, 1 == 1 */
208 p->tm_isdst);
Guido van Rossum234f9421993-06-17 12:35:49 +0000209}
210
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000211static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000212time_gmtime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000213 PyObject *self;
214 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000215{
216 double when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000217 if (!PyArg_Parse(args, "d", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000218 return NULL;
219 return time_convert((time_t)when, gmtime);
220}
221
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000222static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000223time_localtime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000224 PyObject *self;
225 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000226{
227 double when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000228 if (!PyArg_Parse(args, "d", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000229 return NULL;
230 return time_convert((time_t)when, localtime);
231}
232
Guido van Rossum9e90a671993-06-24 11:10:19 +0000233static int
234gettmarg(args, p)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000235 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000236 struct tm *p;
237{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000238 if (!PyArg_Parse(args, "(iiiiiiiii)",
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000239 &p->tm_year,
240 &p->tm_mon,
241 &p->tm_mday,
242 &p->tm_hour,
243 &p->tm_min,
244 &p->tm_sec,
245 &p->tm_wday,
246 &p->tm_yday,
247 &p->tm_isdst))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000248 return 0;
249 if (p->tm_year >= 1900)
250 p->tm_year -= 1900;
251 p->tm_mon--;
252 p->tm_wday = (p->tm_wday + 1) % 7;
253 p->tm_yday--;
254 return 1;
255}
256
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000257#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000258static PyObject *
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000259time_strftime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000260 PyObject *self;
261 PyObject *args;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000262{
263 struct tm buf;
264 const char *fmt;
265 char *outbuf = 0;
266 int i;
267
268 if (!PyArg_ParseTuple(args, "s(iiiiiiiii)",
269 &fmt,
270 &(buf.tm_year),
271 &(buf.tm_mon),
272 &(buf.tm_mday),
273 &(buf.tm_hour),
274 &(buf.tm_min),
275 &(buf.tm_sec),
276 &(buf.tm_wday),
277 &(buf.tm_yday),
278 &(buf.tm_isdst)))
279 return NULL;
280 if (buf.tm_year >= 1900)
281 buf.tm_year -= 1900;
282 buf.tm_mon--;
283 buf.tm_wday = (buf.tm_wday + 1) % 7;
284 buf.tm_yday--;
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000285 /* I hate these functions that presume you know how big the output
286 * will be ahead of time...
287 */
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000288 for (i = 1024 ; i <= 8192 ; i += 1024) {
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000289 outbuf = malloc(i);
290 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000291 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000292 }
293 if (strftime(outbuf, i-1, fmt, &buf) != 0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000294 PyObject *ret;
295 ret = PyString_FromString(outbuf);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000296 free(outbuf);
297 return ret;
298 }
299 free(outbuf);
300 }
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000301 PyErr_SetString(PyExc_ValueError,
302 "bad strftime format or result too big");
303 return NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000304}
305#endif /* HAVE_STRFTIME */
306
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000307static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000308time_asctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000309 PyObject *self;
310 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000311{
312 struct tm buf;
313 char *p;
314 if (!gettmarg(args, &buf))
315 return NULL;
316 p = asctime(&buf);
317 if (p[24] == '\n')
318 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000319 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000320}
321
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000322static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000323time_ctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000324 PyObject *self;
325 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000326{
327 double dt;
328 time_t tt;
329 char *p;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000330 if (!PyArg_Parse(args, "d", &dt))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000331 return NULL;
Guido van Rossumcac6c721996-09-06 13:34:02 +0000332 tt = (time_t)dt;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000333 p = ctime(&tt);
334 if (p[24] == '\n')
335 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000336 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000337}
338
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000339static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000340time_mktime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000341 PyObject *self;
342 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000343{
344 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000345 time_t tt;
346 tt = time(&tt);
347 buf = *localtime(&tt);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000348 if (!gettmarg(args, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000349 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000350 tt = mktime(&buf);
351 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000352 PyErr_SetString(PyExc_OverflowError,
353 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000354 return NULL;
355 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000356 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000357}
358
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000359static PyMethodDef time_methods[] = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360 {"time", time_time},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000361#ifdef HAVE_CLOCK
362 {"clock", time_clock},
363#endif
364 {"sleep", time_sleep},
Guido van Rossum234f9421993-06-17 12:35:49 +0000365 {"gmtime", time_gmtime},
366 {"localtime", time_localtime},
Guido van Rossum9e90a671993-06-24 11:10:19 +0000367 {"asctime", time_asctime},
368 {"ctime", time_ctime},
Guido van Rossum234f9421993-06-17 12:35:49 +0000369 {"mktime", time_mktime},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000370#ifdef HAVE_STRFTIME
Guido van Rossum5416e201996-02-13 00:14:09 +0000371 {"strftime", time_strftime, 1},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000372#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 {NULL, NULL} /* sentinel */
374};
375
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000376static void
377ins(d, name, v)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000378 PyObject *d;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000379 char *name;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000380 PyObject *v;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000381{
382 if (v == NULL)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000383 Py_FatalError("Can't initialize time module -- NULL value");
384 if (PyDict_SetItemString(d, name, v) != 0)
385 Py_FatalError(
Guido van Rossum52174571996-12-09 18:38:52 +0000386 "Can't initialize time module -- PyDict_SetItemString failed");
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000387 Py_DECREF(v);
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000388}
389
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390void
391inittime()
392{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000393 PyObject *m, *d;
394 m = Py_InitModule("time", time_methods);
395 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000396#ifdef HAVE_TZNAME
Guido van Rossum234f9421993-06-17 12:35:49 +0000397 tzset();
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000398 ins(d, "timezone", PyInt_FromLong((long)timezone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000399#ifdef HAVE_ALTZONE
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000400 ins(d, "altzone", PyInt_FromLong((long)altzone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000401#else
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000402 ins(d, "altzone", PyInt_FromLong((long)timezone-3600));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000403#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000404 ins(d, "daylight", PyInt_FromLong((long)daylight));
405 ins(d, "tzname", Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000406#else /* !HAVE_TZNAME */
407#if HAVE_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000408 {
409#define YEAR ((time_t)((365 * 24 + 6) * 3600))
410 time_t t;
411 struct tm *p;
412 long winterzone, summerzone;
413 char wintername[10], summername[10];
Guido van Rossumb6775db1994-08-01 11:34:53 +0000414 /* XXX This won't work on the southern hemisphere.
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000415 XXX Anybody got a better idea? */
Guido van Rossum234f9421993-06-17 12:35:49 +0000416 t = (time((time_t *)0) / YEAR) * YEAR;
417 p = localtime(&t);
418 winterzone = -p->tm_gmtoff;
419 strncpy(wintername, p->tm_zone ? p->tm_zone : " ", 9);
420 wintername[9] = '\0';
421 t += YEAR/2;
422 p = localtime(&t);
423 summerzone = -p->tm_gmtoff;
424 strncpy(summername, p->tm_zone ? p->tm_zone : " ", 9);
425 summername[9] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000426 ins(d, "timezone", PyInt_FromLong(winterzone));
427 ins(d, "altzone", PyInt_FromLong(summerzone));
428 ins(d, "daylight",
429 PyInt_FromLong((long)(winterzone != summerzone)));
430 ins(d, "tzname",
431 Py_BuildValue("(zz)", wintername, summername));
Guido van Rossum234f9421993-06-17 12:35:49 +0000432 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000433#endif /* HAVE_TM_ZONE */
434#endif /* !HAVE_TZNAME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000435 if (PyErr_Occurred())
436 Py_FatalError("Can't initialize time module");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437}
438
439
Guido van Rossumb6775db1994-08-01 11:34:53 +0000440/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441
Guido van Rossumb6775db1994-08-01 11:34:53 +0000442static double
443floattime()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000445 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000446 (1) gettimeofday() -- resolution in microseconds
447 (2) ftime() -- resolution in milliseconds
448 (3) time() -- resolution in seconds
449 In all cases the return value is a float in seconds.
450 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
451 fail, so we fall back on ftime() or time().
452 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000453#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000454 {
455 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000456#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000457 if (gettimeofday(&t) == 0)
458 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000459#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000460 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
461 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000462#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000463 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000464#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000465 {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000466#ifdef HAVE_FTIME
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000467 struct timeb t;
468 ftime(&t);
469 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000470#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000471 time_t secs;
472 time(&secs);
473 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000474#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000475 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000476}
477
Guido van Rossumb6775db1994-08-01 11:34:53 +0000478
479/* Implement floatsleep() for various platforms.
480 When interrupted (or when another error occurs), return -1 and
481 set an exception; else return 0. */
482
483static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000484#ifdef MPW
485floatsleep(double secs)
486#else
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000487 floatsleep(secs)
Guido van Rossum775f4da1993-01-09 17:18:52 +0000488 double secs;
Guido van Rossuma320fd31995-03-09 12:14:15 +0000489#endif /* MPW */
Guido van Rossum426035c1991-02-19 12:27:35 +0000490{
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000491/* XXX Should test for MS_WIN32 first! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000492#ifdef HAVE_SELECT
Guido van Rossum426035c1991-02-19 12:27:35 +0000493 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000494 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000495 frac = fmod(secs, 1.0);
496 secs = floor(secs);
497 t.tv_sec = (long)secs;
498 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000499 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000500 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000501 return -1;
502 }
503#else /* !HAVE_SELECT */
504#ifdef macintosh
505#define MacTicks (* (long *)0x16A)
506 long deadline;
507 deadline = MacTicks + (long)(secs * 60.0);
508 while (MacTicks < deadline) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000509 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000510 return -1;
511 }
512#else /* !macintosh */
Guido van Rossumbceeac81996-05-23 22:53:47 +0000513#ifdef __WATCOMC__
514 /* XXX Can't interrupt this sleep */
515 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
516#else /* !__WATCOMC__ */
Guido van Rossume22e6441993-07-09 10:51:31 +0000517#ifdef MSDOS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000518 struct timeb t1, t2;
519 double frac;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000520 extern double fmod Py_PROTO((double, double));
521 extern double floor Py_PROTO((double));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000522 if (secs <= 0.0)
523 return;
524 frac = fmod(secs, 1.0);
525 secs = floor(secs);
526 ftime(&t1);
527 t2.time = t1.time + (int)secs;
528 t2.millitm = t1.millitm + (int)(frac*1000.0);
529 while (t2.millitm >= 1000) {
530 t2.time++;
531 t2.millitm -= 1000;
532 }
533 for (;;) {
534#ifdef QUICKWIN
535 _wyield();
Guido van Rossum80c9d881991-04-16 08:47:51 +0000536#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000537 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000538 return -1;
539 ftime(&t1);
540 if (t1.time > t2.time ||
541 t1.time == t2.time && t1.millitm >= t2.millitm)
542 break;
543 }
544#else /* !MSDOS */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000545#ifdef MS_WIN32
Guido van Rossumb6775db1994-08-01 11:34:53 +0000546 /* XXX Can't interrupt this sleep */
547 Sleep((int)(secs*1000));
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000548#else /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000549 /* XXX Can't interrupt this sleep */
550 sleep((int)secs);
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000551#endif /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000552#endif /* !MSDOS */
Guido van Rossumbceeac81996-05-23 22:53:47 +0000553#endif /* !__WATCOMC__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000554#endif /* !macintosh */
555#endif /* !HAVE_SELECT */
556 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000557}