blob: 8f2c4f85c2849b7a9061ff9897a64b55330619ec [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>
Guido van Rossumb6775db1994-08-01 11:34:53 +000012#else
13#include <sys/types.h>
Guido van Rossum6d946f91992-08-14 13:49:30 +000014#endif
15
Guido van Rossumb6775db1994-08-01 11:34:53 +000016#ifdef QUICKWIN
17#include <io.h>
18#endif
19
Guido van Rossumb6775db1994-08-01 11:34:53 +000020#ifdef HAVE_FTIME
21#include <sys/timeb.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000022#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000023extern int ftime(struct timeb *);
Guido van Rossum52174571996-12-09 18:38:52 +000024#endif /* MS_WINDOWS */
25#endif /* HAVE_FTIME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000026
Guido van Rossum7bf22de1997-12-02 20:34:19 +000027#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000028#include <i86.h>
29#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000030#ifdef MS_WINDOWS
Guido van Rossum258ccd42001-03-02 06:53:29 +000031#include <windows.h>
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000032#if defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000033/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000034#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000035#define tzname _tzname
36#define daylight _daylight
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000037#endif /* __BORLANDC__ */
Guido van Rossumcac6c721996-09-06 13:34:02 +000038#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000039#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000040
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000041#if defined(MS_WINDOWS) && !defined(MS_WIN64) && !defined(__BORLANDC__)
Fred Drakedfb4ebd2000-06-29 20:56:28 +000042/* Win32 has better clock replacement
43 XXX Win64 does not yet, but might when the platform matures. */
Guido van Rossum3917c221997-04-02 05:35:28 +000044#undef HAVE_CLOCK /* We have our own version down below */
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000045#endif /* MS_WINDOWS && !MS_WIN64 */
Guido van Rossum3917c221997-04-02 05:35:28 +000046
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000047#if defined(PYOS_OS2)
48#define INCL_DOS
49#define INCL_ERRORS
50#include <os2.h>
51#endif
52
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000053#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000054#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000055#endif
56
Guido van Rossumbcc20741998-08-04 22:53:56 +000057#ifdef __BEOS__
Fred Drake56221a72000-08-15 18:52:33 +000058#include <time.h>
Guido van Rossumbcc20741998-08-04 22:53:56 +000059/* For bigtime_t, snooze(). - [cjh] */
60#include <support/SupportDefs.h>
61#include <kernel/OS.h>
62#endif
63
Guido van Rossum234f9421993-06-17 12:35:49 +000064/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000065static int floatsleep(double);
Thomas Woutersed77bac2000-07-24 15:26:39 +000066static double floattime(void);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067
Guido van Rossumcfbaecc1998-08-25 14:51:12 +000068/* For Y2K check */
69static PyObject *moddict;
70
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000071#ifdef macintosh
72/* Our own timezone. We have enough information to deduce whether
73** DST is on currently, but unfortunately we cannot put it to good
74** use because we don't know the rules (and that is needed to have
75** localtime() return correct tm_isdst values for times other than
76** the current time. So, we cop out and only tell the user the current
77** timezone.
78*/
79static long timezone;
80
Guido van Rossum10b164a2001-09-25 13:59:01 +000081static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +000082initmactimezone(void)
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000083{
84 MachineLocation loc;
85 long delta;
86
87 ReadLocation(&loc);
Guido van Rossum10b164a2001-09-25 13:59:01 +000088
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000089 if (loc.latitude == 0 && loc.longitude == 0 && loc.u.gmtDelta == 0)
90 return;
Guido van Rossum10b164a2001-09-25 13:59:01 +000091
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000092 delta = loc.u.gmtDelta & 0x00FFFFFF;
Guido van Rossum10b164a2001-09-25 13:59:01 +000093
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000094 if (delta & 0x00800000)
95 delta |= 0xFF000000;
Guido van Rossum10b164a2001-09-25 13:59:01 +000096
Guido van Rossume6a4b7b1997-10-08 15:27:56 +000097 timezone = -delta;
98}
99#endif /* macintosh */
100
101
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000102static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000103time_time(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000105 double secs;
Thomas Woutersfe385252001-01-19 23:16:56 +0000106 if (!PyArg_ParseTuple(args, ":time"))
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000107 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000108 secs = floattime();
109 if (secs == 0.0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000110 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000111 return NULL;
112 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000113 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000114}
115
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000116PyDoc_STRVAR(time_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000117"time() -> floating point number\n\
118\n\
119Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000120Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000121
Guido van Rossumb6775db1994-08-01 11:34:53 +0000122#ifdef HAVE_CLOCK
123
124#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000125#ifdef CLK_TCK
126#define CLOCKS_PER_SEC CLK_TCK
127#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000128#define CLOCKS_PER_SEC 1000000
129#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000130#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000131
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000132static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000133time_clock(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000134{
Thomas Woutersfe385252001-01-19 23:16:56 +0000135 if (!PyArg_ParseTuple(args, ":clock"))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136 return NULL;
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000137 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000139#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000141#if defined(MS_WINDOWS) && !defined(MS_WIN64) && !defined(__BORLANDC__)
Mark Hammond7ba5e812002-02-12 04:02:33 +0000142/* Due to Mark Hammond and Tim Peters */
Guido van Rossum3917c221997-04-02 05:35:28 +0000143static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000144time_clock(PyObject *self, PyObject *args)
Guido van Rossum3917c221997-04-02 05:35:28 +0000145{
Tim Peters9ad4b682002-02-13 05:14:18 +0000146 static LARGE_INTEGER ctrStart;
Mark Hammond7ba5e812002-02-12 04:02:33 +0000147 static double divisor = 0.0;
Tim Peters9ad4b682002-02-13 05:14:18 +0000148 LARGE_INTEGER now;
Mark Hammond7ba5e812002-02-12 04:02:33 +0000149 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +0000150
Thomas Woutersfe385252001-01-19 23:16:56 +0000151 if (!PyArg_ParseTuple(args, ":clock"))
Guido van Rossum3917c221997-04-02 05:35:28 +0000152 return NULL;
153
Mark Hammond7ba5e812002-02-12 04:02:33 +0000154 if (divisor == 0.0) {
Tim Peters9ad4b682002-02-13 05:14:18 +0000155 LARGE_INTEGER freq;
156 QueryPerformanceCounter(&ctrStart);
157 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
Mark Hammond7ba5e812002-02-12 04:02:33 +0000158 /* Unlikely to happen - this works on all intel
159 machines at least! Revert to clock() */
Guido van Rossum3917c221997-04-02 05:35:28 +0000160 return PyFloat_FromDouble(clock());
161 }
Tim Peters9ad4b682002-02-13 05:14:18 +0000162 divisor = (double)freq.QuadPart;
Guido van Rossum3917c221997-04-02 05:35:28 +0000163 }
Tim Peters9ad4b682002-02-13 05:14:18 +0000164 QueryPerformanceCounter(&now);
165 diff = (double)(now.QuadPart - ctrStart.QuadPart);
Mark Hammond7ba5e812002-02-12 04:02:33 +0000166 return PyFloat_FromDouble(diff / divisor);
Guido van Rossum3917c221997-04-02 05:35:28 +0000167}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000168
Guido van Rossum3917c221997-04-02 05:35:28 +0000169#define HAVE_CLOCK /* So it gets included in the methods */
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000170#endif /* MS_WINDOWS && !MS_WIN64 */
Guido van Rossum3917c221997-04-02 05:35:28 +0000171
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000172#ifdef HAVE_CLOCK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000173PyDoc_STRVAR(clock_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000174"clock() -> floating point number\n\
175\n\
176Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000177the first call to clock(). This has as much precision as the system\n\
178records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000179#endif
180
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000181static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000182time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183{
Guido van Rossum775f4da1993-01-09 17:18:52 +0000184 double secs;
Thomas Woutersfe385252001-01-19 23:16:56 +0000185 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186 return NULL;
Guido van Rossum8607ae21997-11-03 22:04:46 +0000187 if (floatsleep(secs) != 0)
188 return NULL;
189 Py_INCREF(Py_None);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000190 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191}
192
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000193PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000194"sleep(seconds)\n\
195\n\
196Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000197a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000198
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000199static PyStructSequence_Field struct_time_type_fields[] = {
200 {"tm_year", NULL},
201 {"tm_mon", NULL},
202 {"tm_mday", NULL},
203 {"tm_hour", NULL},
204 {"tm_min", NULL},
205 {"tm_sec", NULL},
206 {"tm_wday", NULL},
207 {"tm_yday", NULL},
208 {"tm_isdst", NULL},
209 {0}
210};
211
212static PyStructSequence_Desc struct_time_type_desc = {
Guido van Rossum14648392001-12-08 18:02:58 +0000213 "time.struct_time",
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000214 NULL,
215 struct_time_type_fields,
216 9,
217};
Tim Peters9ad4b682002-02-13 05:14:18 +0000218
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000219static PyTypeObject StructTimeType;
220
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000221static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000222tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000223{
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000224 PyObject *v = PyStructSequence_New(&StructTimeType);
225 if (v == NULL)
226 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000227
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000228#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val))
229
230 SET(0, p->tm_year + 1900);
231 SET(1, p->tm_mon + 1); /* Want January == 1 */
232 SET(2, p->tm_mday);
233 SET(3, p->tm_hour);
234 SET(4, p->tm_min);
235 SET(5, p->tm_sec);
236 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
237 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
238 SET(8, p->tm_isdst);
239#undef SET
240 if (PyErr_Occurred()) {
241 Py_XDECREF(v);
242 return NULL;
243 }
244
245 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000246}
247
248static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000249time_convert(time_t when, struct tm * (*function)(const time_t *))
Guido van Rossum234f9421993-06-17 12:35:49 +0000250{
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000251 struct tm *p;
252 errno = 0;
253 p = function(&when);
254 if (p == NULL) {
255#ifdef EINVAL
Guido van Rossum0b1ff661996-11-02 17:31:22 +0000256 if (errno == 0)
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000257 errno = EINVAL;
258#endif
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000259 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000260 }
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000261 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000262}
263
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000264static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000265time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000266{
267 double when;
Thomas Woutersfe385252001-01-19 23:16:56 +0000268 if (PyTuple_Size(args) == 0)
269 when = floattime();
270 if (!PyArg_ParseTuple(args, "|d:gmtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000271 return NULL;
272 return time_convert((time_t)when, gmtime);
273}
274
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000275PyDoc_STRVAR(gmtime_doc,
Fred Drake193a3f62002-03-12 21:38:49 +0000276"gmtime([seconds]) -> (tm_year, tm_mon, tm_day, tm_hour, tm_min,\n\
277 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000278\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000279Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000280GMT). When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000281
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000282static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000283time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000284{
285 double when;
Thomas Woutersfe385252001-01-19 23:16:56 +0000286 if (PyTuple_Size(args) == 0)
287 when = floattime();
288 if (!PyArg_ParseTuple(args, "|d:localtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000289 return NULL;
290 return time_convert((time_t)when, localtime);
291}
292
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000293PyDoc_STRVAR(localtime_doc,
Fred Drake193a3f62002-03-12 21:38:49 +0000294"localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000295\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000296Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000297When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000298
Guido van Rossum9e90a671993-06-24 11:10:19 +0000299static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000300gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000301{
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000302 int y;
Thomas Wouters334fb892000-07-25 12:56:38 +0000303 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000304
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000305 if (!PyArg_Parse(args, "(iiiiiiiii)",
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000306 &y,
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000307 &p->tm_mon,
308 &p->tm_mday,
309 &p->tm_hour,
310 &p->tm_min,
311 &p->tm_sec,
312 &p->tm_wday,
313 &p->tm_yday,
314 &p->tm_isdst))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000315 return 0;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000316 if (y < 1900) {
317 PyObject *accept = PyDict_GetItemString(moddict,
318 "accept2dyear");
319 if (accept == NULL || !PyInt_Check(accept) ||
320 PyInt_AsLong(accept) == 0) {
321 PyErr_SetString(PyExc_ValueError,
322 "year >= 1900 required");
323 return 0;
324 }
325 if (69 <= y && y <= 99)
326 y += 1900;
327 else if (0 <= y && y <= 68)
328 y += 2000;
329 else {
330 PyErr_SetString(PyExc_ValueError,
Skip Montanaro1a10aac2001-08-22 12:39:16 +0000331 "year out of range");
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000332 return 0;
333 }
334 }
335 p->tm_year = y - 1900;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000336 p->tm_mon--;
337 p->tm_wday = (p->tm_wday + 1) % 7;
338 p->tm_yday--;
339 return 1;
340}
341
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000342#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000343static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000344time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000345{
Thomas Woutersfe385252001-01-19 23:16:56 +0000346 PyObject *tup = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000347 struct tm buf;
348 const char *fmt;
Guido van Rossumfa481162000-06-28 21:33:59 +0000349 size_t fmtlen, buflen;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000350 char *outbuf = 0;
Guido van Rossumfa481162000-06-28 21:33:59 +0000351 size_t i;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000352
Thomas Wouters334fb892000-07-25 12:56:38 +0000353 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000354
Thomas Woutersfe385252001-01-19 23:16:56 +0000355 if (!PyArg_ParseTuple(args, "s|O:strftime", &fmt, &tup))
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000356 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000357
358 if (tup == NULL) {
359 time_t tt = time(NULL);
360 buf = *localtime(&tt);
361 } else if (!gettmarg(tup, &buf))
362 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000363
Guido van Rossumc222ec21999-02-23 00:00:10 +0000364 fmtlen = strlen(fmt);
365
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000366 /* I hate these functions that presume you know how big the output
367 * will be ahead of time...
368 */
Guido van Rossumc222ec21999-02-23 00:00:10 +0000369 for (i = 1024; ; i += i) {
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000370 outbuf = malloc(i);
371 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000372 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000373 }
Guido van Rossumc222ec21999-02-23 00:00:10 +0000374 buflen = strftime(outbuf, i, fmt, &buf);
375 if (buflen > 0 || i >= 256 * fmtlen) {
376 /* If the buffer is 256 times as long as the format,
377 it's probably not failing for lack of room!
378 More likely, the format yields an empty result,
379 e.g. an empty format, or %Z when the timezone
380 is unknown. */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000381 PyObject *ret;
Guido van Rossumc222ec21999-02-23 00:00:10 +0000382 ret = PyString_FromStringAndSize(outbuf, buflen);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000383 free(outbuf);
384 return ret;
385 }
386 free(outbuf);
387 }
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000388}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000389
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000390PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000391"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000392\n\
393Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000394See the library reference manual for formatting codes. When the time tuple\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000395is not present, current time as returned by localtime() is used.");
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000396#endif /* HAVE_STRFTIME */
397
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000398#ifdef HAVE_STRPTIME
Fred Drakeaff60182000-05-09 19:52:40 +0000399
400#if 0
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +0000401/* Enable this if it's not declared in <time.h> */
402extern char *strptime(const char *, const char *, struct tm *);
Fred Drakeaff60182000-05-09 19:52:40 +0000403#endif
Guido van Rossumc2068731998-10-07 16:35:25 +0000404
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000405static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000406time_strptime(PyObject *self, PyObject *args)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000407{
408 struct tm tm;
409 char *fmt = "%a %b %d %H:%M:%S %Y";
410 char *buf;
411 char *s;
412
Jeremy Hylton7ceab652000-03-14 21:17:16 +0000413 if (!PyArg_ParseTuple(args, "s|s:strptime", &buf, &fmt))
414 return NULL;
Thomas Wouters334fb892000-07-25 12:56:38 +0000415 memset((void *) &tm, '\0', sizeof(tm));
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000416 s = strptime(buf, fmt, &tm);
417 if (s == NULL) {
418 PyErr_SetString(PyExc_ValueError, "format mismatch");
419 return NULL;
420 }
Martin v. Löwis2b6727b2001-03-06 12:12:02 +0000421 while (*s && isspace(Py_CHARMASK(*s)))
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000422 s++;
423 if (*s) {
424 PyErr_Format(PyExc_ValueError,
425 "unconverted data remains: '%.400s'", s);
426 return NULL;
427 }
428 return tmtotuple(&tm);
429}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000430
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000431PyDoc_STRVAR(strptime_doc,
Guido van Rossum446ccfe1999-01-07 18:29:26 +0000432"strptime(string, format) -> tuple\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000433\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000434Parse a string to a time tuple according to a format specification.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000435See the library reference manual for formatting codes (same as strftime()).");
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000436#endif /* HAVE_STRPTIME */
437
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000438static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000439time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000440{
Thomas Woutersfe385252001-01-19 23:16:56 +0000441 PyObject *tup = NULL;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000442 struct tm buf;
443 char *p;
Thomas Woutersfe385252001-01-19 23:16:56 +0000444 if (!PyArg_ParseTuple(args, "|O:asctime", &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000445 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000446 if (tup == NULL) {
447 time_t tt = time(NULL);
448 buf = *localtime(&tt);
449 } else if (!gettmarg(tup, &buf))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000450 return NULL;
451 p = asctime(&buf);
452 if (p[24] == '\n')
453 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000454 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000455}
456
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000457PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000458"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000459\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000460Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
461When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000462is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000463
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000464static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000465time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000466{
467 double dt;
468 time_t tt;
469 char *p;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000470
Thomas Woutersfe385252001-01-19 23:16:56 +0000471 if (PyTuple_Size(args) == 0)
472 tt = time(NULL);
473 else {
474 if (!PyArg_ParseTuple(args, "|d:ctime", &dt))
475 return NULL;
476 tt = (time_t)dt;
477 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000478 p = ctime(&tt);
Guido van Rossum78535701998-03-03 22:19:10 +0000479 if (p == NULL) {
480 PyErr_SetString(PyExc_ValueError, "unconvertible time");
481 return NULL;
482 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000483 if (p[24] == '\n')
484 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000485 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000486}
487
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000488PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000489"ctime(seconds) -> string\n\
490\n\
491Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000492This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000493not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000494
Guido van Rossum60cd8131998-03-06 17:16:21 +0000495#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000496static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000497time_mktime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000498{
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000499 PyObject *tup;
Guido van Rossum234f9421993-06-17 12:35:49 +0000500 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000501 time_t tt;
Guido van Rossum43713e52000-02-29 13:59:29 +0000502 if (!PyArg_ParseTuple(args, "O:mktime", &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000503 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000504 tt = time(&tt);
505 buf = *localtime(&tt);
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000506 if (!gettmarg(tup, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000507 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000508 tt = mktime(&buf);
509 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000510 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum10b164a2001-09-25 13:59:01 +0000511 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000512 return NULL;
513 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000514 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000515}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000516
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000517PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000518"mktime(tuple) -> floating point number\n\
519\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000520Convert a time tuple in local time to seconds since the Epoch.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000521#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000522
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000523static PyMethodDef time_methods[] = {
Thomas Woutersfe385252001-01-19 23:16:56 +0000524 {"time", time_time, METH_VARARGS, time_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000525#ifdef HAVE_CLOCK
Thomas Woutersfe385252001-01-19 23:16:56 +0000526 {"clock", time_clock, METH_VARARGS, clock_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000527#endif
Thomas Woutersfe385252001-01-19 23:16:56 +0000528 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
529 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
530 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000531 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
Thomas Woutersfe385252001-01-19 23:16:56 +0000532 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000533#ifdef HAVE_MKTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000534 {"mktime", time_mktime, METH_VARARGS, mktime_doc},
Guido van Rossum60cd8131998-03-06 17:16:21 +0000535#endif
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000536#ifdef HAVE_STRFTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000537 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000538#endif
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000539#ifdef HAVE_STRPTIME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000540 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000541#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000542 {NULL, NULL} /* sentinel */
543};
544
Barry Warsaw9bfd2bf2000-09-01 09:01:32 +0000545
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000546PyDoc_STRVAR(module_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000547"This module provides various functions to manipulate time values.\n\
548\n\
549There are two standard representations of time. One is the number\n\
550of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
551or a floating point number (to represent fractions of seconds).\n\
552The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
553The actual value can be retrieved by calling gmtime(0).\n\
554\n\
555The other representation is a tuple of 9 integers giving local time.\n\
556The tuple items are:\n\
557 year (four digits, e.g. 1998)\n\
558 month (1-12)\n\
559 day (1-31)\n\
560 hours (0-23)\n\
561 minutes (0-59)\n\
Guido van Rossum360eb9f1999-02-22 16:19:52 +0000562 seconds (0-59)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000563 weekday (0-6, Monday is 0)\n\
564 Julian day (day in the year, 1-366)\n\
565 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
566If the DST flag is 0, the time is given in the regular time zone;\n\
567if it is 1, the time is given in the DST time zone;\n\
568if it is -1, mktime() should guess based on the date and time.\n\
569\n\
570Variables:\n\
571\n\
572timezone -- difference in seconds between UTC and local standard time\n\
573altzone -- difference in seconds between UTC and local DST time\n\
574daylight -- whether local time should reflect DST\n\
575tzname -- tuple of (standard time zone name, DST time zone name)\n\
576\n\
577Functions:\n\
578\n\
579time() -- return current time in seconds since the Epoch as a float\n\
580clock() -- return CPU time since process start as a float\n\
581sleep() -- delay for a number of seconds given as a float\n\
582gmtime() -- convert seconds since Epoch to UTC tuple\n\
583localtime() -- convert seconds since Epoch to local time tuple\n\
584asctime() -- convert time tuple to string\n\
585ctime() -- convert time in seconds to string\n\
586mktime() -- convert local time tuple to seconds since Epoch\n\
587strftime() -- convert time tuple to string according to format specification\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000588strptime() -- parse string to time tuple according to format specification");
Guido van Rossum10b164a2001-09-25 13:59:01 +0000589
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000590
Guido van Rossum3886bb61998-12-04 18:50:17 +0000591DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000592inittime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000593{
Fred Drake9bb74322002-04-01 14:49:59 +0000594 PyObject *m;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000595 char *p;
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000596 m = Py_InitModule3("time", time_methods, module_doc);
Fred Drake9bb74322002-04-01 14:49:59 +0000597
Guido van Rossumc2068731998-10-07 16:35:25 +0000598 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000599 p = Py_GETENV("PYTHONY2K");
Fred Drake9bb74322002-04-01 14:49:59 +0000600 PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p));
Guido van Rossumc2068731998-10-07 16:35:25 +0000601 /* Squirrel away the module's dictionary for the y2k check */
Fred Drake9bb74322002-04-01 14:49:59 +0000602 moddict = PyModule_GetDict(m);
603 Py_INCREF(moddict);
Guido van Rossum10b164a2001-09-25 13:59:01 +0000604#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Guido van Rossum234f9421993-06-17 12:35:49 +0000605 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000606#ifdef PYOS_OS2
Fred Drake9bb74322002-04-01 14:49:59 +0000607 PyModule_AddIntConstant(m, "timezone", _timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000608#else /* !PYOS_OS2 */
Fred Drake9bb74322002-04-01 14:49:59 +0000609 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000610#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000611#ifdef HAVE_ALTZONE
Fred Drake9bb74322002-04-01 14:49:59 +0000612 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000613#else
Guido van Rossum26452411998-09-28 22:07:11 +0000614#ifdef PYOS_OS2
Fred Drake9bb74322002-04-01 14:49:59 +0000615 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000616#else /* !PYOS_OS2 */
Fred Drake9bb74322002-04-01 14:49:59 +0000617 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000618#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000619#endif
Fred Drake9bb74322002-04-01 14:49:59 +0000620 PyModule_AddIntConstant(m, "daylight", daylight);
621 PyModule_AddObject(m, "tzname",
622 Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossum10b164a2001-09-25 13:59:01 +0000623#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Guido van Rossum0ffdd051999-04-05 21:54:14 +0000624#ifdef HAVE_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000625 {
626#define YEAR ((time_t)((365 * 24 + 6) * 3600))
627 time_t t;
628 struct tm *p;
Guido van Rossum57731601999-03-29 19:12:04 +0000629 long janzone, julyzone;
630 char janname[10], julyname[10];
Guido van Rossum234f9421993-06-17 12:35:49 +0000631 t = (time((time_t *)0) / YEAR) * YEAR;
632 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000633 janzone = -p->tm_gmtoff;
634 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
635 janname[9] = '\0';
Guido van Rossum234f9421993-06-17 12:35:49 +0000636 t += YEAR/2;
637 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000638 julyzone = -p->tm_gmtoff;
639 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
640 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +0000641
Guido van Rossum57731601999-03-29 19:12:04 +0000642 if( janzone < julyzone ) {
643 /* DST is reversed in the southern hemisphere */
Fred Drake9bb74322002-04-01 14:49:59 +0000644 PyModule_AddIntConstant(m, "timezone", julyzone);
645 PyModule_AddIntConstant(m, "altzone", janzone);
646 PyModule_AddIntConstant(m, "daylight",
647 janzone != julyzone);
648 PyModule_AddObject(m, "tzname",
649 Py_BuildValue("(zz)",
650 julyname, janname));
Guido van Rossum57731601999-03-29 19:12:04 +0000651 } else {
Fred Drake9bb74322002-04-01 14:49:59 +0000652 PyModule_AddIntConstant(m, "timezone", janzone);
653 PyModule_AddIntConstant(m, "altzone", julyzone);
654 PyModule_AddIntConstant(m, "daylight",
655 janzone != julyzone);
656 PyModule_AddObject(m, "tzname",
657 Py_BuildValue("(zz)",
658 janname, julyname));
Guido van Rossum57731601999-03-29 19:12:04 +0000659 }
Guido van Rossum234f9421993-06-17 12:35:49 +0000660 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000661#else
662#ifdef macintosh
Guido van Rossumbe1eb0d1997-12-08 21:56:43 +0000663 /* The only thing we can obtain is the current timezone
664 ** (and whether dst is currently _active_, but that is not what
665 ** we're looking for:-( )
666 */
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000667 initmactimezone();
Fred Drake9bb74322002-04-01 14:49:59 +0000668 PyModule_AddIntConstant(m, "timezone", timezone);
669 PyModule_AddIntConstant(m, "altzone", timezone);
670 PyModule_AddIntConstant(m, "daylight", 0);
671 PyModule_AddObject(m, "tzname", Py_BuildValue("(zz)", "", ""));
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000672#endif /* macintosh */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000673#endif /* HAVE_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000674#ifdef __CYGWIN__
675 tzset();
Fred Drake9bb74322002-04-01 14:49:59 +0000676 PyModule_AddIntConstant(m, "timezone", _timezone);
677 PyModule_AddIntConstant(m, "altzone", _timezone);
678 PyModule_AddIntConstant(m, "daylight", _daylight);
679 PyModule_AddObject(m, "tzname",
680 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +0000681#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000682#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000683
684 PyStructSequence_InitType(&StructTimeType, &struct_time_type_desc);
Fred Drake9bb74322002-04-01 14:49:59 +0000685 Py_INCREF(&StructTimeType);
686 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000687}
688
689
Guido van Rossumb6775db1994-08-01 11:34:53 +0000690/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000691
Guido van Rossumb6775db1994-08-01 11:34:53 +0000692static double
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000693floattime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000694{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000695 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000696 (1) gettimeofday() -- resolution in microseconds
697 (2) ftime() -- resolution in milliseconds
698 (3) time() -- resolution in seconds
699 In all cases the return value is a float in seconds.
700 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
701 fail, so we fall back on ftime() or time().
702 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000703#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000704 {
705 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000706#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000707 if (gettimeofday(&t) == 0)
708 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000709#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000710 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
711 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000712#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000713 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000714#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000715 {
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000716#if defined(HAVE_FTIME)
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000717 struct timeb t;
718 ftime(&t);
719 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000720#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000721 time_t secs;
722 time(&secs);
723 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000724#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000725 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000726}
727
Guido van Rossumb6775db1994-08-01 11:34:53 +0000728
729/* Implement floatsleep() for various platforms.
730 When interrupted (or when another error occurs), return -1 and
731 set an exception; else return 0. */
732
733static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000734floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +0000735{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000736/* XXX Should test for MS_WINDOWS first! */
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000737#if defined(HAVE_SELECT) && !defined(__BEOS__) && !defined(__EMX__)
Guido van Rossum426035c1991-02-19 12:27:35 +0000738 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000739 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000740 frac = fmod(secs, 1.0);
741 secs = floor(secs);
742 t.tv_sec = (long)secs;
743 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000744 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000745 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000746#ifdef EINTR
Guido van Rossuma5456d51999-08-19 14:40:27 +0000747 if (errno != EINTR) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000748#else
749 if (1) {
750#endif
Andrew M. Kuchlingc24ca4b2000-03-24 20:35:20 +0000751 Py_BLOCK_THREADS
Guido van Rossuma5456d51999-08-19 14:40:27 +0000752 PyErr_SetFromErrno(PyExc_IOError);
753 return -1;
754 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000755 }
Guido van Rossum8607ae21997-11-03 22:04:46 +0000756 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000757#elif defined(macintosh)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000758#define MacTicks (* (long *)0x16A)
759 long deadline;
760 deadline = MacTicks + (long)(secs * 60.0);
761 while (MacTicks < deadline) {
Guido van Rossum8607ae21997-11-03 22:04:46 +0000762 /* XXX Should call some yielding function here */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000763 if (PyErr_CheckSignals())
Guido van Rossumb6775db1994-08-01 11:34:53 +0000764 return -1;
765 }
Martin v. Löwis02af9642002-01-16 11:04:06 +0000766#elif defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +0000767 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000768 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbceeac81996-05-23 22:53:47 +0000769 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000770 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000771#elif defined(MS_WINDOWS)
Fred Drake0e123952000-06-29 21:31:02 +0000772 {
773 double millisecs = secs * 1000.0;
774 if (millisecs > (double)ULONG_MAX) {
775 PyErr_SetString(PyExc_OverflowError, "sleep length is too large");
776 return -1;
777 }
778 /* XXX Can't interrupt this sleep */
779 Py_BEGIN_ALLOW_THREADS
780 Sleep((unsigned long)millisecs);
781 Py_END_ALLOW_THREADS
782 }
Martin v. Löwis02af9642002-01-16 11:04:06 +0000783#elif defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000784 /* This Sleep *IS* Interruptable by Exceptions */
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000785 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000786 if (DosSleep(secs * 1000) != NO_ERROR) {
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000787 Py_BLOCK_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000788 PyErr_SetFromErrno(PyExc_IOError);
789 return -1;
790 }
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000791 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000792#elif defined(__BEOS__)
Guido van Rossumbcc20741998-08-04 22:53:56 +0000793 /* This sleep *CAN BE* interrupted. */
794 {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000795 if( secs <= 0.0 ) {
796 return;
797 }
Guido van Rossum10b164a2001-09-25 13:59:01 +0000798
Guido van Rossumbcc20741998-08-04 22:53:56 +0000799 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000800 /* BeOS snooze() is in microseconds... */
801 if( snooze( (bigtime_t)( secs * 1000.0 * 1000.0 ) ) == B_INTERRUPTED ) {
Guido van Rossumbcc20741998-08-04 22:53:56 +0000802 Py_BLOCK_THREADS
803 PyErr_SetFromErrno( PyExc_IOError );
804 return -1;
805 }
806 Py_END_ALLOW_THREADS
807 }
Martin v. Löwis02af9642002-01-16 11:04:06 +0000808#elif defined(RISCOS)
Guido van Rossumbceccf52001-04-10 22:07:43 +0000809 if (secs <= 0.0)
810 return 0;
811 Py_BEGIN_ALLOW_THREADS
812 /* This sleep *CAN BE* interrupted. */
813 if ( sleep(secs) )
814 return -1;
815 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000816#elif defined(PLAN9)
817 {
818 double millisecs = secs * 1000.0;
819 if (millisecs > (double)LONG_MAX) {
820 PyErr_SetString(PyExc_OverflowError, "sleep length is too large");
821 return -1;
822 }
823 /* This sleep *CAN BE* interrupted. */
824 Py_BEGIN_ALLOW_THREADS
825 if(sleep((long)millisecs) < 0){
826 Py_BLOCK_THREADS
827 PyErr_SetFromErrno(PyExc_IOError);
828 return -1;
829 }
830 Py_END_ALLOW_THREADS
831 }
832#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000833 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000834 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000835 sleep((int)secs);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000836 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000837#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000838
Guido van Rossumb6775db1994-08-01 11:34:53 +0000839 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000840}