blob: ef5ab924df2b18590939c2e1fa93b12f249533ac [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Time module */
3
Barry Warsaw9a2a8a81996-12-06 23:32:14 +00004#include "Python.h"
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005#include "structseq.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00006
Guido van Rossum87ce7bb1998-06-09 16:30:31 +00007#include <ctype.h>
8
Guido van Rossum6d946f91992-08-14 13:49:30 +00009#ifdef macintosh
Guido van Rossumb6775db1994-08-01 11:34:53 +000010#include <time.h>
Guido van Rossumc410e922000-04-26 20:40:13 +000011#include <OSUtils.h>
Jack Jansen63596ae2000-12-12 22:42:30 +000012#ifdef USE_GUSI211
Guido van Rossumc410e922000-04-26 20:40:13 +000013/* GUSI, the I/O library which has the time() function and such uses the
14** Mac epoch of 1904. MSL, the C library which has localtime() and so uses
15** the ANSI epoch of 1900.
16*/
17#define GUSI_TO_MSL_EPOCH (4*365*24*60*60)
18#endif /* USE_GUSI2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000019#else
20#include <sys/types.h>
Guido van Rossum6d946f91992-08-14 13:49:30 +000021#endif
22
Guido van Rossumb6775db1994-08-01 11:34:53 +000023#ifdef QUICKWIN
24#include <io.h>
25#endif
26
27#ifdef HAVE_UNISTD_H
Guido van Rossum2762f251992-03-27 17:22:13 +000028#include <unistd.h>
29#endif
30
Guido van Rossumb6775db1994-08-01 11:34:53 +000031#ifdef HAVE_FTIME
32#include <sys/timeb.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000033#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000034extern int ftime(struct timeb *);
Guido van Rossum52174571996-12-09 18:38:52 +000035#endif /* MS_WINDOWS */
36#endif /* HAVE_FTIME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037
Guido van Rossum7bf22de1997-12-02 20:34:19 +000038#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000039#include <i86.h>
40#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000041#ifdef MS_WINDOWS
Guido van Rossum258ccd42001-03-02 06:53:29 +000042#include <windows.h>
Tim Peters58e0a8c2001-05-14 22:32:33 +000043#if defined(MS_WIN16) || defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000044/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000045#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000046#define tzname _tzname
47#define daylight _daylight
Tim Peters58e0a8c2001-05-14 22:32:33 +000048#endif /* MS_WIN16 || __BORLANDC__ */
49#ifdef MS_WIN16
Guido van Rossumcc081121995-03-14 15:05:41 +000050#define altzone _altzone
Guido van Rossumb2fb3641996-09-07 00:47:35 +000051#endif /* MS_WIN16 */
Guido van Rossumcac6c721996-09-06 13:34:02 +000052#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000053#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000054
Tim Peters58e0a8c2001-05-14 22:32:33 +000055#if defined(MS_WIN32) && !defined(MS_WIN64) && !defined(__BORLANDC__)
Fred Drakedfb4ebd2000-06-29 20:56:28 +000056/* Win32 has better clock replacement
57 XXX Win64 does not yet, but might when the platform matures. */
Guido van Rossum3917c221997-04-02 05:35:28 +000058#include <largeint.h>
59#undef HAVE_CLOCK /* We have our own version down below */
Fred Drakedfb4ebd2000-06-29 20:56:28 +000060#endif /* MS_WIN32 && !MS_WIN64 */
Guido van Rossum3917c221997-04-02 05:35:28 +000061
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000062#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000063#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000064#endif
65
Guido van Rossumbcc20741998-08-04 22:53:56 +000066#ifdef __BEOS__
Fred Drake56221a72000-08-15 18:52:33 +000067#include <time.h>
Guido van Rossumbcc20741998-08-04 22:53:56 +000068/* For bigtime_t, snooze(). - [cjh] */
69#include <support/SupportDefs.h>
70#include <kernel/OS.h>
71#endif
72
Guido van Rossum234f9421993-06-17 12:35:49 +000073/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000074static int floatsleep(double);
Thomas Woutersed77bac2000-07-24 15:26:39 +000075static double floattime(void);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076
Guido van Rossumcfbaecc1998-08-25 14:51:12 +000077/* For Y2K check */
78static PyObject *moddict;
79
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000080#ifdef macintosh
81/* Our own timezone. We have enough information to deduce whether
82** DST is on currently, but unfortunately we cannot put it to good
83** use because we don't know the rules (and that is needed to have
84** localtime() return correct tm_isdst values for times other than
85** the current time. So, we cop out and only tell the user the current
86** timezone.
87*/
88static long timezone;
89
Guido van Rossum10b164a2001-09-25 13:59:01 +000090static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +000091initmactimezone(void)
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000092{
93 MachineLocation loc;
94 long delta;
95
96 ReadLocation(&loc);
Guido van Rossum10b164a2001-09-25 13:59:01 +000097
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000098 if (loc.latitude == 0 && loc.longitude == 0 && loc.u.gmtDelta == 0)
99 return;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000100
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000101 delta = loc.u.gmtDelta & 0x00FFFFFF;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000102
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000103 if (delta & 0x00800000)
104 delta |= 0xFF000000;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000105
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000106 timezone = -delta;
107}
108#endif /* macintosh */
109
110
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000111static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000112time_time(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000114 double secs;
Thomas Woutersfe385252001-01-19 23:16:56 +0000115 if (!PyArg_ParseTuple(args, ":time"))
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000116 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000117 secs = floattime();
118 if (secs == 0.0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000119 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000120 return NULL;
121 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000122 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000123}
124
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000125static char time_doc[] =
126"time() -> floating point number\n\
127\n\
128Return the current time in seconds since the Epoch.\n\
129Fractions of a second may be present if the system clock provides them.";
130
Guido van Rossumb6775db1994-08-01 11:34:53 +0000131#ifdef HAVE_CLOCK
132
133#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000134#ifdef CLK_TCK
135#define CLOCKS_PER_SEC CLK_TCK
136#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000137#define CLOCKS_PER_SEC 1000000
138#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000139#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000140
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000141static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000142time_clock(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000143{
Thomas Woutersfe385252001-01-19 23:16:56 +0000144 if (!PyArg_ParseTuple(args, ":clock"))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145 return NULL;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000146 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000148#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149
Tim Peters58e0a8c2001-05-14 22:32:33 +0000150#if defined(MS_WIN32) && !defined(MS_WIN64) && !defined(__BORLANDC__)
Guido van Rossum3917c221997-04-02 05:35:28 +0000151/* Due to Mark Hammond */
152static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000153time_clock(PyObject *self, PyObject *args)
Guido van Rossum3917c221997-04-02 05:35:28 +0000154{
155 static LARGE_INTEGER ctrStart;
156 static LARGE_INTEGER divisor = {0,0};
157 LARGE_INTEGER now, diff, rem;
158
Thomas Woutersfe385252001-01-19 23:16:56 +0000159 if (!PyArg_ParseTuple(args, ":clock"))
Guido van Rossum3917c221997-04-02 05:35:28 +0000160 return NULL;
161
162 if (LargeIntegerEqualToZero(divisor)) {
163 QueryPerformanceCounter(&ctrStart);
Guido van Rossum10b164a2001-09-25 13:59:01 +0000164 if (!QueryPerformanceFrequency(&divisor) ||
Guido van Rossum3917c221997-04-02 05:35:28 +0000165 LargeIntegerEqualToZero(divisor)) {
Guido van Rossum10b164a2001-09-25 13:59:01 +0000166 /* Unlikely to happen -
167 this works on all intel machines at least!
Guido van Rossum3917c221997-04-02 05:35:28 +0000168 Revert to clock() */
169 return PyFloat_FromDouble(clock());
170 }
171 }
172 QueryPerformanceCounter(&now);
173 diff = LargeIntegerSubtract(now, ctrStart);
174 diff = LargeIntegerDivide(diff, divisor, &rem);
175 /* XXX - we assume both divide results fit in 32 bits. This is
Guido van Rossum10b164a2001-09-25 13:59:01 +0000176 true on Intels. First person who can afford a machine that
Guido van Rossum3917c221997-04-02 05:35:28 +0000177 doesnt deserves to fix it :-)
178 */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000179 return PyFloat_FromDouble((double)diff.LowPart +
Guido van Rossum3917c221997-04-02 05:35:28 +0000180 ((double)rem.LowPart / (double)divisor.LowPart));
181}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000182
Guido van Rossum3917c221997-04-02 05:35:28 +0000183#define HAVE_CLOCK /* So it gets included in the methods */
Fred Drakedfb4ebd2000-06-29 20:56:28 +0000184#endif /* MS_WIN32 && !MS_WIN64 */
Guido van Rossum3917c221997-04-02 05:35:28 +0000185
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000186#ifdef HAVE_CLOCK
187static char clock_doc[] =
188"clock() -> floating point number\n\
189\n\
190Return the CPU time or real time since the start of the process or since\n\
191the first call to clock(). This has as much precision as the system records.";
192#endif
193
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000194static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000195time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196{
Guido van Rossum775f4da1993-01-09 17:18:52 +0000197 double secs;
Thomas Woutersfe385252001-01-19 23:16:56 +0000198 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000199 return NULL;
Guido van Rossum8607ae21997-11-03 22:04:46 +0000200 if (floatsleep(secs) != 0)
201 return NULL;
202 Py_INCREF(Py_None);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000203 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204}
205
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000206static char sleep_doc[] =
207"sleep(seconds)\n\
208\n\
209Delay execution for a given number of seconds. The argument may be\n\
210a floating point number for subsecond precision.";
211
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000212static PyStructSequence_Field struct_time_type_fields[] = {
213 {"tm_year", NULL},
214 {"tm_mon", NULL},
215 {"tm_mday", NULL},
216 {"tm_hour", NULL},
217 {"tm_min", NULL},
218 {"tm_sec", NULL},
219 {"tm_wday", NULL},
220 {"tm_yday", NULL},
221 {"tm_isdst", NULL},
222 {0}
223};
224
225static PyStructSequence_Desc struct_time_type_desc = {
226 "struct_time",
227 NULL,
228 struct_time_type_fields,
229 9,
230};
231
232static PyTypeObject StructTimeType;
233
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000234static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000235tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000236{
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000237 PyObject *v = PyStructSequence_New(&StructTimeType);
238 if (v == NULL)
239 return NULL;
240
241#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val))
242
243 SET(0, p->tm_year + 1900);
244 SET(1, p->tm_mon + 1); /* Want January == 1 */
245 SET(2, p->tm_mday);
246 SET(3, p->tm_hour);
247 SET(4, p->tm_min);
248 SET(5, p->tm_sec);
249 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
250 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
251 SET(8, p->tm_isdst);
252#undef SET
253 if (PyErr_Occurred()) {
254 Py_XDECREF(v);
255 return NULL;
256 }
257
258 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000259}
260
261static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000262time_convert(time_t when, struct tm * (*function)(const time_t *))
Guido van Rossum234f9421993-06-17 12:35:49 +0000263{
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000264 struct tm *p;
265 errno = 0;
Jack Jansenee398fa2000-07-03 21:37:27 +0000266#if defined(macintosh) && defined(USE_GUSI204)
Guido van Rossumc410e922000-04-26 20:40:13 +0000267 when = when + GUSI_TO_MSL_EPOCH;
268#endif
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000269 p = function(&when);
270 if (p == NULL) {
271#ifdef EINVAL
Guido van Rossum0b1ff661996-11-02 17:31:22 +0000272 if (errno == 0)
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000273 errno = EINVAL;
274#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000275 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000276 }
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000277 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000278}
279
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000280static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000281time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000282{
283 double when;
Thomas Woutersfe385252001-01-19 23:16:56 +0000284 if (PyTuple_Size(args) == 0)
285 when = floattime();
286 if (!PyArg_ParseTuple(args, "|d:gmtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000287 return NULL;
288 return time_convert((time_t)when, gmtime);
289}
290
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000291static char gmtime_doc[] =
Thomas Woutersfe385252001-01-19 23:16:56 +0000292"gmtime([seconds]) -> tuple\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000293\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000294Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
295GMT). When 'seconds' is not passed in, convert the current time instead.";
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000296
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000297static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000298time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000299{
300 double when;
Thomas Woutersfe385252001-01-19 23:16:56 +0000301 if (PyTuple_Size(args) == 0)
302 when = floattime();
303 if (!PyArg_ParseTuple(args, "|d:localtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000304 return NULL;
305 return time_convert((time_t)when, localtime);
306}
307
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000308static char localtime_doc[] =
Thomas Woutersfe385252001-01-19 23:16:56 +0000309"localtime([seconds]) -> tuple\n\
310Convert seconds since the Epoch to a time tuple expressing local time.\n\
311When 'seconds' is not passed in, convert the current time instead.";
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000312
Guido van Rossum9e90a671993-06-24 11:10:19 +0000313static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000314gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000315{
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000316 int y;
Thomas Wouters334fb892000-07-25 12:56:38 +0000317 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000318
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000319 if (!PyArg_Parse(args, "(iiiiiiiii)",
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000320 &y,
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000321 &p->tm_mon,
322 &p->tm_mday,
323 &p->tm_hour,
324 &p->tm_min,
325 &p->tm_sec,
326 &p->tm_wday,
327 &p->tm_yday,
328 &p->tm_isdst))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000329 return 0;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000330 if (y < 1900) {
331 PyObject *accept = PyDict_GetItemString(moddict,
332 "accept2dyear");
333 if (accept == NULL || !PyInt_Check(accept) ||
334 PyInt_AsLong(accept) == 0) {
335 PyErr_SetString(PyExc_ValueError,
336 "year >= 1900 required");
337 return 0;
338 }
339 if (69 <= y && y <= 99)
340 y += 1900;
341 else if (0 <= y && y <= 68)
342 y += 2000;
343 else {
344 PyErr_SetString(PyExc_ValueError,
Skip Montanaro1a10aac2001-08-22 12:39:16 +0000345 "year out of range");
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000346 return 0;
347 }
348 }
349 p->tm_year = y - 1900;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000350 p->tm_mon--;
351 p->tm_wday = (p->tm_wday + 1) % 7;
352 p->tm_yday--;
353 return 1;
354}
355
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000356#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000357static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000358time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000359{
Thomas Woutersfe385252001-01-19 23:16:56 +0000360 PyObject *tup = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000361 struct tm buf;
362 const char *fmt;
Guido van Rossumfa481162000-06-28 21:33:59 +0000363 size_t fmtlen, buflen;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000364 char *outbuf = 0;
Guido van Rossumfa481162000-06-28 21:33:59 +0000365 size_t i;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000366
Thomas Wouters334fb892000-07-25 12:56:38 +0000367 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000368
Thomas Woutersfe385252001-01-19 23:16:56 +0000369 if (!PyArg_ParseTuple(args, "s|O:strftime", &fmt, &tup))
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000370 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000371
372 if (tup == NULL) {
373 time_t tt = time(NULL);
374 buf = *localtime(&tt);
375 } else if (!gettmarg(tup, &buf))
376 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000377
Guido van Rossumc222ec21999-02-23 00:00:10 +0000378 fmtlen = strlen(fmt);
379
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000380 /* I hate these functions that presume you know how big the output
381 * will be ahead of time...
382 */
Guido van Rossumc222ec21999-02-23 00:00:10 +0000383 for (i = 1024; ; i += i) {
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000384 outbuf = malloc(i);
385 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000386 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000387 }
Guido van Rossumc222ec21999-02-23 00:00:10 +0000388 buflen = strftime(outbuf, i, fmt, &buf);
389 if (buflen > 0 || i >= 256 * fmtlen) {
390 /* If the buffer is 256 times as long as the format,
391 it's probably not failing for lack of room!
392 More likely, the format yields an empty result,
393 e.g. an empty format, or %Z when the timezone
394 is unknown. */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000395 PyObject *ret;
Guido van Rossumc222ec21999-02-23 00:00:10 +0000396 ret = PyString_FromStringAndSize(outbuf, buflen);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000397 free(outbuf);
398 return ret;
399 }
400 free(outbuf);
401 }
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000402}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000403
404static char strftime_doc[] =
Thomas Woutersfe385252001-01-19 23:16:56 +0000405"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000406\n\
407Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000408See the library reference manual for formatting codes. When the time tuple\n\
409is not present, current time as returned by localtime() is used.";
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000410#endif /* HAVE_STRFTIME */
411
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000412#ifdef HAVE_STRPTIME
Fred Drakeaff60182000-05-09 19:52:40 +0000413
414#if 0
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +0000415/* Enable this if it's not declared in <time.h> */
416extern char *strptime(const char *, const char *, struct tm *);
Fred Drakeaff60182000-05-09 19:52:40 +0000417#endif
Guido van Rossumc2068731998-10-07 16:35:25 +0000418
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000419static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000420time_strptime(PyObject *self, PyObject *args)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000421{
422 struct tm tm;
423 char *fmt = "%a %b %d %H:%M:%S %Y";
424 char *buf;
425 char *s;
426
Jeremy Hylton7ceab652000-03-14 21:17:16 +0000427 if (!PyArg_ParseTuple(args, "s|s:strptime", &buf, &fmt))
428 return NULL;
Thomas Wouters334fb892000-07-25 12:56:38 +0000429 memset((void *) &tm, '\0', sizeof(tm));
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000430 s = strptime(buf, fmt, &tm);
431 if (s == NULL) {
432 PyErr_SetString(PyExc_ValueError, "format mismatch");
433 return NULL;
434 }
Martin v. Löwis2b6727b2001-03-06 12:12:02 +0000435 while (*s && isspace(Py_CHARMASK(*s)))
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000436 s++;
437 if (*s) {
438 PyErr_Format(PyExc_ValueError,
439 "unconverted data remains: '%.400s'", s);
440 return NULL;
441 }
442 return tmtotuple(&tm);
443}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000444
445static char strptime_doc[] =
Guido van Rossum446ccfe1999-01-07 18:29:26 +0000446"strptime(string, format) -> tuple\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000447Parse a string to a time tuple according to a format specification.\n\
448See the library reference manual for formatting codes (same as strftime()).";
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000449#endif /* HAVE_STRPTIME */
450
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000451static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000452time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000453{
Thomas Woutersfe385252001-01-19 23:16:56 +0000454 PyObject *tup = NULL;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000455 struct tm buf;
456 char *p;
Thomas Woutersfe385252001-01-19 23:16:56 +0000457 if (!PyArg_ParseTuple(args, "|O:asctime", &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000458 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000459 if (tup == NULL) {
460 time_t tt = time(NULL);
461 buf = *localtime(&tt);
462 } else if (!gettmarg(tup, &buf))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000463 return NULL;
464 p = asctime(&buf);
465 if (p[24] == '\n')
466 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000467 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000468}
469
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000470static char asctime_doc[] =
Thomas Woutersfe385252001-01-19 23:16:56 +0000471"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000472\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000473Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
474When the time tuple is not present, current time as returned by localtime()\n\
475is used.";
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000476
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000477static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000478time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000479{
480 double dt;
481 time_t tt;
482 char *p;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000483
Thomas Woutersfe385252001-01-19 23:16:56 +0000484 if (PyTuple_Size(args) == 0)
485 tt = time(NULL);
486 else {
487 if (!PyArg_ParseTuple(args, "|d:ctime", &dt))
488 return NULL;
489 tt = (time_t)dt;
490 }
Jack Jansenee398fa2000-07-03 21:37:27 +0000491#if defined(macintosh) && defined(USE_GUSI204)
Guido van Rossumc410e922000-04-26 20:40:13 +0000492 tt = tt + GUSI_TO_MSL_EPOCH;
493#endif
Guido van Rossum9e90a671993-06-24 11:10:19 +0000494 p = ctime(&tt);
Guido van Rossum78535701998-03-03 22:19:10 +0000495 if (p == NULL) {
496 PyErr_SetString(PyExc_ValueError, "unconvertible time");
497 return NULL;
498 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000499 if (p[24] == '\n')
500 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000501 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000502}
503
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000504static char ctime_doc[] =
505"ctime(seconds) -> string\n\
506\n\
507Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000508This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
509not present, current time as returned by localtime() is used.";
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000510
Guido van Rossum60cd8131998-03-06 17:16:21 +0000511#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000512static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000513time_mktime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000514{
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000515 PyObject *tup;
Guido van Rossum234f9421993-06-17 12:35:49 +0000516 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000517 time_t tt;
Guido van Rossum43713e52000-02-29 13:59:29 +0000518 if (!PyArg_ParseTuple(args, "O:mktime", &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000519 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000520 tt = time(&tt);
521 buf = *localtime(&tt);
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000522 if (!gettmarg(tup, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000523 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000524 tt = mktime(&buf);
525 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000526 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum10b164a2001-09-25 13:59:01 +0000527 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000528 return NULL;
529 }
Jack Jansen63596ae2000-12-12 22:42:30 +0000530#if defined(macintosh) && defined(USE_GUSI211)
Guido van Rossumc410e922000-04-26 20:40:13 +0000531 tt = tt - GUSI_TO_MSL_EPOCH;
532#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000533 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000534}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000535
536static char mktime_doc[] =
537"mktime(tuple) -> floating point number\n\
538\n\
539Convert a time tuple in local time to seconds since the Epoch.";
Guido van Rossum60cd8131998-03-06 17:16:21 +0000540#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000541
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000542static PyMethodDef time_methods[] = {
Thomas Woutersfe385252001-01-19 23:16:56 +0000543 {"time", time_time, METH_VARARGS, time_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000544#ifdef HAVE_CLOCK
Thomas Woutersfe385252001-01-19 23:16:56 +0000545 {"clock", time_clock, METH_VARARGS, clock_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000546#endif
Thomas Woutersfe385252001-01-19 23:16:56 +0000547 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
548 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
549 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000550 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
Thomas Woutersfe385252001-01-19 23:16:56 +0000551 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000552#ifdef HAVE_MKTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000553 {"mktime", time_mktime, METH_VARARGS, mktime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000554#endif
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000555#ifdef HAVE_STRFTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000556 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000557#endif
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000558#ifdef HAVE_STRPTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000559 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000560#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000561 {NULL, NULL} /* sentinel */
562};
563
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000564static void
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000565ins(PyObject *d, char *name, PyObject *v)
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000566{
Barry Warsaw9bfd2bf2000-09-01 09:01:32 +0000567 /* Don't worry too much about errors, they'll be caught by the
568 * caller of inittime().
569 */
570 if (v)
571 PyDict_SetItemString(d, name, v);
572 Py_XDECREF(v);
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000573}
574
Barry Warsaw9bfd2bf2000-09-01 09:01:32 +0000575
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000576static char module_doc[] =
577"This module provides various functions to manipulate time values.\n\
578\n\
579There are two standard representations of time. One is the number\n\
580of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
581or a floating point number (to represent fractions of seconds).\n\
582The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
583The actual value can be retrieved by calling gmtime(0).\n\
584\n\
585The other representation is a tuple of 9 integers giving local time.\n\
586The tuple items are:\n\
587 year (four digits, e.g. 1998)\n\
588 month (1-12)\n\
589 day (1-31)\n\
590 hours (0-23)\n\
591 minutes (0-59)\n\
Guido van Rossum360eb9f1999-02-22 16:19:52 +0000592 seconds (0-59)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000593 weekday (0-6, Monday is 0)\n\
594 Julian day (day in the year, 1-366)\n\
595 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
596If the DST flag is 0, the time is given in the regular time zone;\n\
597if it is 1, the time is given in the DST time zone;\n\
598if it is -1, mktime() should guess based on the date and time.\n\
599\n\
600Variables:\n\
601\n\
602timezone -- difference in seconds between UTC and local standard time\n\
603altzone -- difference in seconds between UTC and local DST time\n\
604daylight -- whether local time should reflect DST\n\
605tzname -- tuple of (standard time zone name, DST time zone name)\n\
606\n\
607Functions:\n\
608\n\
609time() -- return current time in seconds since the Epoch as a float\n\
610clock() -- return CPU time since process start as a float\n\
611sleep() -- delay for a number of seconds given as a float\n\
612gmtime() -- convert seconds since Epoch to UTC tuple\n\
613localtime() -- convert seconds since Epoch to local time tuple\n\
614asctime() -- convert time tuple to string\n\
615ctime() -- convert time in seconds to string\n\
616mktime() -- convert local time tuple to seconds since Epoch\n\
617strftime() -- convert time tuple to string according to format specification\n\
618strptime() -- parse string to time tuple according to format specification\n\
619";
Guido van Rossum10b164a2001-09-25 13:59:01 +0000620
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000621
Guido van Rossum3886bb61998-12-04 18:50:17 +0000622DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000623inittime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000624{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000625 PyObject *m, *d;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000626 char *p;
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000627 m = Py_InitModule3("time", time_methods, module_doc);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000628 d = PyModule_GetDict(m);
Guido van Rossumc2068731998-10-07 16:35:25 +0000629 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000630 p = Py_GETENV("PYTHONY2K");
Guido van Rossumc2068731998-10-07 16:35:25 +0000631 ins(d, "accept2dyear", PyInt_FromLong((long) (!p || !*p)));
632 /* Squirrel away the module's dictionary for the y2k check */
633 Py_INCREF(d);
634 moddict = d;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000635#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Guido van Rossum234f9421993-06-17 12:35:49 +0000636 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000637#ifdef PYOS_OS2
638 ins(d, "timezone", PyInt_FromLong((long)_timezone));
639#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000640 ins(d, "timezone", PyInt_FromLong((long)timezone));
Guido van Rossum26452411998-09-28 22:07:11 +0000641#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000642#ifdef HAVE_ALTZONE
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000643 ins(d, "altzone", PyInt_FromLong((long)altzone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000644#else
Guido van Rossum26452411998-09-28 22:07:11 +0000645#ifdef PYOS_OS2
646 ins(d, "altzone", PyInt_FromLong((long)_timezone-3600));
647#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000648 ins(d, "altzone", PyInt_FromLong((long)timezone-3600));
Guido van Rossum26452411998-09-28 22:07:11 +0000649#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000650#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000651 ins(d, "daylight", PyInt_FromLong((long)daylight));
652 ins(d, "tzname", Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossum10b164a2001-09-25 13:59:01 +0000653#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Guido van Rossum0ffdd051999-04-05 21:54:14 +0000654#ifdef HAVE_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000655 {
656#define YEAR ((time_t)((365 * 24 + 6) * 3600))
657 time_t t;
658 struct tm *p;
Guido van Rossum57731601999-03-29 19:12:04 +0000659 long janzone, julyzone;
660 char janname[10], julyname[10];
Guido van Rossum234f9421993-06-17 12:35:49 +0000661 t = (time((time_t *)0) / YEAR) * YEAR;
662 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000663 janzone = -p->tm_gmtoff;
664 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
665 janname[9] = '\0';
Guido van Rossum234f9421993-06-17 12:35:49 +0000666 t += YEAR/2;
667 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000668 julyzone = -p->tm_gmtoff;
669 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
670 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +0000671
Guido van Rossum57731601999-03-29 19:12:04 +0000672 if( janzone < julyzone ) {
673 /* DST is reversed in the southern hemisphere */
674 ins(d, "timezone", PyInt_FromLong(julyzone));
675 ins(d, "altzone", PyInt_FromLong(janzone));
676 ins(d, "daylight",
677 PyInt_FromLong((long)(janzone != julyzone)));
678 ins(d, "tzname",
679 Py_BuildValue("(zz)", julyname, janname));
680 } else {
681 ins(d, "timezone", PyInt_FromLong(janzone));
682 ins(d, "altzone", PyInt_FromLong(julyzone));
683 ins(d, "daylight",
684 PyInt_FromLong((long)(janzone != julyzone)));
685 ins(d, "tzname",
686 Py_BuildValue("(zz)", janname, julyname));
687 }
Guido van Rossum234f9421993-06-17 12:35:49 +0000688 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000689#else
690#ifdef macintosh
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000691 /* The only thing we can obtain is the current timezone
692 ** (and whether dst is currently _active_, but that is not what
693 ** we're looking for:-( )
694 */
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000695 initmactimezone();
696 ins(d, "timezone", PyInt_FromLong(timezone));
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000697 ins(d, "altzone", PyInt_FromLong(timezone));
698 ins(d, "daylight", PyInt_FromLong((long)0));
699 ins(d, "tzname", Py_BuildValue("(zz)", "", ""));
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000700#endif /* macintosh */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000701#endif /* HAVE_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000702#ifdef __CYGWIN__
703 tzset();
704 ins(d, "timezone", PyInt_FromLong(_timezone));
705 ins(d, "altzone", PyInt_FromLong(_timezone));
706 ins(d, "daylight", PyInt_FromLong(_daylight));
707 ins(d, "tzname", Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
708#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000709#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000710
711 PyStructSequence_InitType(&StructTimeType, &struct_time_type_desc);
712 PyDict_SetItemString(d, "struct_time", (PyObject*) &StructTimeType);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000713}
714
715
Guido van Rossumb6775db1994-08-01 11:34:53 +0000716/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000717
Guido van Rossumb6775db1994-08-01 11:34:53 +0000718static double
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000719floattime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000720{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000721 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000722 (1) gettimeofday() -- resolution in microseconds
723 (2) ftime() -- resolution in milliseconds
724 (3) time() -- resolution in seconds
725 In all cases the return value is a float in seconds.
726 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
727 fail, so we fall back on ftime() or time().
728 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000729#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000730 {
731 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000732#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000733 if (gettimeofday(&t) == 0)
734 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000735#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000736 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
737 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000738#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000739 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000740#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000741 {
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000742#if defined(HAVE_FTIME)
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000743 struct timeb t;
744 ftime(&t);
745 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000746#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000747 time_t secs;
748 time(&secs);
749 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000750#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000751 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000752}
753
Guido van Rossumb6775db1994-08-01 11:34:53 +0000754
755/* Implement floatsleep() for various platforms.
756 When interrupted (or when another error occurs), return -1 and
757 set an exception; else return 0. */
758
759static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000760floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +0000761{
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000762/* XXX Should test for MS_WIN32 first! */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000763#if defined(HAVE_SELECT) && !defined(__BEOS__)
Guido van Rossum426035c1991-02-19 12:27:35 +0000764 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000765 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000766 frac = fmod(secs, 1.0);
767 secs = floor(secs);
768 t.tv_sec = (long)secs;
769 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000770 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000771 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000772#ifdef EINTR
Guido van Rossuma5456d51999-08-19 14:40:27 +0000773 if (errno != EINTR) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000774#else
775 if (1) {
776#endif
Andrew M. Kuchlingc24ca4b2000-03-24 20:35:20 +0000777 Py_BLOCK_THREADS
Guido van Rossuma5456d51999-08-19 14:40:27 +0000778 PyErr_SetFromErrno(PyExc_IOError);
779 return -1;
780 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000781 }
Guido van Rossum8607ae21997-11-03 22:04:46 +0000782 Py_END_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000783#else /* !HAVE_SELECT || __BEOS__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000784#ifdef macintosh
785#define MacTicks (* (long *)0x16A)
786 long deadline;
787 deadline = MacTicks + (long)(secs * 60.0);
788 while (MacTicks < deadline) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000789 /* XXX Should call some yielding function here */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000790 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000791 return -1;
792 }
793#else /* !macintosh */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000794#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +0000795 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000796 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbceeac81996-05-23 22:53:47 +0000797 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000798 Py_END_ALLOW_THREADS
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000799#else /* !__WATCOMC__ || __QNX__ */
Guido van Rossume22e6441993-07-09 10:51:31 +0000800#ifdef MSDOS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000801 struct timeb t1, t2;
802 double frac;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000803 extern double fmod(double, double);
804 extern double floor(double);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000805 if (secs <= 0.0)
806 return;
807 frac = fmod(secs, 1.0);
808 secs = floor(secs);
809 ftime(&t1);
810 t2.time = t1.time + (int)secs;
811 t2.millitm = t1.millitm + (int)(frac*1000.0);
812 while (t2.millitm >= 1000) {
813 t2.time++;
814 t2.millitm -= 1000;
815 }
816 for (;;) {
817#ifdef QUICKWIN
Guido van Rossum8607ae21997-11-03 22:04:46 +0000818 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000819 _wyield();
Guido van Rossum8607ae21997-11-03 22:04:46 +0000820 Py_END_ALLOW_THREADS
Guido van Rossum80c9d881991-04-16 08:47:51 +0000821#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000822 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000823 return -1;
824 ftime(&t1);
825 if (t1.time > t2.time ||
826 t1.time == t2.time && t1.millitm >= t2.millitm)
827 break;
828 }
829#else /* !MSDOS */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000830#ifdef MS_WIN32
Fred Drake0e123952000-06-29 21:31:02 +0000831 {
832 double millisecs = secs * 1000.0;
833 if (millisecs > (double)ULONG_MAX) {
834 PyErr_SetString(PyExc_OverflowError, "sleep length is too large");
835 return -1;
836 }
837 /* XXX Can't interrupt this sleep */
838 Py_BEGIN_ALLOW_THREADS
839 Sleep((unsigned long)millisecs);
840 Py_END_ALLOW_THREADS
841 }
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000842#else /* !MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000843#ifdef PYOS_OS2
844 /* This Sleep *IS* Interruptable by Exceptions */
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000845 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000846 if (DosSleep(secs * 1000) != NO_ERROR) {
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000847 Py_BLOCK_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000848 PyErr_SetFromErrno(PyExc_IOError);
849 return -1;
850 }
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000851 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000852#else /* !PYOS_OS2 */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000853#ifdef __BEOS__
854 /* This sleep *CAN BE* interrupted. */
855 {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000856 if( secs <= 0.0 ) {
857 return;
858 }
Guido van Rossum10b164a2001-09-25 13:59:01 +0000859
Guido van Rossumbcc20741998-08-04 22:53:56 +0000860 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000861 /* BeOS snooze() is in microseconds... */
862 if( snooze( (bigtime_t)( secs * 1000.0 * 1000.0 ) ) == B_INTERRUPTED ) {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000863 Py_BLOCK_THREADS
864 PyErr_SetFromErrno( PyExc_IOError );
865 return -1;
866 }
867 Py_END_ALLOW_THREADS
868 }
869#else /* !__BEOS__ */
Guido van Rossumbceccf52001-04-10 22:07:43 +0000870#ifdef RISCOS
871 if (secs <= 0.0)
872 return 0;
873 Py_BEGIN_ALLOW_THREADS
874 /* This sleep *CAN BE* interrupted. */
875 if ( sleep(secs) )
876 return -1;
877 Py_END_ALLOW_THREADS
878#else /* !RISCOS */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000879 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000880 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000881 sleep((int)secs);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000882 Py_END_ALLOW_THREADS
Guido van Rossumbceccf52001-04-10 22:07:43 +0000883#endif /* !RISCOS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000884#endif /* !__BEOS__ */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000885#endif /* !PYOS_OS2 */
Guido van Rossumb2fb3641996-09-07 00:47:35 +0000886#endif /* !MS_WIN32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000887#endif /* !MSDOS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +0000888#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000889#endif /* !macintosh */
890#endif /* !HAVE_SELECT */
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000891
Guido van Rossumb6775db1994-08-01 11:34:53 +0000892 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000893}