blob: 5d7fa51e998c427a19575a9bf68ae5eaf17d6e8d [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
Guido van Rossumb6775db1994-08-01 11:34:53 +000027#ifdef HAVE_FTIME
28#include <sys/timeb.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000029#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000030extern int ftime(struct timeb *);
Guido van Rossum52174571996-12-09 18:38:52 +000031#endif /* MS_WINDOWS */
32#endif /* HAVE_FTIME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033
Guido van Rossum7bf22de1997-12-02 20:34:19 +000034#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000035#include <i86.h>
36#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000037#ifdef MS_WINDOWS
Guido van Rossum258ccd42001-03-02 06:53:29 +000038#include <windows.h>
Tim Peters58e0a8c2001-05-14 22:32:33 +000039#if defined(MS_WIN16) || defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000040/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000041#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000042#define tzname _tzname
43#define daylight _daylight
Tim Peters58e0a8c2001-05-14 22:32:33 +000044#endif /* MS_WIN16 || __BORLANDC__ */
45#ifdef MS_WIN16
Guido van Rossumcc081121995-03-14 15:05:41 +000046#define altzone _altzone
Guido van Rossumb2fb3641996-09-07 00:47:35 +000047#endif /* MS_WIN16 */
Guido van Rossumcac6c721996-09-06 13:34:02 +000048#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000049#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000050
Tim Peters58e0a8c2001-05-14 22:32:33 +000051#if defined(MS_WIN32) && !defined(MS_WIN64) && !defined(__BORLANDC__)
Fred Drakedfb4ebd2000-06-29 20:56:28 +000052/* Win32 has better clock replacement
53 XXX Win64 does not yet, but might when the platform matures. */
Guido van Rossum3917c221997-04-02 05:35:28 +000054#undef HAVE_CLOCK /* We have our own version down below */
Fred Drakedfb4ebd2000-06-29 20:56:28 +000055#endif /* MS_WIN32 && !MS_WIN64 */
Guido van Rossum3917c221997-04-02 05:35:28 +000056
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000057#if defined(PYOS_OS2)
58#define INCL_DOS
59#define INCL_ERRORS
60#include <os2.h>
61#endif
62
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000063#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000064#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000065#endif
66
Guido van Rossumbcc20741998-08-04 22:53:56 +000067#ifdef __BEOS__
Fred Drake56221a72000-08-15 18:52:33 +000068#include <time.h>
Guido van Rossumbcc20741998-08-04 22:53:56 +000069/* For bigtime_t, snooze(). - [cjh] */
70#include <support/SupportDefs.h>
71#include <kernel/OS.h>
72#endif
73
Guido van Rossum234f9421993-06-17 12:35:49 +000074/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000075static int floatsleep(double);
Thomas Woutersed77bac2000-07-24 15:26:39 +000076static double floattime(void);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077
Guido van Rossumcfbaecc1998-08-25 14:51:12 +000078/* For Y2K check */
79static PyObject *moddict;
80
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000081#ifdef macintosh
82/* Our own timezone. We have enough information to deduce whether
83** DST is on currently, but unfortunately we cannot put it to good
84** use because we don't know the rules (and that is needed to have
85** localtime() return correct tm_isdst values for times other than
86** the current time. So, we cop out and only tell the user the current
87** timezone.
88*/
89static long timezone;
90
Guido van Rossum10b164a2001-09-25 13:59:01 +000091static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +000092initmactimezone(void)
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000093{
94 MachineLocation loc;
95 long delta;
96
97 ReadLocation(&loc);
Guido van Rossum10b164a2001-09-25 13:59:01 +000098
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000099 if (loc.latitude == 0 && loc.longitude == 0 && loc.u.gmtDelta == 0)
100 return;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000101
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000102 delta = loc.u.gmtDelta & 0x00FFFFFF;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000103
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000104 if (delta & 0x00800000)
105 delta |= 0xFF000000;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000106
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000107 timezone = -delta;
108}
109#endif /* macintosh */
110
111
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000112static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000113time_time(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000115 double secs;
Thomas Woutersfe385252001-01-19 23:16:56 +0000116 if (!PyArg_ParseTuple(args, ":time"))
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000117 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118 secs = floattime();
119 if (secs == 0.0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000120 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000121 return NULL;
122 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000123 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000124}
125
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000126static char time_doc[] =
127"time() -> floating point number\n\
128\n\
129Return the current time in seconds since the Epoch.\n\
130Fractions of a second may be present if the system clock provides them.";
131
Guido van Rossumb6775db1994-08-01 11:34:53 +0000132#ifdef HAVE_CLOCK
133
134#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000135#ifdef CLK_TCK
136#define CLOCKS_PER_SEC CLK_TCK
137#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000138#define CLOCKS_PER_SEC 1000000
139#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000140#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000141
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000142static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000143time_clock(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000144{
Thomas Woutersfe385252001-01-19 23:16:56 +0000145 if (!PyArg_ParseTuple(args, ":clock"))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 return NULL;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000147 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000149#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150
Tim Peters58e0a8c2001-05-14 22:32:33 +0000151#if defined(MS_WIN32) && !defined(MS_WIN64) && !defined(__BORLANDC__)
Mark Hammond7ba5e812002-02-12 04:02:33 +0000152/* Due to Mark Hammond and Tim Peters */
Guido van Rossum3917c221997-04-02 05:35:28 +0000153static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000154time_clock(PyObject *self, PyObject *args)
Guido van Rossum3917c221997-04-02 05:35:28 +0000155{
Tim Peters9ad4b682002-02-13 05:14:18 +0000156 static LARGE_INTEGER ctrStart;
Mark Hammond7ba5e812002-02-12 04:02:33 +0000157 static double divisor = 0.0;
Tim Peters9ad4b682002-02-13 05:14:18 +0000158 LARGE_INTEGER now;
Mark Hammond7ba5e812002-02-12 04:02:33 +0000159 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +0000160
Thomas Woutersfe385252001-01-19 23:16:56 +0000161 if (!PyArg_ParseTuple(args, ":clock"))
Guido van Rossum3917c221997-04-02 05:35:28 +0000162 return NULL;
163
Mark Hammond7ba5e812002-02-12 04:02:33 +0000164 if (divisor == 0.0) {
Tim Peters9ad4b682002-02-13 05:14:18 +0000165 LARGE_INTEGER freq;
166 QueryPerformanceCounter(&ctrStart);
167 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
Mark Hammond7ba5e812002-02-12 04:02:33 +0000168 /* Unlikely to happen - this works on all intel
169 machines at least! Revert to clock() */
Guido van Rossum3917c221997-04-02 05:35:28 +0000170 return PyFloat_FromDouble(clock());
171 }
Tim Peters9ad4b682002-02-13 05:14:18 +0000172 divisor = (double)freq.QuadPart;
Guido van Rossum3917c221997-04-02 05:35:28 +0000173 }
Tim Peters9ad4b682002-02-13 05:14:18 +0000174 QueryPerformanceCounter(&now);
175 diff = (double)(now.QuadPart - ctrStart.QuadPart);
Mark Hammond7ba5e812002-02-12 04:02:33 +0000176 return PyFloat_FromDouble(diff / divisor);
Guido van Rossum3917c221997-04-02 05:35:28 +0000177}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000178
Guido van Rossum3917c221997-04-02 05:35:28 +0000179#define HAVE_CLOCK /* So it gets included in the methods */
Fred Drakedfb4ebd2000-06-29 20:56:28 +0000180#endif /* MS_WIN32 && !MS_WIN64 */
Guido van Rossum3917c221997-04-02 05:35:28 +0000181
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000182#ifdef HAVE_CLOCK
183static char clock_doc[] =
184"clock() -> floating point number\n\
185\n\
186Return the CPU time or real time since the start of the process or since\n\
187the first call to clock(). This has as much precision as the system records.";
188#endif
189
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000190static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000191time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000192{
Guido van Rossum775f4da1993-01-09 17:18:52 +0000193 double secs;
Thomas Woutersfe385252001-01-19 23:16:56 +0000194 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 return NULL;
Guido van Rossum8607ae21997-11-03 22:04:46 +0000196 if (floatsleep(secs) != 0)
197 return NULL;
198 Py_INCREF(Py_None);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000199 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200}
201
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000202static char sleep_doc[] =
203"sleep(seconds)\n\
204\n\
205Delay execution for a given number of seconds. The argument may be\n\
206a floating point number for subsecond precision.";
207
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000208static PyStructSequence_Field struct_time_type_fields[] = {
209 {"tm_year", NULL},
210 {"tm_mon", NULL},
211 {"tm_mday", NULL},
212 {"tm_hour", NULL},
213 {"tm_min", NULL},
214 {"tm_sec", NULL},
215 {"tm_wday", NULL},
216 {"tm_yday", NULL},
217 {"tm_isdst", NULL},
218 {0}
219};
220
221static PyStructSequence_Desc struct_time_type_desc = {
Guido van Rossum14648392001-12-08 18:02:58 +0000222 "time.struct_time",
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000223 NULL,
224 struct_time_type_fields,
225 9,
226};
Tim Peters9ad4b682002-02-13 05:14:18 +0000227
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000228static PyTypeObject StructTimeType;
229
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000230static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000231tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000232{
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000233 PyObject *v = PyStructSequence_New(&StructTimeType);
234 if (v == NULL)
235 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000236
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000237#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val))
238
239 SET(0, p->tm_year + 1900);
240 SET(1, p->tm_mon + 1); /* Want January == 1 */
241 SET(2, p->tm_mday);
242 SET(3, p->tm_hour);
243 SET(4, p->tm_min);
244 SET(5, p->tm_sec);
245 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
246 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
247 SET(8, p->tm_isdst);
248#undef SET
249 if (PyErr_Occurred()) {
250 Py_XDECREF(v);
251 return NULL;
252 }
253
254 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000255}
256
257static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000258time_convert(time_t when, struct tm * (*function)(const time_t *))
Guido van Rossum234f9421993-06-17 12:35:49 +0000259{
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000260 struct tm *p;
261 errno = 0;
Jack Jansenee398fa2000-07-03 21:37:27 +0000262#if defined(macintosh) && defined(USE_GUSI204)
Guido van Rossumc410e922000-04-26 20:40:13 +0000263 when = when + GUSI_TO_MSL_EPOCH;
264#endif
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000265 p = function(&when);
266 if (p == NULL) {
267#ifdef EINVAL
Guido van Rossum0b1ff661996-11-02 17:31:22 +0000268 if (errno == 0)
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000269 errno = EINVAL;
270#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000271 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000272 }
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000273 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000274}
275
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000276static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000277time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000278{
279 double when;
Thomas Woutersfe385252001-01-19 23:16:56 +0000280 if (PyTuple_Size(args) == 0)
281 when = floattime();
282 if (!PyArg_ParseTuple(args, "|d:gmtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000283 return NULL;
284 return time_convert((time_t)when, gmtime);
285}
286
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000287static char gmtime_doc[] =
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000288"gmtime([seconds]) -> (year,month,day,hour,minute,second,weekday,dayofyear,dst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000289\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000290Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
291GMT). When 'seconds' is not passed in, convert the current time instead.";
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000292
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000293static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000294time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000295{
296 double when;
Thomas Woutersfe385252001-01-19 23:16:56 +0000297 if (PyTuple_Size(args) == 0)
298 when = floattime();
299 if (!PyArg_ParseTuple(args, "|d:localtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000300 return NULL;
301 return time_convert((time_t)when, localtime);
302}
303
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000304static char localtime_doc[] =
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000305"localtime([seconds]) -> (year,month,day,hour,minute,second,weekday,dayofyear,dst)\n\
306\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000307Convert seconds since the Epoch to a time tuple expressing local time.\n\
308When 'seconds' is not passed in, convert the current time instead.";
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000309
Guido van Rossum9e90a671993-06-24 11:10:19 +0000310static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000311gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000312{
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000313 int y;
Thomas Wouters334fb892000-07-25 12:56:38 +0000314 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000315
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000316 if (!PyArg_Parse(args, "(iiiiiiiii)",
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000317 &y,
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000318 &p->tm_mon,
319 &p->tm_mday,
320 &p->tm_hour,
321 &p->tm_min,
322 &p->tm_sec,
323 &p->tm_wday,
324 &p->tm_yday,
325 &p->tm_isdst))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000326 return 0;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000327 if (y < 1900) {
328 PyObject *accept = PyDict_GetItemString(moddict,
329 "accept2dyear");
330 if (accept == NULL || !PyInt_Check(accept) ||
331 PyInt_AsLong(accept) == 0) {
332 PyErr_SetString(PyExc_ValueError,
333 "year >= 1900 required");
334 return 0;
335 }
336 if (69 <= y && y <= 99)
337 y += 1900;
338 else if (0 <= y && y <= 68)
339 y += 2000;
340 else {
341 PyErr_SetString(PyExc_ValueError,
Skip Montanaro1a10aac2001-08-22 12:39:16 +0000342 "year out of range");
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000343 return 0;
344 }
345 }
346 p->tm_year = y - 1900;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000347 p->tm_mon--;
348 p->tm_wday = (p->tm_wday + 1) % 7;
349 p->tm_yday--;
350 return 1;
351}
352
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000353#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000354static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000355time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000356{
Thomas Woutersfe385252001-01-19 23:16:56 +0000357 PyObject *tup = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000358 struct tm buf;
359 const char *fmt;
Guido van Rossumfa481162000-06-28 21:33:59 +0000360 size_t fmtlen, buflen;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000361 char *outbuf = 0;
Guido van Rossumfa481162000-06-28 21:33:59 +0000362 size_t i;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000363
Thomas Wouters334fb892000-07-25 12:56:38 +0000364 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000365
Thomas Woutersfe385252001-01-19 23:16:56 +0000366 if (!PyArg_ParseTuple(args, "s|O:strftime", &fmt, &tup))
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000367 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000368
369 if (tup == NULL) {
370 time_t tt = time(NULL);
371 buf = *localtime(&tt);
372 } else if (!gettmarg(tup, &buf))
373 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000374
Guido van Rossumc222ec21999-02-23 00:00:10 +0000375 fmtlen = strlen(fmt);
376
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000377 /* I hate these functions that presume you know how big the output
378 * will be ahead of time...
379 */
Guido van Rossumc222ec21999-02-23 00:00:10 +0000380 for (i = 1024; ; i += i) {
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000381 outbuf = malloc(i);
382 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000383 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000384 }
Guido van Rossumc222ec21999-02-23 00:00:10 +0000385 buflen = strftime(outbuf, i, fmt, &buf);
386 if (buflen > 0 || i >= 256 * fmtlen) {
387 /* If the buffer is 256 times as long as the format,
388 it's probably not failing for lack of room!
389 More likely, the format yields an empty result,
390 e.g. an empty format, or %Z when the timezone
391 is unknown. */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000392 PyObject *ret;
Guido van Rossumc222ec21999-02-23 00:00:10 +0000393 ret = PyString_FromStringAndSize(outbuf, buflen);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000394 free(outbuf);
395 return ret;
396 }
397 free(outbuf);
398 }
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000399}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000400
401static char strftime_doc[] =
Thomas Woutersfe385252001-01-19 23:16:56 +0000402"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000403\n\
404Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000405See the library reference manual for formatting codes. When the time tuple\n\
406is not present, current time as returned by localtime() is used.";
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000407#endif /* HAVE_STRFTIME */
408
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000409#ifdef HAVE_STRPTIME
Fred Drakeaff60182000-05-09 19:52:40 +0000410
411#if 0
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +0000412/* Enable this if it's not declared in <time.h> */
413extern char *strptime(const char *, const char *, struct tm *);
Fred Drakeaff60182000-05-09 19:52:40 +0000414#endif
Guido van Rossumc2068731998-10-07 16:35:25 +0000415
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000416static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000417time_strptime(PyObject *self, PyObject *args)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000418{
419 struct tm tm;
420 char *fmt = "%a %b %d %H:%M:%S %Y";
421 char *buf;
422 char *s;
423
Jeremy Hylton7ceab652000-03-14 21:17:16 +0000424 if (!PyArg_ParseTuple(args, "s|s:strptime", &buf, &fmt))
425 return NULL;
Thomas Wouters334fb892000-07-25 12:56:38 +0000426 memset((void *) &tm, '\0', sizeof(tm));
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000427 s = strptime(buf, fmt, &tm);
428 if (s == NULL) {
429 PyErr_SetString(PyExc_ValueError, "format mismatch");
430 return NULL;
431 }
Martin v. Löwis2b6727b2001-03-06 12:12:02 +0000432 while (*s && isspace(Py_CHARMASK(*s)))
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000433 s++;
434 if (*s) {
435 PyErr_Format(PyExc_ValueError,
436 "unconverted data remains: '%.400s'", s);
437 return NULL;
438 }
439 return tmtotuple(&tm);
440}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000441
442static char strptime_doc[] =
Guido van Rossum446ccfe1999-01-07 18:29:26 +0000443"strptime(string, format) -> tuple\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000444\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000445Parse a string to a time tuple according to a format specification.\n\
446See the library reference manual for formatting codes (same as strftime()).";
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000447#endif /* HAVE_STRPTIME */
448
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000449static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000450time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000451{
Thomas Woutersfe385252001-01-19 23:16:56 +0000452 PyObject *tup = NULL;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000453 struct tm buf;
454 char *p;
Thomas Woutersfe385252001-01-19 23:16:56 +0000455 if (!PyArg_ParseTuple(args, "|O:asctime", &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000456 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000457 if (tup == NULL) {
458 time_t tt = time(NULL);
459 buf = *localtime(&tt);
460 } else if (!gettmarg(tup, &buf))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000461 return NULL;
462 p = asctime(&buf);
463 if (p[24] == '\n')
464 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000465 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000466}
467
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000468static char asctime_doc[] =
Thomas Woutersfe385252001-01-19 23:16:56 +0000469"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000470\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000471Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
472When the time tuple is not present, current time as returned by localtime()\n\
473is used.";
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000474
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000475static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000476time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000477{
478 double dt;
479 time_t tt;
480 char *p;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000481
Thomas Woutersfe385252001-01-19 23:16:56 +0000482 if (PyTuple_Size(args) == 0)
483 tt = time(NULL);
484 else {
485 if (!PyArg_ParseTuple(args, "|d:ctime", &dt))
486 return NULL;
487 tt = (time_t)dt;
488 }
Jack Jansenee398fa2000-07-03 21:37:27 +0000489#if defined(macintosh) && defined(USE_GUSI204)
Guido van Rossumc410e922000-04-26 20:40:13 +0000490 tt = tt + GUSI_TO_MSL_EPOCH;
491#endif
Guido van Rossum9e90a671993-06-24 11:10:19 +0000492 p = ctime(&tt);
Guido van Rossum78535701998-03-03 22:19:10 +0000493 if (p == NULL) {
494 PyErr_SetString(PyExc_ValueError, "unconvertible time");
495 return NULL;
496 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000497 if (p[24] == '\n')
498 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000499 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000500}
501
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000502static char ctime_doc[] =
503"ctime(seconds) -> string\n\
504\n\
505Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000506This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
507not present, current time as returned by localtime() is used.";
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000508
Guido van Rossum60cd8131998-03-06 17:16:21 +0000509#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000510static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000511time_mktime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000512{
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000513 PyObject *tup;
Guido van Rossum234f9421993-06-17 12:35:49 +0000514 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000515 time_t tt;
Guido van Rossum43713e52000-02-29 13:59:29 +0000516 if (!PyArg_ParseTuple(args, "O:mktime", &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000517 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000518 tt = time(&tt);
519 buf = *localtime(&tt);
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000520 if (!gettmarg(tup, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000521 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000522 tt = mktime(&buf);
523 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000524 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum10b164a2001-09-25 13:59:01 +0000525 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000526 return NULL;
527 }
Jack Jansen63596ae2000-12-12 22:42:30 +0000528#if defined(macintosh) && defined(USE_GUSI211)
Guido van Rossumc410e922000-04-26 20:40:13 +0000529 tt = tt - GUSI_TO_MSL_EPOCH;
530#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000531 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000532}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000533
534static char mktime_doc[] =
535"mktime(tuple) -> floating point number\n\
536\n\
537Convert a time tuple in local time to seconds since the Epoch.";
Guido van Rossum60cd8131998-03-06 17:16:21 +0000538#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000539
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000540static PyMethodDef time_methods[] = {
Thomas Woutersfe385252001-01-19 23:16:56 +0000541 {"time", time_time, METH_VARARGS, time_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000542#ifdef HAVE_CLOCK
Thomas Woutersfe385252001-01-19 23:16:56 +0000543 {"clock", time_clock, METH_VARARGS, clock_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000544#endif
Thomas Woutersfe385252001-01-19 23:16:56 +0000545 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
546 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
547 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000548 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
Thomas Woutersfe385252001-01-19 23:16:56 +0000549 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000550#ifdef HAVE_MKTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000551 {"mktime", time_mktime, METH_VARARGS, mktime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000552#endif
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000553#ifdef HAVE_STRFTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000554 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000555#endif
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000556#ifdef HAVE_STRPTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000557 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000558#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000559 {NULL, NULL} /* sentinel */
560};
561
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000562static void
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000563ins(PyObject *d, char *name, PyObject *v)
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000564{
Barry Warsaw9bfd2bf2000-09-01 09:01:32 +0000565 /* Don't worry too much about errors, they'll be caught by the
566 * caller of inittime().
567 */
568 if (v)
569 PyDict_SetItemString(d, name, v);
570 Py_XDECREF(v);
Guido van Rossum8239f0f1995-01-22 00:49:01 +0000571}
572
Barry Warsaw9bfd2bf2000-09-01 09:01:32 +0000573
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000574static char module_doc[] =
575"This module provides various functions to manipulate time values.\n\
576\n\
577There are two standard representations of time. One is the number\n\
578of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
579or a floating point number (to represent fractions of seconds).\n\
580The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
581The actual value can be retrieved by calling gmtime(0).\n\
582\n\
583The other representation is a tuple of 9 integers giving local time.\n\
584The tuple items are:\n\
585 year (four digits, e.g. 1998)\n\
586 month (1-12)\n\
587 day (1-31)\n\
588 hours (0-23)\n\
589 minutes (0-59)\n\
Guido van Rossum360eb9f1999-02-22 16:19:52 +0000590 seconds (0-59)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000591 weekday (0-6, Monday is 0)\n\
592 Julian day (day in the year, 1-366)\n\
593 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
594If the DST flag is 0, the time is given in the regular time zone;\n\
595if it is 1, the time is given in the DST time zone;\n\
596if it is -1, mktime() should guess based on the date and time.\n\
597\n\
598Variables:\n\
599\n\
600timezone -- difference in seconds between UTC and local standard time\n\
601altzone -- difference in seconds between UTC and local DST time\n\
602daylight -- whether local time should reflect DST\n\
603tzname -- tuple of (standard time zone name, DST time zone name)\n\
604\n\
605Functions:\n\
606\n\
607time() -- return current time in seconds since the Epoch as a float\n\
608clock() -- return CPU time since process start as a float\n\
609sleep() -- delay for a number of seconds given as a float\n\
610gmtime() -- convert seconds since Epoch to UTC tuple\n\
611localtime() -- convert seconds since Epoch to local time tuple\n\
612asctime() -- convert time tuple to string\n\
613ctime() -- convert time in seconds to string\n\
614mktime() -- convert local time tuple to seconds since Epoch\n\
615strftime() -- convert time tuple to string according to format specification\n\
616strptime() -- parse string to time tuple according to format specification\n\
617";
Guido van Rossum10b164a2001-09-25 13:59:01 +0000618
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000619
Guido van Rossum3886bb61998-12-04 18:50:17 +0000620DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000621inittime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000622{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000623 PyObject *m, *d;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000624 char *p;
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000625 m = Py_InitModule3("time", time_methods, module_doc);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000626 d = PyModule_GetDict(m);
Guido van Rossumc2068731998-10-07 16:35:25 +0000627 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000628 p = Py_GETENV("PYTHONY2K");
Guido van Rossumc2068731998-10-07 16:35:25 +0000629 ins(d, "accept2dyear", PyInt_FromLong((long) (!p || !*p)));
630 /* Squirrel away the module's dictionary for the y2k check */
631 Py_INCREF(d);
632 moddict = d;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000633#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Guido van Rossum234f9421993-06-17 12:35:49 +0000634 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000635#ifdef PYOS_OS2
636 ins(d, "timezone", PyInt_FromLong((long)_timezone));
637#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000638 ins(d, "timezone", PyInt_FromLong((long)timezone));
Guido van Rossum26452411998-09-28 22:07:11 +0000639#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000640#ifdef HAVE_ALTZONE
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000641 ins(d, "altzone", PyInt_FromLong((long)altzone));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000642#else
Guido van Rossum26452411998-09-28 22:07:11 +0000643#ifdef PYOS_OS2
644 ins(d, "altzone", PyInt_FromLong((long)_timezone-3600));
645#else /* !PYOS_OS2 */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000646 ins(d, "altzone", PyInt_FromLong((long)timezone-3600));
Guido van Rossum26452411998-09-28 22:07:11 +0000647#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000648#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000649 ins(d, "daylight", PyInt_FromLong((long)daylight));
650 ins(d, "tzname", Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossum10b164a2001-09-25 13:59:01 +0000651#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Guido van Rossum0ffdd051999-04-05 21:54:14 +0000652#ifdef HAVE_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000653 {
654#define YEAR ((time_t)((365 * 24 + 6) * 3600))
655 time_t t;
656 struct tm *p;
Guido van Rossum57731601999-03-29 19:12:04 +0000657 long janzone, julyzone;
658 char janname[10], julyname[10];
Guido van Rossum234f9421993-06-17 12:35:49 +0000659 t = (time((time_t *)0) / YEAR) * YEAR;
660 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000661 janzone = -p->tm_gmtoff;
662 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
663 janname[9] = '\0';
Guido van Rossum234f9421993-06-17 12:35:49 +0000664 t += YEAR/2;
665 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000666 julyzone = -p->tm_gmtoff;
667 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
668 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +0000669
Guido van Rossum57731601999-03-29 19:12:04 +0000670 if( janzone < julyzone ) {
671 /* DST is reversed in the southern hemisphere */
672 ins(d, "timezone", PyInt_FromLong(julyzone));
673 ins(d, "altzone", PyInt_FromLong(janzone));
674 ins(d, "daylight",
675 PyInt_FromLong((long)(janzone != julyzone)));
676 ins(d, "tzname",
677 Py_BuildValue("(zz)", julyname, janname));
678 } else {
679 ins(d, "timezone", PyInt_FromLong(janzone));
680 ins(d, "altzone", PyInt_FromLong(julyzone));
681 ins(d, "daylight",
682 PyInt_FromLong((long)(janzone != julyzone)));
683 ins(d, "tzname",
684 Py_BuildValue("(zz)", janname, julyname));
685 }
Guido van Rossum234f9421993-06-17 12:35:49 +0000686 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000687#else
688#ifdef macintosh
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000689 /* The only thing we can obtain is the current timezone
690 ** (and whether dst is currently _active_, but that is not what
691 ** we're looking for:-( )
692 */
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000693 initmactimezone();
694 ins(d, "timezone", PyInt_FromLong(timezone));
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000695 ins(d, "altzone", PyInt_FromLong(timezone));
696 ins(d, "daylight", PyInt_FromLong((long)0));
697 ins(d, "tzname", Py_BuildValue("(zz)", "", ""));
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000698#endif /* macintosh */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000699#endif /* HAVE_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000700#ifdef __CYGWIN__
701 tzset();
702 ins(d, "timezone", PyInt_FromLong(_timezone));
703 ins(d, "altzone", PyInt_FromLong(_timezone));
704 ins(d, "daylight", PyInt_FromLong(_daylight));
705 ins(d, "tzname", Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
706#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000707#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000708
709 PyStructSequence_InitType(&StructTimeType, &struct_time_type_desc);
710 PyDict_SetItemString(d, "struct_time", (PyObject*) &StructTimeType);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000711}
712
713
Guido van Rossumb6775db1994-08-01 11:34:53 +0000714/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000715
Guido van Rossumb6775db1994-08-01 11:34:53 +0000716static double
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000717floattime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000718{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000719 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000720 (1) gettimeofday() -- resolution in microseconds
721 (2) ftime() -- resolution in milliseconds
722 (3) time() -- resolution in seconds
723 In all cases the return value is a float in seconds.
724 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
725 fail, so we fall back on ftime() or time().
726 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000727#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000728 {
729 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000730#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000731 if (gettimeofday(&t) == 0)
732 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000733#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000734 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
735 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000736#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000737 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000738#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000739 {
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000740#if defined(HAVE_FTIME)
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000741 struct timeb t;
742 ftime(&t);
743 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000744#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000745 time_t secs;
746 time(&secs);
747 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000748#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000749 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000750}
751
Guido van Rossumb6775db1994-08-01 11:34:53 +0000752
753/* Implement floatsleep() for various platforms.
754 When interrupted (or when another error occurs), return -1 and
755 set an exception; else return 0. */
756
757static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000758floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +0000759{
Guido van Rossuma78bfe11997-02-14 16:35:10 +0000760/* XXX Should test for MS_WIN32 first! */
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000761#if defined(HAVE_SELECT) && !defined(__BEOS__) && !defined(__EMX__)
Guido van Rossum426035c1991-02-19 12:27:35 +0000762 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000763 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000764 frac = fmod(secs, 1.0);
765 secs = floor(secs);
766 t.tv_sec = (long)secs;
767 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000768 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000769 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000770#ifdef EINTR
Guido van Rossuma5456d51999-08-19 14:40:27 +0000771 if (errno != EINTR) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000772#else
773 if (1) {
774#endif
Andrew M. Kuchlingc24ca4b2000-03-24 20:35:20 +0000775 Py_BLOCK_THREADS
Guido van Rossuma5456d51999-08-19 14:40:27 +0000776 PyErr_SetFromErrno(PyExc_IOError);
777 return -1;
778 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000779 }
Guido van Rossum8607ae21997-11-03 22:04:46 +0000780 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000781#elif defined(macintosh)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000782#define MacTicks (* (long *)0x16A)
783 long deadline;
784 deadline = MacTicks + (long)(secs * 60.0);
785 while (MacTicks < deadline) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000786 /* XXX Should call some yielding function here */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000787 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000788 return -1;
789 }
Martin v. Löwis02af9642002-01-16 11:04:06 +0000790#elif defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +0000791 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000792 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbceeac81996-05-23 22:53:47 +0000793 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000794 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000795#elif defined(MSDOS)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000796 struct timeb t1, t2;
797 double frac;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000798 extern double fmod(double, double);
799 extern double floor(double);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000800 if (secs <= 0.0)
801 return;
802 frac = fmod(secs, 1.0);
803 secs = floor(secs);
804 ftime(&t1);
805 t2.time = t1.time + (int)secs;
806 t2.millitm = t1.millitm + (int)(frac*1000.0);
807 while (t2.millitm >= 1000) {
808 t2.time++;
809 t2.millitm -= 1000;
810 }
811 for (;;) {
812#ifdef QUICKWIN
Guido van Rossum8607ae21997-11-03 22:04:46 +0000813 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000814 _wyield();
Guido van Rossum8607ae21997-11-03 22:04:46 +0000815 Py_END_ALLOW_THREADS
Guido van Rossum80c9d881991-04-16 08:47:51 +0000816#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000817 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000818 return -1;
819 ftime(&t1);
820 if (t1.time > t2.time ||
821 t1.time == t2.time && t1.millitm >= t2.millitm)
822 break;
823 }
Martin v. Löwis02af9642002-01-16 11:04:06 +0000824#elif defined(MS_WIN32)
Fred Drake0e123952000-06-29 21:31:02 +0000825 {
826 double millisecs = secs * 1000.0;
827 if (millisecs > (double)ULONG_MAX) {
828 PyErr_SetString(PyExc_OverflowError, "sleep length is too large");
829 return -1;
830 }
831 /* XXX Can't interrupt this sleep */
832 Py_BEGIN_ALLOW_THREADS
833 Sleep((unsigned long)millisecs);
834 Py_END_ALLOW_THREADS
835 }
Martin v. Löwis02af9642002-01-16 11:04:06 +0000836#elif defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000837 /* This Sleep *IS* Interruptable by Exceptions */
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000838 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000839 if (DosSleep(secs * 1000) != NO_ERROR) {
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000840 Py_BLOCK_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000841 PyErr_SetFromErrno(PyExc_IOError);
842 return -1;
843 }
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000844 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000845#elif defined(__BEOS__)
Guido van Rossumbcc20741998-08-04 22:53:56 +0000846 /* This sleep *CAN BE* interrupted. */
847 {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000848 if( secs <= 0.0 ) {
849 return;
850 }
Guido van Rossum10b164a2001-09-25 13:59:01 +0000851
Guido van Rossumbcc20741998-08-04 22:53:56 +0000852 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000853 /* BeOS snooze() is in microseconds... */
854 if( snooze( (bigtime_t)( secs * 1000.0 * 1000.0 ) ) == B_INTERRUPTED ) {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000855 Py_BLOCK_THREADS
856 PyErr_SetFromErrno( PyExc_IOError );
857 return -1;
858 }
859 Py_END_ALLOW_THREADS
860 }
Martin v. Löwis02af9642002-01-16 11:04:06 +0000861#elif defined(RISCOS)
Guido van Rossumbceccf52001-04-10 22:07:43 +0000862 if (secs <= 0.0)
863 return 0;
864 Py_BEGIN_ALLOW_THREADS
865 /* This sleep *CAN BE* interrupted. */
866 if ( sleep(secs) )
867 return -1;
868 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000869#elif defined(PLAN9)
870 {
871 double millisecs = secs * 1000.0;
872 if (millisecs > (double)LONG_MAX) {
873 PyErr_SetString(PyExc_OverflowError, "sleep length is too large");
874 return -1;
875 }
876 /* This sleep *CAN BE* interrupted. */
877 Py_BEGIN_ALLOW_THREADS
878 if(sleep((long)millisecs) < 0){
879 Py_BLOCK_THREADS
880 PyErr_SetFromErrno(PyExc_IOError);
881 return -1;
882 }
883 Py_END_ALLOW_THREADS
884 }
885#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000886 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000887 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000888 sleep((int)secs);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000889 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000890#endif
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}