blob: 7b411ae9cddabbf42e7775296ed82d593aea186b [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 Rossumb6775db1994-08-01 11:34:53 +000056#ifdef HAVE_SELECT
57#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(PYOS_OS2)
91#define INCL_DOS
92#define INCL_DOSERRORS
93#define INCL_NOPMAPI
94#include <os2.h>
95#endif
96
97#if defined(PYCC_VACPP)
98#include <time.h>
99#define timezone _timezone
100#endif
101
Guido van Rossum234f9421993-06-17 12:35:49 +0000102/* Forward declarations */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000103static int floatsleep Py_PROTO((double));
104static double floattime Py_PROTO(());
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000105
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000106#ifdef macintosh
107/* Our own timezone. We have enough information to deduce whether
108** DST is on currently, but unfortunately we cannot put it to good
109** use because we don't know the rules (and that is needed to have
110** localtime() return correct tm_isdst values for times other than
111** the current time. So, we cop out and only tell the user the current
112** timezone.
113*/
114static long timezone;
115
116static void
117initmactimezone()
118{
119 MachineLocation loc;
120 long delta;
121
122 ReadLocation(&loc);
123
124 if (loc.latitude == 0 && loc.longitude == 0 && loc.u.gmtDelta == 0)
125 return;
126
127 delta = loc.u.gmtDelta & 0x00FFFFFF;
128
129 if (delta & 0x00800000)
130 delta |= 0xFF000000;
131
132 timezone = -delta;
133}
134#endif /* macintosh */
135
136
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000137static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138time_time(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000139 PyObject *self;
140 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000142 double secs;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000143 if (!PyArg_NoArgs(args))
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000144 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000145 secs = floattime();
146 if (secs == 0.0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000147 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000148 return NULL;
149 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000150 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000151}
152
153#ifdef HAVE_CLOCK
154
155#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000156#ifdef CLK_TCK
157#define CLOCKS_PER_SEC CLK_TCK
158#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000159#define CLOCKS_PER_SEC 1000000
160#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000161#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000162
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000163static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000164time_clock(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000165 PyObject *self;
166 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000167{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000168 if (!PyArg_NoArgs(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169 return NULL;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000170 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000171}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000172#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173
Guido van Rossum3917c221997-04-02 05:35:28 +0000174#ifdef MS_WIN32
175/* Due to Mark Hammond */
176static PyObject *
177time_clock(self, args)
178 PyObject *self;
179 PyObject *args;
180{
181 static LARGE_INTEGER ctrStart;
182 static LARGE_INTEGER divisor = {0,0};
183 LARGE_INTEGER now, diff, rem;
184
185 if (!PyArg_NoArgs(args))
186 return NULL;
187
188 if (LargeIntegerEqualToZero(divisor)) {
189 QueryPerformanceCounter(&ctrStart);
190 if (!QueryPerformanceFrequency(&divisor) ||
191 LargeIntegerEqualToZero(divisor)) {
192 /* Unlikely to happen -
193 this works on all intel machines at least!
194 Revert to clock() */
195 return PyFloat_FromDouble(clock());
196 }
197 }
198 QueryPerformanceCounter(&now);
199 diff = LargeIntegerSubtract(now, ctrStart);
200 diff = LargeIntegerDivide(diff, divisor, &rem);
201 /* XXX - we assume both divide results fit in 32 bits. This is
202 true on Intels. First person who can afford a machine that
203 doesnt deserves to fix it :-)
204 */
205 return PyFloat_FromDouble((double)diff.LowPart +
206 ((double)rem.LowPart / (double)divisor.LowPart));
207}
208#define HAVE_CLOCK /* So it gets included in the methods */
209#endif /* MS_WIN32 */
210
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000211static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212time_sleep(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000213 PyObject *self;
214 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215{
Guido van Rossum775f4da1993-01-09 17:18:52 +0000216 double secs;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000217 if (!PyArg_Parse(args, "d", &secs))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218 return NULL;
Guido van Rossum8607ae21997-11-03 22:04:46 +0000219 if (floatsleep(secs) != 0)
220 return NULL;
221 Py_INCREF(Py_None);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000222 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223}
224
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000225static PyObject *
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000226tmtotuple(p)
227 struct tm *p;
228{
229 return Py_BuildValue("(iiiiiiiii)",
230 p->tm_year + 1900,
231 p->tm_mon + 1, /* Want January == 1 */
232 p->tm_mday,
233 p->tm_hour,
234 p->tm_min,
235 p->tm_sec,
236 (p->tm_wday + 6) % 7, /* Want Monday == 0 */
237 p->tm_yday + 1, /* Want January, 1 == 1 */
238 p->tm_isdst);
239}
240
241static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000242time_convert(when, function)
243 time_t when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000244 struct tm * (*function) Py_PROTO((const time_t *));
Guido van Rossum234f9421993-06-17 12:35:49 +0000245{
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000246 struct tm *p;
247 errno = 0;
248 p = function(&when);
249 if (p == NULL) {
250#ifdef EINVAL
Guido van Rossum0b1ff661996-11-02 17:31:22 +0000251 if (errno == 0)
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000252 errno = EINVAL;
253#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000254 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000255 }
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000256 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000257}
258
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000259static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000260time_gmtime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000261 PyObject *self;
262 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000263{
264 double when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000265 if (!PyArg_Parse(args, "d", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000266 return NULL;
267 return time_convert((time_t)when, gmtime);
268}
269
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000270static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000271time_localtime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000272 PyObject *self;
273 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000274{
275 double when;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000276 if (!PyArg_Parse(args, "d", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000277 return NULL;
278 return time_convert((time_t)when, localtime);
279}
280
Guido van Rossum9e90a671993-06-24 11:10:19 +0000281static int
282gettmarg(args, p)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000283 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000284 struct tm *p;
285{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000286 if (!PyArg_Parse(args, "(iiiiiiiii)",
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000287 &p->tm_year,
288 &p->tm_mon,
289 &p->tm_mday,
290 &p->tm_hour,
291 &p->tm_min,
292 &p->tm_sec,
293 &p->tm_wday,
294 &p->tm_yday,
295 &p->tm_isdst))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000296 return 0;
297 if (p->tm_year >= 1900)
298 p->tm_year -= 1900;
299 p->tm_mon--;
300 p->tm_wday = (p->tm_wday + 1) % 7;
301 p->tm_yday--;
302 return 1;
303}
304
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000305#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000306static PyObject *
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000307time_strftime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000308 PyObject *self;
309 PyObject *args;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000310{
311 struct tm buf;
312 const char *fmt;
313 char *outbuf = 0;
314 int i;
315
Guido van Rossum1f41f841998-04-27 19:04:26 +0000316 memset((ANY *) &buf, '\0', sizeof(buf));
317
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000318 if (!PyArg_ParseTuple(args, "s(iiiiiiiii)",
319 &fmt,
320 &(buf.tm_year),
321 &(buf.tm_mon),
322 &(buf.tm_mday),
323 &(buf.tm_hour),
324 &(buf.tm_min),
325 &(buf.tm_sec),
326 &(buf.tm_wday),
327 &(buf.tm_yday),
328 &(buf.tm_isdst)))
329 return NULL;
330 if (buf.tm_year >= 1900)
331 buf.tm_year -= 1900;
332 buf.tm_mon--;
333 buf.tm_wday = (buf.tm_wday + 1) % 7;
334 buf.tm_yday--;
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000335 /* I hate these functions that presume you know how big the output
336 * will be ahead of time...
337 */
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000338 for (i = 1024 ; i <= 8192 ; i += 1024) {
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000339 outbuf = malloc(i);
340 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000341 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000342 }
343 if (strftime(outbuf, i-1, fmt, &buf) != 0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000344 PyObject *ret;
345 ret = PyString_FromString(outbuf);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000346 free(outbuf);
347 return ret;
348 }
349 free(outbuf);
350 }
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000351 PyErr_SetString(PyExc_ValueError,
352 "bad strftime format or result too big");
353 return NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000354}
355#endif /* HAVE_STRFTIME */
356
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000357#ifdef HAVE_STRPTIME
358static PyObject *
359time_strptime(self, args)
360 PyObject *self;
361 PyObject *args;
362{
363 struct tm tm;
364 char *fmt = "%a %b %d %H:%M:%S %Y";
365 char *buf;
366 char *s;
367
368 if (!PyArg_ParseTuple(args, "s|s", &buf, &fmt)) {
369 PyErr_SetString(PyExc_ValueError, "invalid argument");
370 return NULL;
371 }
372 s = strptime(buf, fmt, &tm);
373 if (s == NULL) {
374 PyErr_SetString(PyExc_ValueError, "format mismatch");
375 return NULL;
376 }
377 while (*s && isspace(*s))
378 s++;
379 if (*s) {
380 PyErr_Format(PyExc_ValueError,
381 "unconverted data remains: '%.400s'", s);
382 return NULL;
383 }
384 return tmtotuple(&tm);
385}
386#endif /* HAVE_STRPTIME */
387
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000388static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000389time_asctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000390 PyObject *self;
391 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000392{
393 struct tm buf;
394 char *p;
395 if (!gettmarg(args, &buf))
396 return NULL;
397 p = asctime(&buf);
398 if (p[24] == '\n')
399 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000400 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000401}
402
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000403static PyObject *
Guido van Rossum9e90a671993-06-24 11:10:19 +0000404time_ctime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000405 PyObject *self;
406 PyObject *args;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000407{
408 double dt;
409 time_t tt;
410 char *p;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000411 if (!PyArg_Parse(args, "d", &dt))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000412 return NULL;
Guido van Rossumcac6c721996-09-06 13:34:02 +0000413 tt = (time_t)dt;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000414 p = ctime(&tt);
Guido van Rossum78535701998-03-03 22:19:10 +0000415 if (p == NULL) {
416 PyErr_SetString(PyExc_ValueError, "unconvertible time");
417 return NULL;
418 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000419 if (p[24] == '\n')
420 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000421 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000422}
423
Guido van Rossum60cd8131998-03-06 17:16:21 +0000424#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000425static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000426time_mktime(self, args)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000427 PyObject *self;
428 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000429{
430 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000431 time_t tt;
432 tt = time(&tt);
433 buf = *localtime(&tt);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000434 if (!gettmarg(args, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000435 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000436 tt = mktime(&buf);
437 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000438 PyErr_SetString(PyExc_OverflowError,
439 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000440 return NULL;
441 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000442 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000443}
Guido van Rossum60cd8131998-03-06 17:16:21 +0000444#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000445
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000446static PyMethodDef time_methods[] = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447 {"time", time_time},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000448#ifdef HAVE_CLOCK
449 {"clock", time_clock},
450#endif
451 {"sleep", time_sleep},
Guido van Rossum234f9421993-06-17 12:35:49 +0000452 {"gmtime", time_gmtime},
453 {"localtime", time_localtime},
Guido van Rossum9e90a671993-06-24 11:10:19 +0000454 {"asctime", time_asctime},
455 {"ctime", time_ctime},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000456#ifdef HAVE_MKTIME
Guido van Rossum234f9421993-06-17 12:35:49 +0000457 {"mktime", time_mktime},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000458#endif
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000459#ifdef HAVE_STRFTIME
Guido van Rossum5416e201996-02-13 00:14:09 +0000460 {"strftime", time_strftime, 1},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000461#endif
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000462#ifdef HAVE_STRPTIME
463 {"strptime", time_strptime, 1},
464#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000465 {NULL, NULL} /* sentinel */
466};
467
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000468static void
469ins(d, name, v)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000470 PyObject *d;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000471 char *name;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000472 PyObject *v;
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000473{
474 if (v == NULL)
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000475 Py_FatalError("Can't initialize time module -- NULL value");
476 if (PyDict_SetItemString(d, name, v) != 0)
477 Py_FatalError(
Guido van Rossum52174571996-12-09 18:38:52 +0000478 "Can't initialize time module -- PyDict_SetItemString failed");
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000479 Py_DECREF(v);
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000480}
481
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000482void
483inittime()
484{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000485 PyObject *m, *d;
486 m = Py_InitModule("time", time_methods);
487 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000488#ifdef HAVE_TZNAME
Guido van Rossum234f9421993-06-17 12:35:49 +0000489 tzset();
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000490 ins(d, "timezone", PyInt_FromLong((long)timezone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000491#ifdef HAVE_ALTZONE
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000492 ins(d, "altzone", PyInt_FromLong((long)altzone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000493#else
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000494 ins(d, "altzone", PyInt_FromLong((long)timezone-3600));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000495#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000496 ins(d, "daylight", PyInt_FromLong((long)daylight));
497 ins(d, "tzname", Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000498#else /* !HAVE_TZNAME */
499#if HAVE_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000500 {
501#define YEAR ((time_t)((365 * 24 + 6) * 3600))
502 time_t t;
503 struct tm *p;
504 long winterzone, summerzone;
505 char wintername[10], summername[10];
Guido van Rossumb6775db1994-08-01 11:34:53 +0000506 /* XXX This won't work on the southern hemisphere.
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000507 XXX Anybody got a better idea? */
Guido van Rossum234f9421993-06-17 12:35:49 +0000508 t = (time((time_t *)0) / YEAR) * YEAR;
509 p = localtime(&t);
510 winterzone = -p->tm_gmtoff;
511 strncpy(wintername, p->tm_zone ? p->tm_zone : " ", 9);
512 wintername[9] = '\0';
513 t += YEAR/2;
514 p = localtime(&t);
515 summerzone = -p->tm_gmtoff;
516 strncpy(summername, p->tm_zone ? p->tm_zone : " ", 9);
517 summername[9] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000518 ins(d, "timezone", PyInt_FromLong(winterzone));
519 ins(d, "altzone", PyInt_FromLong(summerzone));
520 ins(d, "daylight",
521 PyInt_FromLong((long)(winterzone != summerzone)));
522 ins(d, "tzname",
523 Py_BuildValue("(zz)", wintername, summername));
Guido van Rossum234f9421993-06-17 12:35:49 +0000524 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000525#else
526#ifdef macintosh
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000527 /* The only thing we can obtain is the current timezone
528 ** (and whether dst is currently _active_, but that is not what
529 ** we're looking for:-( )
530 */
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000531 initmactimezone();
532 ins(d, "timezone", PyInt_FromLong(timezone));
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000533 ins(d, "altzone", PyInt_FromLong(timezone));
534 ins(d, "daylight", PyInt_FromLong((long)0));
535 ins(d, "tzname", Py_BuildValue("(zz)", "", ""));
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000536#endif /* macintosh */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000537#endif /* HAVE_TM_ZONE */
538#endif /* !HAVE_TZNAME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000539 if (PyErr_Occurred())
540 Py_FatalError("Can't initialize time module");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000541}
542
543
Guido van Rossumb6775db1994-08-01 11:34:53 +0000544/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545
Guido van Rossumb6775db1994-08-01 11:34:53 +0000546static double
547floattime()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000549 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000550 (1) gettimeofday() -- resolution in microseconds
551 (2) ftime() -- resolution in milliseconds
552 (3) time() -- resolution in seconds
553 In all cases the return value is a float in seconds.
554 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
555 fail, so we fall back on ftime() or time().
556 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000557#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000558 {
559 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000560#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000561 if (gettimeofday(&t) == 0)
562 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000563#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000564 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
565 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000566#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000567 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000568#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000569 {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000570#ifdef HAVE_FTIME
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000571 struct timeb t;
572 ftime(&t);
573 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000574#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000575 time_t secs;
576 time(&secs);
577 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000578#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000579 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000580}
581
Guido van Rossumb6775db1994-08-01 11:34:53 +0000582
583/* Implement floatsleep() for various platforms.
584 When interrupted (or when another error occurs), return -1 and
585 set an exception; else return 0. */
586
587static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000588#ifdef MPW
589floatsleep(double secs)
590#else
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000591 floatsleep(secs)
Guido van Rossum775f4da1993-01-09 17:18:52 +0000592 double secs;
Guido van Rossuma320fd31995-03-09 12:14:15 +0000593#endif /* MPW */
Guido van Rossum426035c1991-02-19 12:27:35 +0000594{
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000595/* XXX Should test for MS_WIN32 first! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000596#ifdef HAVE_SELECT
Guido van Rossum426035c1991-02-19 12:27:35 +0000597 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000598 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000599 frac = fmod(secs, 1.0);
600 secs = floor(secs);
601 t.tv_sec = (long)secs;
602 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000603 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000604 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000605 Py_BLOCK_THREADS
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000606 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000607 return -1;
608 }
Guido van Rossum8607ae21997-11-03 22:04:46 +0000609 Py_END_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000610#else /* !HAVE_SELECT */
611#ifdef macintosh
612#define MacTicks (* (long *)0x16A)
613 long deadline;
614 deadline = MacTicks + (long)(secs * 60.0);
615 while (MacTicks < deadline) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000616 /* XXX Should call some yielding function here */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000617 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000618 return -1;
619 }
620#else /* !macintosh */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000621#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +0000622 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000623 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbceeac81996-05-23 22:53:47 +0000624 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000625 Py_END_ALLOW_THREADS
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000626#else /* !__WATCOMC__ || __QNX__ */
Guido van Rossume22e6441993-07-09 10:51:31 +0000627#ifdef MSDOS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000628 struct timeb t1, t2;
629 double frac;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000630 extern double fmod Py_PROTO((double, double));
631 extern double floor Py_PROTO((double));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000632 if (secs <= 0.0)
633 return;
634 frac = fmod(secs, 1.0);
635 secs = floor(secs);
636 ftime(&t1);
637 t2.time = t1.time + (int)secs;
638 t2.millitm = t1.millitm + (int)(frac*1000.0);
639 while (t2.millitm >= 1000) {
640 t2.time++;
641 t2.millitm -= 1000;
642 }
643 for (;;) {
644#ifdef QUICKWIN
Guido van Rossum8607ae21997-11-03 22:04:46 +0000645 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000646 _wyield();
Guido van Rossum8607ae21997-11-03 22:04:46 +0000647 Py_END_ALLOW_THREADS
Guido van Rossum80c9d881991-04-16 08:47:51 +0000648#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000649 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000650 return -1;
651 ftime(&t1);
652 if (t1.time > t2.time ||
653 t1.time == t2.time && t1.millitm >= t2.millitm)
654 break;
655 }
656#else /* !MSDOS */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000657#ifdef MS_WIN32
Guido van Rossumb6775db1994-08-01 11:34:53 +0000658 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000659 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000660 Sleep((int)(secs*1000));
Guido van Rossum8607ae21997-11-03 22:04:46 +0000661 Py_END_ALLOW_THREADS
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000662#else /* !MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000663#ifdef PYOS_OS2
664 /* This Sleep *IS* Interruptable by Exceptions */
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000665 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000666 if (DosSleep(secs * 1000) != NO_ERROR) {
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000667 Py_BLOCK_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000668 PyErr_SetFromErrno(PyExc_IOError);
669 return -1;
670 }
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000671 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000672#else /* !PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000673 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000674 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000675 sleep((int)secs);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000676 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000677#endif /* !PYOS_OS2 */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000678#endif /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000679#endif /* !MSDOS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000680#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000681#endif /* !macintosh */
682#endif /* !HAVE_SELECT */
683 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000684}