annotate Modules/_datetimemodule.c @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents eb07691f2c29
children e0d451e24c43 9fba12ceb2fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1 /* C implementation for the date/time type documented at
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2 * http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5 #include "Python.h"
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
6 #include "structmember.h"
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
7
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
8 #include <time.h>
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
9
63757
c16803bbd790 Issue #9079: Added _PyTime_gettimeofday(_PyTime_timeval *tp) to C API
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63184
diff changeset
10 #include "_time.h"
32393
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
11
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
12 /* Differentiate between building the core module and building extension
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
13 * modules.
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
14 */
41716
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41684
diff changeset
15 #ifndef Py_BUILD_CORE
32393
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
16 #define Py_BUILD_CORE
41716
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41684
diff changeset
17 #endif
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
18 #include "datetime.h"
32393
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
19 #undef Py_BUILD_CORE
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
20
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
21 /* We require that C int be at least 32 bits, and use int virtually
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
22 * everywhere. In just a few cases we use a temp long, where a Python
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
23 * API returns a C long. In such cases, we have to ensure that the
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
24 * final result fits in a C int (this can be an issue on 64-bit boxes).
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
25 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
26 #if SIZEOF_INT < 4
63184
afdb53323065 Issue #7989: Added pure python implementation of the datetime module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62858
diff changeset
27 # error "_datetime.c requires that C int have at least 32 bits"
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
28 #endif
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
29
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
30 #define MINYEAR 1
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
31 #define MAXYEAR 9999
61951
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
32 #define MAXORDINAL 3652059 /* date(9999,12,31).toordinal() */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
33
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
34 /* Nine decimal digits is easy to communicate, and leaves enough room
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
35 * so that two delta days can be added w/o fear of overflowing a signed
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
36 * 32-bit int, and with plenty of room left over to absorb any possible
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
37 * carries from adding seconds.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
38 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
39 #define MAX_DELTA_DAYS 999999999
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
40
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
41 /* Rename the long macros in datetime.h to more reasonable short names. */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
42 #define GET_YEAR PyDateTime_GET_YEAR
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
43 #define GET_MONTH PyDateTime_GET_MONTH
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
44 #define GET_DAY PyDateTime_GET_DAY
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
45 #define DATE_GET_HOUR PyDateTime_DATE_GET_HOUR
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
46 #define DATE_GET_MINUTE PyDateTime_DATE_GET_MINUTE
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
47 #define DATE_GET_SECOND PyDateTime_DATE_GET_SECOND
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
48 #define DATE_GET_MICROSECOND PyDateTime_DATE_GET_MICROSECOND
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
49
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
50 /* Date accessors for date and datetime. */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
51 #define SET_YEAR(o, v) (((o)->data[0] = ((v) & 0xff00) >> 8), \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
52 ((o)->data[1] = ((v) & 0x00ff)))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
53 #define SET_MONTH(o, v) (PyDateTime_GET_MONTH(o) = (v))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
54 #define SET_DAY(o, v) (PyDateTime_GET_DAY(o) = (v))
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
55
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
56 /* Date/Time accessors for datetime. */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
57 #define DATE_SET_HOUR(o, v) (PyDateTime_DATE_GET_HOUR(o) = (v))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
58 #define DATE_SET_MINUTE(o, v) (PyDateTime_DATE_GET_MINUTE(o) = (v))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
59 #define DATE_SET_SECOND(o, v) (PyDateTime_DATE_GET_SECOND(o) = (v))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
60 #define DATE_SET_MICROSECOND(o, v) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
61 (((o)->data[7] = ((v) & 0xff0000) >> 16), \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
62 ((o)->data[8] = ((v) & 0x00ff00) >> 8), \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
63 ((o)->data[9] = ((v) & 0x0000ff)))
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
64
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
65 /* Time accessors for time. */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
66 #define TIME_GET_HOUR PyDateTime_TIME_GET_HOUR
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
67 #define TIME_GET_MINUTE PyDateTime_TIME_GET_MINUTE
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
68 #define TIME_GET_SECOND PyDateTime_TIME_GET_SECOND
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
69 #define TIME_GET_MICROSECOND PyDateTime_TIME_GET_MICROSECOND
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
70 #define TIME_SET_HOUR(o, v) (PyDateTime_TIME_GET_HOUR(o) = (v))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
71 #define TIME_SET_MINUTE(o, v) (PyDateTime_TIME_GET_MINUTE(o) = (v))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
72 #define TIME_SET_SECOND(o, v) (PyDateTime_TIME_GET_SECOND(o) = (v))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
73 #define TIME_SET_MICROSECOND(o, v) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
74 (((o)->data[3] = ((v) & 0xff0000) >> 16), \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
75 ((o)->data[4] = ((v) & 0x00ff00) >> 8), \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
76 ((o)->data[5] = ((v) & 0x0000ff)))
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
77
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
78 /* Delta accessors for timedelta. */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
79 #define GET_TD_DAYS(o) (((PyDateTime_Delta *)(o))->days)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
80 #define GET_TD_SECONDS(o) (((PyDateTime_Delta *)(o))->seconds)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
81 #define GET_TD_MICROSECONDS(o) (((PyDateTime_Delta *)(o))->microseconds)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
82
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
83 #define SET_TD_DAYS(o, v) ((o)->days = (v))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
84 #define SET_TD_SECONDS(o, v) ((o)->seconds = (v))
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
85 #define SET_TD_MICROSECONDS(o, v) ((o)->microseconds = (v))
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
86
27217
10b7e60245b5 Minor fiddling to make the next part easier. Introduced an internal
Tim Peters <tim.peters@gmail.com>
parents: 27199
diff changeset
87 /* p is a pointer to a time or a datetime object; HASTZINFO(p) returns
10b7e60245b5 Minor fiddling to make the next part easier. Introduced an internal
Tim Peters <tim.peters@gmail.com>
parents: 27199
diff changeset
88 * p->hastzinfo.
10b7e60245b5 Minor fiddling to make the next part easier. Introduced an internal
Tim Peters <tim.peters@gmail.com>
parents: 27199
diff changeset
89 */
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
90 #define HASTZINFO(p) (((_PyDateTime_BaseTZInfo *)(p))->hastzinfo)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
91 #define GET_TIME_TZINFO(p) (HASTZINFO(p) ? \
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
92 ((PyDateTime_Time *)(p))->tzinfo : Py_None)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
93 #define GET_DT_TZINFO(p) (HASTZINFO(p) ? \
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
94 ((PyDateTime_DateTime *)(p))->tzinfo : Py_None)
31760
9536b297d83c SF bug 847019 datetime.datetime initialization needs more strict checking
Tim Peters <tim.peters@gmail.com>
parents: 31608
diff changeset
95 /* M is a char or int claiming to be a valid month. The macro is equivalent
9536b297d83c SF bug 847019 datetime.datetime initialization needs more strict checking
Tim Peters <tim.peters@gmail.com>
parents: 31608
diff changeset
96 * to the two-sided Python test
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
97 * 1 <= M <= 12
31760
9536b297d83c SF bug 847019 datetime.datetime initialization needs more strict checking
Tim Peters <tim.peters@gmail.com>
parents: 31608
diff changeset
98 */
9536b297d83c SF bug 847019 datetime.datetime initialization needs more strict checking
Tim Peters <tim.peters@gmail.com>
parents: 31608
diff changeset
99 #define MONTH_IS_SANE(M) ((unsigned int)(M) - 1 < 12)
9536b297d83c SF bug 847019 datetime.datetime initialization needs more strict checking
Tim Peters <tim.peters@gmail.com>
parents: 31608
diff changeset
100
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
101 /* Forward declarations. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
102 static PyTypeObject PyDateTime_DateType;
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
103 static PyTypeObject PyDateTime_DateTimeType;
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
104 static PyTypeObject PyDateTime_DeltaType;
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
105 static PyTypeObject PyDateTime_TimeType;
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
106 static PyTypeObject PyDateTime_TZInfoType;
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
107 static PyTypeObject PyDateTime_TimeZoneType;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
108
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
109 /* ---------------------------------------------------------------------------
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
110 * Math utilities.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
111 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
112
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
113 /* k = i+j overflows iff k differs in sign from both inputs,
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
114 * iff k^i has sign bit set and k^j has sign bit set,
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
115 * iff (k^i)&(k^j) has sign bit set.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
116 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
117 #define SIGNED_ADD_OVERFLOWED(RESULT, I, J) \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
118 ((((RESULT) ^ (I)) & ((RESULT) ^ (J))) < 0)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
119
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
120 /* Compute Python divmod(x, y), returning the quotient and storing the
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
121 * remainder into *r. The quotient is the floor of x/y, and that's
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
122 * the real point of this. C will probably truncate instead (C99
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
123 * requires truncation; C89 left it implementation-defined).
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
124 * Simplification: we *require* that y > 0 here. That's appropriate
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
125 * for all the uses made of it. This simplifies the code and makes
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
126 * the overflow case impossible (divmod(LONG_MIN, -1) is the only
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
127 * overflow case).
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
128 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
129 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
130 divmod(int x, int y, int *r)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
131 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
132 int quo;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
133
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
134 assert(y > 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
135 quo = x / y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
136 *r = x - quo * y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
137 if (*r < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
138 --quo;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
139 *r += y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
140 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
141 assert(0 <= *r && *r < y);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
142 return quo;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
143 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
144
27029
d279d763f462 SF bug 661086: datetime.today() truncates microseconds.
Tim Peters <tim.peters@gmail.com>
parents: 27011
diff changeset
145 /* Round a double to the nearest long. |x| must be small enough to fit
d279d763f462 SF bug 661086: datetime.today() truncates microseconds.
Tim Peters <tim.peters@gmail.com>
parents: 27011
diff changeset
146 * in a C long; this is not checked.
d279d763f462 SF bug 661086: datetime.today() truncates microseconds.
Tim Peters <tim.peters@gmail.com>
parents: 27011
diff changeset
147 */
d279d763f462 SF bug 661086: datetime.today() truncates microseconds.
Tim Peters <tim.peters@gmail.com>
parents: 27011
diff changeset
148 static long
d279d763f462 SF bug 661086: datetime.today() truncates microseconds.
Tim Peters <tim.peters@gmail.com>
parents: 27011
diff changeset
149 round_to_long(double x)
d279d763f462 SF bug 661086: datetime.today() truncates microseconds.
Tim Peters <tim.peters@gmail.com>
parents: 27011
diff changeset
150 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
151 if (x >= 0.0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
152 x = floor(x + 0.5);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
153 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
154 x = ceil(x - 0.5);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
155 return (long)x;
27029
d279d763f462 SF bug 661086: datetime.today() truncates microseconds.
Tim Peters <tim.peters@gmail.com>
parents: 27011
diff changeset
156 }
d279d763f462 SF bug 661086: datetime.today() truncates microseconds.
Tim Peters <tim.peters@gmail.com>
parents: 27011
diff changeset
157
62002
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
158 /* Nearest integer to m / n for integers m and n. Half-integer results
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
159 * are rounded to even.
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
160 */
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
161 static PyObject *
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
162 divide_nearest(PyObject *m, PyObject *n)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
163 {
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
164 PyObject *result;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
165 PyObject *temp;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
166
62154
0d9347934cc5 Fix naming inconsistency.
Mark Dickinson <dickinsm@gmail.com>
parents: 62059
diff changeset
167 temp = _PyLong_DivmodNear(m, n);
62002
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
168 if (temp == NULL)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
169 return NULL;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
170 result = PyTuple_GET_ITEM(temp, 0);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
171 Py_INCREF(result);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
172 Py_DECREF(temp);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
173
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
174 return result;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
175 }
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
176
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
177 /* ---------------------------------------------------------------------------
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
178 * General calendrical helper functions
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
179 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
180
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
181 /* For each month ordinal in 1..12, the number of days in that month,
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
182 * and the number of days before that month in the same year. These
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
183 * are correct for non-leap years only.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
184 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
185 static int _days_in_month[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
186 0, /* unused; this vector uses 1-based indexing */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
187 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
188 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
189
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
190 static int _days_before_month[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
191 0, /* unused; this vector uses 1-based indexing */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
192 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
193 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
194
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
195 /* year -> 1 if leap year, else 0. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
196 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
197 is_leap(int year)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
198 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
199 /* Cast year to unsigned. The result is the same either way, but
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
200 * C can generate faster code for unsigned mod than for signed
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
201 * mod (especially for % 4 -- a good compiler should just grab
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
202 * the last 2 bits when the LHS is unsigned).
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
203 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
204 const unsigned int ayear = (unsigned int)year;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
205 return ayear % 4 == 0 && (ayear % 100 != 0 || ayear % 400 == 0);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
206 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
207
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
208 /* year, month -> number of days in that month in that year */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
209 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
210 days_in_month(int year, int month)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
211 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
212 assert(month >= 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
213 assert(month <= 12);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
214 if (month == 2 && is_leap(year))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
215 return 29;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
216 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
217 return _days_in_month[month];
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
218 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
219
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
220 /* year, month -> number of days in year preceeding first day of month */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
221 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
222 days_before_month(int year, int month)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
223 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
224 int days;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
225
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
226 assert(month >= 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
227 assert(month <= 12);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
228 days = _days_before_month[month];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
229 if (month > 2 && is_leap(year))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
230 ++days;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
231 return days;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
232 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
233
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
234 /* year -> number of days before January 1st of year. Remember that we
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
235 * start with year 1, so days_before_year(1) == 0.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
236 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
237 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
238 days_before_year(int year)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
239 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
240 int y = year - 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
241 /* This is incorrect if year <= 0; we really want the floor
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
242 * here. But so long as MINYEAR is 1, the smallest year this
65276
4c5706bc2f43 Issue 9005: Removed dead code.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63757
diff changeset
243 * can see is 1.
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
244 */
65276
4c5706bc2f43 Issue 9005: Removed dead code.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63757
diff changeset
245 assert (year >= 1);
4c5706bc2f43 Issue 9005: Removed dead code.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63757
diff changeset
246 return y*365 + y/4 - y/100 + y/400;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
247 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
248
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
249 /* Number of days in 4, 100, and 400 year cycles. That these have
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
250 * the correct values is asserted in the module init function.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
251 */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
252 #define DI4Y 1461 /* days_before_year(5); days in 4 years */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
253 #define DI100Y 36524 /* days_before_year(101); days in 100 years */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
254 #define DI400Y 146097 /* days_before_year(401); days in 400 years */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
255
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
256 /* ordinal -> year, month, day, considering 01-Jan-0001 as day 1. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
257 static void
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
258 ord_to_ymd(int ordinal, int *year, int *month, int *day)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
259 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
260 int n, n1, n4, n100, n400, leapyear, preceding;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
261
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
262 /* ordinal is a 1-based index, starting at 1-Jan-1. The pattern of
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
263 * leap years repeats exactly every 400 years. The basic strategy is
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
264 * to find the closest 400-year boundary at or before ordinal, then
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
265 * work with the offset from that boundary to ordinal. Life is much
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
266 * clearer if we subtract 1 from ordinal first -- then the values
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
267 * of ordinal at 400-year boundaries are exactly those divisible
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
268 * by DI400Y:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
269 *
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
270 * D M Y n n-1
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
271 * -- --- ---- ---------- ----------------
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
272 * 31 Dec -400 -DI400Y -DI400Y -1
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
273 * 1 Jan -399 -DI400Y +1 -DI400Y 400-year boundary
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
274 * ...
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
275 * 30 Dec 000 -1 -2
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
276 * 31 Dec 000 0 -1
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
277 * 1 Jan 001 1 0 400-year boundary
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
278 * 2 Jan 001 2 1
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
279 * 3 Jan 001 3 2
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
280 * ...
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
281 * 31 Dec 400 DI400Y DI400Y -1
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
282 * 1 Jan 401 DI400Y +1 DI400Y 400-year boundary
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
283 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
284 assert(ordinal >= 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
285 --ordinal;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
286 n400 = ordinal / DI400Y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
287 n = ordinal % DI400Y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
288 *year = n400 * 400 + 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
289
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
290 /* Now n is the (non-negative) offset, in days, from January 1 of
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
291 * year, to the desired date. Now compute how many 100-year cycles
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
292 * precede n.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
293 * Note that it's possible for n100 to equal 4! In that case 4 full
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
294 * 100-year cycles precede the desired day, which implies the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
295 * desired day is December 31 at the end of a 400-year cycle.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
296 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
297 n100 = n / DI100Y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
298 n = n % DI100Y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
299
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
300 /* Now compute how many 4-year cycles precede it. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
301 n4 = n / DI4Y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
302 n = n % DI4Y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
303
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
304 /* And now how many single years. Again n1 can be 4, and again
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
305 * meaning that the desired day is December 31 at the end of the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
306 * 4-year cycle.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
307 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
308 n1 = n / 365;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
309 n = n % 365;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
310
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
311 *year += n100 * 100 + n4 * 4 + n1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
312 if (n1 == 4 || n100 == 4) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
313 assert(n == 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
314 *year -= 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
315 *month = 12;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
316 *day = 31;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
317 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
318 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
319
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
320 /* Now the year is correct, and n is the offset from January 1. We
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
321 * find the month via an estimate that's either exact or one too
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
322 * large.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
323 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
324 leapyear = n1 == 3 && (n4 != 24 || n100 == 3);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
325 assert(leapyear == is_leap(*year));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
326 *month = (n + 50) >> 5;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
327 preceding = (_days_before_month[*month] + (*month > 2 && leapyear));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
328 if (preceding > n) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
329 /* estimate is too large */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
330 *month -= 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
331 preceding -= days_in_month(*year, *month);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
332 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
333 n -= preceding;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
334 assert(0 <= n);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
335 assert(n < days_in_month(*year, *month));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
336
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
337 *day = n + 1;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
338 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
339
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
340 /* year, month, day -> ordinal, considering 01-Jan-0001 as day 1. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
341 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
342 ymd_to_ord(int year, int month, int day)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
343 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
344 return days_before_year(year) + days_before_month(year, month) + day;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
345 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
346
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
347 /* Day of week, where Monday==0, ..., Sunday==6. 1/1/1 was a Monday. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
348 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
349 weekday(int year, int month, int day)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
350 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
351 return (ymd_to_ord(year, month, day) + 6) % 7;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
352 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
353
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
354 /* Ordinal of the Monday starting week 1 of the ISO year. Week 1 is the
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
355 * first calendar week containing a Thursday.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
356 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
357 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
358 iso_week1_monday(int year)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
359 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
360 int first_day = ymd_to_ord(year, 1, 1); /* ord of 1/1 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
361 /* 0 if 1/1 is a Monday, 1 if a Tue, etc. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
362 int first_weekday = (first_day + 6) % 7;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
363 /* ordinal of closest Monday at or before 1/1 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
364 int week1_monday = first_day - first_weekday;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
365
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
366 if (first_weekday > 3) /* if 1/1 was Fri, Sat, Sun */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
367 week1_monday += 7;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
368 return week1_monday;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
369 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
370
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
371 /* ---------------------------------------------------------------------------
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
372 * Range checkers.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
373 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
374
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
375 /* Check that -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS. If so, return 0.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
376 * If not, raise OverflowError and return -1.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
377 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
378 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
379 check_delta_day_range(int days)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
380 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
381 if (-MAX_DELTA_DAYS <= days && days <= MAX_DELTA_DAYS)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
382 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
383 PyErr_Format(PyExc_OverflowError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
384 "days=%d; must have magnitude <= %d",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
385 days, MAX_DELTA_DAYS);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
386 return -1;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
387 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
388
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
389 /* Check that date arguments are in range. Return 0 if they are. If they
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
390 * aren't, raise ValueError and return -1.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
391 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
392 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
393 check_date_args(int year, int month, int day)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
394 {
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
395
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
396 if (year < MINYEAR || year > MAXYEAR) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
397 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
398 "year is out of range");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
399 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
400 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
401 if (month < 1 || month > 12) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
402 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
403 "month must be in 1..12");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
404 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
405 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
406 if (day < 1 || day > days_in_month(year, month)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
407 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
408 "day is out of range for month");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
409 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
410 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
411 return 0;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
412 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
413
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
414 /* Check that time arguments are in range. Return 0 if they are. If they
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
415 * aren't, raise ValueError and return -1.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
416 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
417 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
418 check_time_args(int h, int m, int s, int us)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
419 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
420 if (h < 0 || h > 23) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
421 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
422 "hour must be in 0..23");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
423 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
424 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
425 if (m < 0 || m > 59) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
426 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
427 "minute must be in 0..59");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
428 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
429 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
430 if (s < 0 || s > 59) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
431 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
432 "second must be in 0..59");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
433 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
434 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
435 if (us < 0 || us > 999999) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
436 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
437 "microsecond must be in 0..999999");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
438 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
439 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
440 return 0;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
441 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
442
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
443 /* ---------------------------------------------------------------------------
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
444 * Normalization utilities.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
445 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
446
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
447 /* One step of a mixed-radix conversion. A "hi" unit is equivalent to
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
448 * factor "lo" units. factor must be > 0. If *lo is less than 0, or
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
449 * at least factor, enough of *lo is converted into "hi" units so that
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
450 * 0 <= *lo < factor. The input values must be such that int overflow
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
451 * is impossible.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
452 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
453 static void
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
454 normalize_pair(int *hi, int *lo, int factor)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
455 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
456 assert(factor > 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
457 assert(lo != hi);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
458 if (*lo < 0 || *lo >= factor) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
459 const int num_hi = divmod(*lo, factor, lo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
460 const int new_hi = *hi + num_hi;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
461 assert(! SIGNED_ADD_OVERFLOWED(new_hi, *hi, num_hi));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
462 *hi = new_hi;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
463 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
464 assert(0 <= *lo && *lo < factor);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
465 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
466
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
467 /* Fiddle days (d), seconds (s), and microseconds (us) so that
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
468 * 0 <= *s < 24*3600
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
469 * 0 <= *us < 1000000
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
470 * The input values must be such that the internals don't overflow.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
471 * The way this routine is used, we don't get close.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
472 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
473 static void
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
474 normalize_d_s_us(int *d, int *s, int *us)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
475 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
476 if (*us < 0 || *us >= 1000000) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
477 normalize_pair(s, us, 1000000);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
478 /* |s| can't be bigger than about
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
479 * |original s| + |original us|/1000000 now.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
480 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
481
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
482 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
483 if (*s < 0 || *s >= 24*3600) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
484 normalize_pair(d, s, 24*3600);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
485 /* |d| can't be bigger than about
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
486 * |original d| +
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
487 * (|original s| + |original us|/1000000) / (24*3600) now.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
488 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
489 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
490 assert(0 <= *s && *s < 24*3600);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
491 assert(0 <= *us && *us < 1000000);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
492 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
493
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
494 /* Fiddle years (y), months (m), and days (d) so that
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
495 * 1 <= *m <= 12
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
496 * 1 <= *d <= days_in_month(*y, *m)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
497 * The input values must be such that the internals don't overflow.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
498 * The way this routine is used, we don't get close.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
499 */
61951
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
500 static int
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
501 normalize_y_m_d(int *y, int *m, int *d)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
502 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
503 int dim; /* # of days in month */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
504
65276
4c5706bc2f43 Issue 9005: Removed dead code.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63757
diff changeset
505 /* In actual use, m is always the month component extracted from a
4c5706bc2f43 Issue 9005: Removed dead code.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63757
diff changeset
506 * date/datetime object. Therefore it is always in [1, 12] range.
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
507 */
65276
4c5706bc2f43 Issue 9005: Removed dead code.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63757
diff changeset
508
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
509 assert(1 <= *m && *m <= 12);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
510
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
511 /* Now only day can be out of bounds (year may also be out of bounds
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
512 * for a datetime object, but we don't care about that here).
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
513 * If day is out of bounds, what to do is arguable, but at least the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
514 * method here is principled and explainable.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
515 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
516 dim = days_in_month(*y, *m);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
517 if (*d < 1 || *d > dim) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
518 /* Move day-1 days from the first of the month. First try to
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
519 * get off cheap if we're only one day out of range
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
520 * (adjustments for timezone alone can't be worse than that).
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
521 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
522 if (*d == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
523 --*m;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
524 if (*m > 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
525 *d = days_in_month(*y, *m);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
526 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
527 --*y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
528 *m = 12;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
529 *d = 31;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
530 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
531 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
532 else if (*d == dim + 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
533 /* move forward a day */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
534 ++*m;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
535 *d = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
536 if (*m > 12) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
537 *m = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
538 ++*y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
539 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
540 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
541 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
542 int ordinal = ymd_to_ord(*y, *m, 1) +
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
543 *d - 1;
61951
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
544 if (ordinal < 1 || ordinal > MAXORDINAL) {
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
545 goto error;
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
546 } else {
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
547 ord_to_ymd(ordinal, y, m, d);
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
548 return 0;
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
549 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
550 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
551 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
552 assert(*m > 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
553 assert(*d > 0);
61951
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
554 if (MINYEAR <= *y && *y <= MAXYEAR)
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
555 return 0;
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
556 error:
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
557 PyErr_SetString(PyExc_OverflowError,
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
558 "date value out of range");
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
559 return -1;
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
560
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
561 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
562
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
563 /* Fiddle out-of-bounds months and days so that the result makes some kind
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
564 * of sense. The parameters are both inputs and outputs. Returns < 0 on
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
565 * failure, where failure means the adjusted year is out of bounds.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
566 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
567 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
568 normalize_date(int *year, int *month, int *day)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
569 {
61951
6b89de36a74f Merged revisions 81566 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
570 return normalize_y_m_d(year, month, day);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
571 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
572
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
573 /* Force all the datetime fields into range. The parameters are both
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
574 * inputs and outputs. Returns < 0 on error.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
575 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
576 static int
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
577 normalize_datetime(int *year, int *month, int *day,
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
578 int *hour, int *minute, int *second,
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
579 int *microsecond)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
580 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
581 normalize_pair(second, microsecond, 1000000);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
582 normalize_pair(minute, second, 60);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
583 normalize_pair(hour, minute, 60);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
584 normalize_pair(day, hour, 24);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
585 return normalize_date(year, month, day);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
586 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
587
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
588 /* ---------------------------------------------------------------------------
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
589 * Basic object allocation: tp_alloc implementations. These allocate
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
590 * Python objects of the right size and type, and do the Python object-
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
591 * initialization bit. If there's not enough memory, they return NULL after
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
592 * setting MemoryError. All data members remain uninitialized trash.
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
593 *
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
594 * We abuse the tp_alloc "nitems" argument to communicate whether a tzinfo
29161
1d4ec52b316c Added more words about the abuse of the tp_alloc nitems argument
Tim Peters <tim.peters@gmail.com>
parents: 29153
diff changeset
595 * member is needed. This is ugly, imprecise, and possibly insecure.
1d4ec52b316c Added more words about the abuse of the tp_alloc nitems argument
Tim Peters <tim.peters@gmail.com>
parents: 29153
diff changeset
596 * tp_basicsize for the time and datetime types is set to the size of the
1d4ec52b316c Added more words about the abuse of the tp_alloc nitems argument
Tim Peters <tim.peters@gmail.com>
parents: 29153
diff changeset
597 * struct that has room for the tzinfo member, so subclasses in Python will
1d4ec52b316c Added more words about the abuse of the tp_alloc nitems argument
Tim Peters <tim.peters@gmail.com>
parents: 29153
diff changeset
598 * allocate enough space for a tzinfo member whether or not one is actually
1d4ec52b316c Added more words about the abuse of the tp_alloc nitems argument
Tim Peters <tim.peters@gmail.com>
parents: 29153
diff changeset
599 * needed. That's the "ugly and imprecise" parts. The "possibly insecure"
1d4ec52b316c Added more words about the abuse of the tp_alloc nitems argument
Tim Peters <tim.peters@gmail.com>
parents: 29153
diff changeset
600 * part is that PyType_GenericAlloc() (which subclasses in Python end up
1d4ec52b316c Added more words about the abuse of the tp_alloc nitems argument
Tim Peters <tim.peters@gmail.com>
parents: 29153
diff changeset
601 * using) just happens today to effectively ignore the nitems argument
1d4ec52b316c Added more words about the abuse of the tp_alloc nitems argument
Tim Peters <tim.peters@gmail.com>
parents: 29153
diff changeset
602 * when tp_itemsize is 0, which it is for these type objects. If that
1d4ec52b316c Added more words about the abuse of the tp_alloc nitems argument
Tim Peters <tim.peters@gmail.com>
parents: 29153
diff changeset
603 * changes, perhaps the callers of tp_alloc slots in this file should
1d4ec52b316c Added more words about the abuse of the tp_alloc nitems argument
Tim Peters <tim.peters@gmail.com>
parents: 29153
diff changeset
604 * be changed to force a 0 nitems argument unless the type being allocated
1d4ec52b316c Added more words about the abuse of the tp_alloc nitems argument
Tim Peters <tim.peters@gmail.com>
parents: 29153
diff changeset
605 * is a base type implemented in this file (so that tp_alloc is time_alloc
1d4ec52b316c Added more words about the abuse of the tp_alloc nitems argument
Tim Peters <tim.peters@gmail.com>
parents: 29153
diff changeset
606 * or datetime_alloc below, which know about the nitems abuse).
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
607 */
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
608
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
609 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
610 time_alloc(PyTypeObject *type, Py_ssize_t aware)
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
611 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
612 PyObject *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
613
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
614 self = (PyObject *)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
615 PyObject_MALLOC(aware ?
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
616 sizeof(PyDateTime_Time) :
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
617 sizeof(_PyDateTime_BaseTime));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
618 if (self == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
619 return (PyObject *)PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
620 PyObject_INIT(self, type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
621 return self;
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
622 }
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
623
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
624 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
625 datetime_alloc(PyTypeObject *type, Py_ssize_t aware)
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
626 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
627 PyObject *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
628
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
629 self = (PyObject *)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
630 PyObject_MALLOC(aware ?
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
631 sizeof(PyDateTime_DateTime) :
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
632 sizeof(_PyDateTime_BaseDateTime));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
633 if (self == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
634 return (PyObject *)PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
635 PyObject_INIT(self, type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
636 return self;
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
637 }
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
638
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
639 /* ---------------------------------------------------------------------------
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
640 * Helpers for setting object fields. These work on pointers to the
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
641 * appropriate base class.
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
642 */
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
643
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
644 /* For date and datetime. */
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
645 static void
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
646 set_date_fields(PyDateTime_Date *self, int y, int m, int d)
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
647 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
648 self->hashcode = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
649 SET_YEAR(self, y);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
650 SET_MONTH(self, m);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
651 SET_DAY(self, d);
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
652 }
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
653
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
654 /* ---------------------------------------------------------------------------
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
655 * Create various objects, mostly without range checking.
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
656 */
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
657
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
658 /* Create a date instance with no range checking. */
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
659 static PyObject *
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
660 new_date_ex(int year, int month, int day, PyTypeObject *type)
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
661 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
662 PyDateTime_Date *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
663
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
664 self = (PyDateTime_Date *) (type->tp_alloc(type, 0));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
665 if (self != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
666 set_date_fields(self, year, month, day);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
667 return (PyObject *) self;
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
668 }
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
669
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
670 #define new_date(year, month, day) \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
671 new_date_ex(year, month, day, &PyDateTime_DateType)
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
672
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
673 /* Create a datetime instance with no range checking. */
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
674 static PyObject *
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
675 new_datetime_ex(int year, int month, int day, int hour, int minute,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
676 int second, int usecond, PyObject *tzinfo, PyTypeObject *type)
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
677 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
678 PyDateTime_DateTime *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
679 char aware = tzinfo != Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
680
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
681 self = (PyDateTime_DateTime *) (type->tp_alloc(type, aware));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
682 if (self != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
683 self->hastzinfo = aware;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
684 set_date_fields((PyDateTime_Date *)self, year, month, day);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
685 DATE_SET_HOUR(self, hour);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
686 DATE_SET_MINUTE(self, minute);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
687 DATE_SET_SECOND(self, second);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
688 DATE_SET_MICROSECOND(self, usecond);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
689 if (aware) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
690 Py_INCREF(tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
691 self->tzinfo = tzinfo;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
692 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
693 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
694 return (PyObject *)self;
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
695 }
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
696
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
697 #define new_datetime(y, m, d, hh, mm, ss, us, tzinfo) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
698 new_datetime_ex(y, m, d, hh, mm, ss, us, tzinfo, \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
699 &PyDateTime_DateTimeType)
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
700
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
701 /* Create a time instance with no range checking. */
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
702 static PyObject *
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
703 new_time_ex(int hour, int minute, int second, int usecond,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
704 PyObject *tzinfo, PyTypeObject *type)
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
705 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
706 PyDateTime_Time *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
707 char aware = tzinfo != Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
708
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
709 self = (PyDateTime_Time *) (type->tp_alloc(type, aware));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
710 if (self != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
711 self->hastzinfo = aware;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
712 self->hashcode = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
713 TIME_SET_HOUR(self, hour);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
714 TIME_SET_MINUTE(self, minute);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
715 TIME_SET_SECOND(self, second);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
716 TIME_SET_MICROSECOND(self, usecond);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
717 if (aware) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
718 Py_INCREF(tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
719 self->tzinfo = tzinfo;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
720 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
721 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
722 return (PyObject *)self;
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
723 }
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
724
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
725 #define new_time(hh, mm, ss, us, tzinfo) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
726 new_time_ex(hh, mm, ss, us, tzinfo, &PyDateTime_TimeType)
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
727
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
728 /* Create a timedelta instance. Normalize the members iff normalize is
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
729 * true. Passing false is a speed optimization, if you know for sure
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
730 * that seconds and microseconds are already in their proper ranges. In any
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
731 * case, raises OverflowError and returns NULL if the normalized days is out
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
732 * of range).
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
733 */
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
734 static PyObject *
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
735 new_delta_ex(int days, int seconds, int microseconds, int normalize,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
736 PyTypeObject *type)
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
737 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
738 PyDateTime_Delta *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
739
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
740 if (normalize)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
741 normalize_d_s_us(&days, &seconds, &microseconds);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
742 assert(0 <= seconds && seconds < 24*3600);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
743 assert(0 <= microseconds && microseconds < 1000000);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
744
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
745 if (check_delta_day_range(days) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
746 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
747
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
748 self = (PyDateTime_Delta *) (type->tp_alloc(type, 0));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
749 if (self != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
750 self->hashcode = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
751 SET_TD_DAYS(self, days);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
752 SET_TD_SECONDS(self, seconds);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
753 SET_TD_MICROSECONDS(self, microseconds);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
754 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
755 return (PyObject *) self;
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
756 }
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
757
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
758 #define new_delta(d, s, us, normalize) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
759 new_delta_ex(d, s, us, normalize, &PyDateTime_DeltaType)
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
760
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
761
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
762 typedef struct
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
763 {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
764 PyObject_HEAD
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
765 PyObject *offset;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
766 PyObject *name;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
767 } PyDateTime_TimeZone;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
768
65319
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
769 /* The interned UTC timezone instance */
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
770 static PyObject *PyDateTime_TimeZone_UTC;
62837
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
771
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
772 /* Create new timezone instance checking offset range. This
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
773 function does not check the name argument. Caller must assure
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
774 that offset is a timedelta instance and name is either NULL
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
775 or a unicode object. */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
776 static PyObject *
65319
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
777 create_timezone(PyObject *offset, PyObject *name)
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
778 {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
779 PyDateTime_TimeZone *self;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
780 PyTypeObject *type = &PyDateTime_TimeZoneType;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
781
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
782 assert(offset != NULL);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
783 assert(PyDelta_Check(offset));
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
784 assert(name == NULL || PyUnicode_Check(name));
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
785
65319
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
786 self = (PyDateTime_TimeZone *)(type->tp_alloc(type, 0));
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
787 if (self == NULL) {
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
788 return NULL;
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
789 }
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
790 Py_INCREF(offset);
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
791 self->offset = offset;
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
792 Py_XINCREF(name);
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
793 self->name = name;
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
794 return (PyObject *)self;
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
795 }
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
796
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
797 static int delta_bool(PyDateTime_Delta *self);
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
798
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
799 static PyObject *
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
800 new_timezone(PyObject *offset, PyObject *name)
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
801 {
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
802 assert(offset != NULL);
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
803 assert(PyDelta_Check(offset));
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
804 assert(name == NULL || PyUnicode_Check(name));
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
805
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
806 if (name == NULL && delta_bool((PyDateTime_Delta *)offset) == 0) {
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
807 Py_INCREF(PyDateTime_TimeZone_UTC);
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
808 return PyDateTime_TimeZone_UTC;
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
809 }
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
810 if (GET_TD_MICROSECONDS(offset) != 0 || GET_TD_SECONDS(offset) % 60 != 0) {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
811 PyErr_Format(PyExc_ValueError, "offset must be a timedelta"
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
812 " representing a whole number of minutes");
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
813 return NULL;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
814 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
815 if ((GET_TD_DAYS(offset) == -1 && GET_TD_SECONDS(offset) == 0) ||
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
816 GET_TD_DAYS(offset) < -1 || GET_TD_DAYS(offset) >= 1) {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
817 PyErr_Format(PyExc_ValueError, "offset must be a timedelta"
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
818 " strictly between -timedelta(hours=24) and"
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
819 " timedelta(hours=24).");
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
820 return NULL;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
821 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
822
65319
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
823 return create_timezone(offset, name);
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
824 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
825
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
826 /* ---------------------------------------------------------------------------
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
827 * tzinfo helpers.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
828 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
829
26743
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
830 /* Ensure that p is None or of a tzinfo subclass. Return 0 if OK; if not
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
831 * raise TypeError and return -1.
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
832 */
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
833 static int
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
834 check_tzinfo_subclass(PyObject *p)
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
835 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
836 if (p == Py_None || PyTZInfo_Check(p))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
837 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
838 PyErr_Format(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
839 "tzinfo argument must be None or of a tzinfo subclass, "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
840 "not type '%s'",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
841 Py_TYPE(p)->tp_name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
842 return -1;
26743
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
843 }
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
844
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
845 /* If self has a tzinfo member, return a BORROWED reference to it. Else
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
846 * return NULL, which is NOT AN ERROR. There are no error returns here,
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
847 * and the caller must not decref the result.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
848 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
849 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
850 get_tzinfo_member(PyObject *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
851 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
852 PyObject *tzinfo = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
853
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
854 if (PyDateTime_Check(self) && HASTZINFO(self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
855 tzinfo = ((PyDateTime_DateTime *)self)->tzinfo;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
856 else if (PyTime_Check(self) && HASTZINFO(self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
857 tzinfo = ((PyDateTime_Time *)self)->tzinfo;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
858
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
859 return tzinfo;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
860 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
861
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
862 /* Call getattr(tzinfo, name)(tzinfoarg), and check the result. tzinfo must
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
863 * be an instance of the tzinfo class. If the method returns None, this
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
864 * returns None. If the method doesn't return None or timedelta, TypeError is
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
865 * raised and this returns NULL. If it returns a timedelta and the value is
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
866 * out of range or isn't a whole number of minutes, ValueError is raised and
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
867 * this returns NULL. Else result is returned.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
868 */
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
869 static PyObject *
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
870 call_tzinfo_method(PyObject *tzinfo, char *name, PyObject *tzinfoarg)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
871 {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
872 PyObject *offset;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
873
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
874 assert(tzinfo != NULL);
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
875 assert(PyTZInfo_Check(tzinfo) || tzinfo == Py_None);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
876 assert(tzinfoarg != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
877
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
878 if (tzinfo == Py_None)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
879 Py_RETURN_NONE;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
880 offset = PyObject_CallMethod(tzinfo, name, "O", tzinfoarg);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
881 if (offset == Py_None || offset == NULL)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
882 return offset;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
883 if (PyDelta_Check(offset)) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
884 if (GET_TD_MICROSECONDS(offset) != 0 || GET_TD_SECONDS(offset) % 60 != 0) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
885 Py_DECREF(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
886 PyErr_Format(PyExc_ValueError, "offset must be a timedelta"
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
887 " representing a whole number of minutes");
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
888 return NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
889 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
890 if ((GET_TD_DAYS(offset) == -1 && GET_TD_SECONDS(offset) == 0) ||
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
891 GET_TD_DAYS(offset) < -1 || GET_TD_DAYS(offset) >= 1) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
892 Py_DECREF(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
893 PyErr_Format(PyExc_ValueError, "offset must be a timedelta"
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
894 " strictly between -timedelta(hours=24) and"
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
895 " timedelta(hours=24).");
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
896 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
897 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
898 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
899 else {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
900 Py_DECREF(offset);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
901 PyErr_Format(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
902 "tzinfo.%s() must return None or "
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
903 "timedelta, not '%.200s'",
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
904 name, Py_TYPE(offset)->tp_name);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
905 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
906 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
907
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
908 return offset;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
909 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
910
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
911 /* Call tzinfo.utcoffset(tzinfoarg), and extract an integer from the
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
912 * result. tzinfo must be an instance of the tzinfo class. If utcoffset()
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
913 * returns None, call_utcoffset returns 0 and sets *none to 1. If uctoffset()
27037
99df0e52f634 The tzinfo methods utcoffset() and dst() must return a timedelta object
Tim Peters <tim.peters@gmail.com>
parents: 27034
diff changeset
914 * doesn't return None or timedelta, TypeError is raised and this returns -1.
99df0e52f634 The tzinfo methods utcoffset() and dst() must return a timedelta object
Tim Peters <tim.peters@gmail.com>
parents: 27034
diff changeset
915 * If utcoffset() returns an invalid timedelta (out of range, or not a whole
99df0e52f634 The tzinfo methods utcoffset() and dst() must return a timedelta object
Tim Peters <tim.peters@gmail.com>
parents: 27034
diff changeset
916 * # of minutes), ValueError is raised and this returns -1. Else *none is
99df0e52f634 The tzinfo methods utcoffset() and dst() must return a timedelta object
Tim Peters <tim.peters@gmail.com>
parents: 27034
diff changeset
917 * set to 0 and the offset is returned (as int # of minutes east of UTC).
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
918 */
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
919 static PyObject *
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
920 call_utcoffset(PyObject *tzinfo, PyObject *tzinfoarg)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
921 {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
922 return call_tzinfo_method(tzinfo, "utcoffset", tzinfoarg);
26743
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
923 }
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
924
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
925 /* Call tzinfo.dst(tzinfoarg), and extract an integer from the
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
926 * result. tzinfo must be an instance of the tzinfo class. If dst()
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
927 * returns None, call_dst returns 0 and sets *none to 1. If dst()
27037
99df0e52f634 The tzinfo methods utcoffset() and dst() must return a timedelta object
Tim Peters <tim.peters@gmail.com>
parents: 27034
diff changeset
928 & doesn't return None or timedelta, TypeError is raised and this
30722
651fc8d98d99 Fix a bunch of typos in documentation, docstrings and comments.
Walter Dörwald <walter@livinglogic.de>
parents: 30683
diff changeset
929 * returns -1. If dst() returns an invalid timedelta for a UTC offset,
27037
99df0e52f634 The tzinfo methods utcoffset() and dst() must return a timedelta object
Tim Peters <tim.peters@gmail.com>
parents: 27034
diff changeset
930 * ValueError is raised and this returns -1. Else *none is set to 0 and
99df0e52f634 The tzinfo methods utcoffset() and dst() must return a timedelta object
Tim Peters <tim.peters@gmail.com>
parents: 27034
diff changeset
931 * the offset is returned (as an int # of minutes east of UTC).
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
932 */
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
933 static PyObject *
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
934 call_dst(PyObject *tzinfo, PyObject *tzinfoarg)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
935 {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
936 return call_tzinfo_method(tzinfo, "dst", tzinfoarg);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
937 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
938
26876
35468ad5022a A step on the way to making tzinfo classes writable by mortals: get rid
Tim Peters <tim.peters@gmail.com>
parents: 26809
diff changeset
939 /* Call tzinfo.tzname(tzinfoarg), and return the result. tzinfo must be
26743
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
940 * an instance of the tzinfo class or None. If tzinfo isn't None, and
26876
35468ad5022a A step on the way to making tzinfo classes writable by mortals: get rid
Tim Peters <tim.peters@gmail.com>
parents: 26809
diff changeset
941 * tzname() doesn't return None or a string, TypeError is raised and this
41841
523df1de0a5c Fix datetime and its test.
Guido van Rossum <guido@python.org>
parents: 41838
diff changeset
942 * returns NULL. If the result is a string, we ensure it is a Unicode
523df1de0a5c Fix datetime and its test.
Guido van Rossum <guido@python.org>
parents: 41838
diff changeset
943 * string.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
944 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
945 static PyObject *
26876
35468ad5022a A step on the way to making tzinfo classes writable by mortals: get rid
Tim Peters <tim.peters@gmail.com>
parents: 26809
diff changeset
946 call_tzname(PyObject *tzinfo, PyObject *tzinfoarg)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
947 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
948 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
949
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
950 assert(tzinfo != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
951 assert(check_tzinfo_subclass(tzinfo) >= 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
952 assert(tzinfoarg != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
953
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
954 if (tzinfo == Py_None)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
955 Py_RETURN_NONE;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
956
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
957 result = PyObject_CallMethod(tzinfo, "tzname", "O", tzinfoarg);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
958
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
959 if (result == NULL || result == Py_None)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
960 return result;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
961
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
962 if (!PyUnicode_Check(result)) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
963 PyErr_Format(PyExc_TypeError, "tzinfo.tzname() must "
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
964 "return None or a string, not '%s'",
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
965 Py_TYPE(result)->tp_name);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
966 Py_DECREF(result);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
967 result = NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
968 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
969
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
970 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
971 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
972
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
973 /* repr is like "someclass(arg1, arg2)". If tzinfo isn't None,
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
974 * stuff
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
975 * ", tzinfo=" + repr(tzinfo)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
976 * before the closing ")".
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
977 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
978 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
979 append_keyword_tzinfo(PyObject *repr, PyObject *tzinfo)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
980 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
981 PyObject *temp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
982
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
983 assert(PyUnicode_Check(repr));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
984 assert(tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
985 if (tzinfo == Py_None)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
986 return repr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
987 /* Get rid of the trailing ')'. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
988 assert(PyUnicode_AS_UNICODE(repr)[PyUnicode_GET_SIZE(repr)-1] == ')');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
989 temp = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(repr),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
990 PyUnicode_GET_SIZE(repr) - 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
991 Py_DECREF(repr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
992 if (temp == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
993 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
994 repr = PyUnicode_FromFormat("%U, tzinfo=%R)", temp, tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
995 Py_DECREF(temp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
996 return repr;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
997 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
998
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
999 /* ---------------------------------------------------------------------------
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1000 * String format helpers.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1001 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1002
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1003 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
1004 format_ctime(PyDateTime_Date *date, int hours, int minutes, int seconds)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1005 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1006 static const char *DayNames[] = {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1007 "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1008 };
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1009 static const char *MonthNames[] = {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1010 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1011 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1012 };
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1013
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1014 int wday = weekday(GET_YEAR(date), GET_MONTH(date), GET_DAY(date));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1015
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1016 return PyUnicode_FromFormat("%s %s %2d %02d:%02d:%02d %04d",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1017 DayNames[wday], MonthNames[GET_MONTH(date)-1],
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1018 GET_DAY(date), hours, minutes, seconds,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1019 GET_YEAR(date));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1020 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1021
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1022 static PyObject *delta_negative(PyDateTime_Delta *self);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1023
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1024 /* Add an hours & minutes UTC offset string to buf. buf has no more than
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1025 * buflen bytes remaining. The UTC offset is gotten by calling
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1026 * tzinfo.uctoffset(tzinfoarg). If that returns None, \0 is stored into
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1027 * *buf, and that's all. Else the returned value is checked for sanity (an
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1028 * integer in range), and if that's OK it's converted to an hours & minutes
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1029 * string of the form
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1030 * sign HH sep MM
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1031 * Returns 0 if everything is OK. If the return value from utcoffset() is
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1032 * bogus, an appropriate exception is set and -1 is returned.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1033 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1034 static int
26728
5fba51f3729b format_utcoffset(): The natural type of the buflen arg is size_t, so
Tim Peters <tim.peters@gmail.com>
parents: 26712
diff changeset
1035 format_utcoffset(char *buf, size_t buflen, const char *sep,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1036 PyObject *tzinfo, PyObject *tzinfoarg)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1037 {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1038 PyObject *offset;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1039 int hours, minutes, seconds;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1040 char sign;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1041
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1042 assert(buflen >= 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1043
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1044 offset = call_utcoffset(tzinfo, tzinfoarg);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1045 if (offset == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1046 return -1;
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1047 if (offset == Py_None) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1048 Py_DECREF(offset);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1049 *buf = '\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1050 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1051 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1052 /* Offset is normalized, so it is negative if days < 0 */
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1053 if (GET_TD_DAYS(offset) < 0) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1054 PyObject *temp = offset;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1055 sign = '-';
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1056 offset = delta_negative((PyDateTime_Delta *)offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1057 Py_DECREF(temp);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1058 if (offset == NULL)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1059 return -1;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1060 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1061 else {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1062 sign = '+';
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1063 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1064 /* Offset is not negative here. */
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1065 seconds = GET_TD_SECONDS(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1066 Py_DECREF(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1067 minutes = divmod(seconds, 60, &seconds);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1068 hours = divmod(minutes, 60, &minutes);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1069 assert(seconds == 0);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1070 /* XXX ignore sub-minute data, curently not allowed. */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1071 PyOS_snprintf(buf, buflen, "%c%02d%s%02d", sign, hours, sep, minutes);
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1072
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1073 return 0;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1074 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1075
41842
eb188d7fea5d Refactor to avoid ultra-deeply-nested code.
Guido van Rossum <guido@python.org>
parents: 41841
diff changeset
1076 static PyObject *
eb188d7fea5d Refactor to avoid ultra-deeply-nested code.
Guido van Rossum <guido@python.org>
parents: 41841
diff changeset
1077 make_Zreplacement(PyObject *object, PyObject *tzinfoarg)
eb188d7fea5d Refactor to avoid ultra-deeply-nested code.
Guido van Rossum <guido@python.org>
parents: 41841
diff changeset
1078 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1079 PyObject *temp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1080 PyObject *tzinfo = get_tzinfo_member(object);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1081 PyObject *Zreplacement = PyUnicode_FromStringAndSize(NULL, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1082 if (Zreplacement == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1083 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1084 if (tzinfo == Py_None || tzinfo == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1085 return Zreplacement;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1086
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1087 assert(tzinfoarg != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1088 temp = call_tzname(tzinfo, tzinfoarg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1089 if (temp == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1090 goto Error;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1091 if (temp == Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1092 Py_DECREF(temp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1093 return Zreplacement;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1094 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1095
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1096 assert(PyUnicode_Check(temp));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1097 /* Since the tzname is getting stuffed into the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1098 * format, we have to double any % signs so that
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1099 * strftime doesn't treat them as format codes.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1100 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1101 Py_DECREF(Zreplacement);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1102 Zreplacement = PyObject_CallMethod(temp, "replace", "ss", "%", "%%");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1103 Py_DECREF(temp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1104 if (Zreplacement == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1105 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1106 if (!PyUnicode_Check(Zreplacement)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1107 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1108 "tzname.replace() did not return a string");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1109 goto Error;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1110 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1111 return Zreplacement;
41842
eb188d7fea5d Refactor to avoid ultra-deeply-nested code.
Guido van Rossum <guido@python.org>
parents: 41841
diff changeset
1112
eb188d7fea5d Refactor to avoid ultra-deeply-nested code.
Guido van Rossum <guido@python.org>
parents: 41841
diff changeset
1113 Error:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1114 Py_DECREF(Zreplacement);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1115 return NULL;
41842
eb188d7fea5d Refactor to avoid ultra-deeply-nested code.
Guido van Rossum <guido@python.org>
parents: 41841
diff changeset
1116 }
eb188d7fea5d Refactor to avoid ultra-deeply-nested code.
Guido van Rossum <guido@python.org>
parents: 41841
diff changeset
1117
45773
832c820e9d14 Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45382
diff changeset
1118 static PyObject *
832c820e9d14 Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45382
diff changeset
1119 make_freplacement(PyObject *object)
832c820e9d14 Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45382
diff changeset
1120 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1121 char freplacement[64];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1122 if (PyTime_Check(object))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1123 sprintf(freplacement, "%06d", TIME_GET_MICROSECOND(object));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1124 else if (PyDateTime_Check(object))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1125 sprintf(freplacement, "%06d", DATE_GET_MICROSECOND(object));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1126 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1127 sprintf(freplacement, "%06d", 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1128
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1129 return PyBytes_FromStringAndSize(freplacement, strlen(freplacement));
45773
832c820e9d14 Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45382
diff changeset
1130 }
832c820e9d14 Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45382
diff changeset
1131
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1132 /* I sure don't want to reproduce the strftime code from the time module,
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1133 * so this imports the module and calls it. All the hair is due to
45773
832c820e9d14 Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45382
diff changeset
1134 * giving special meanings to the %z, %Z and %f format codes via a
832c820e9d14 Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45382
diff changeset
1135 * preprocessing step on the format string.
26876
35468ad5022a A step on the way to making tzinfo classes writable by mortals: get rid
Tim Peters <tim.peters@gmail.com>
parents: 26809
diff changeset
1136 * tzinfoarg is the argument to pass to the object's tzinfo method, if
35468ad5022a A step on the way to making tzinfo classes writable by mortals: get rid
Tim Peters <tim.peters@gmail.com>
parents: 26809
diff changeset
1137 * needed.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1138 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1139 static PyObject *
26876
35468ad5022a A step on the way to making tzinfo classes writable by mortals: get rid
Tim Peters <tim.peters@gmail.com>
parents: 26809
diff changeset
1140 wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1141 PyObject *tzinfoarg)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1142 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1143 PyObject *result = NULL; /* guilty until proved innocent */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1144
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1145 PyObject *zreplacement = NULL; /* py string, replacement for %z */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1146 PyObject *Zreplacement = NULL; /* py string, replacement for %Z */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1147 PyObject *freplacement = NULL; /* py string, replacement for %f */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1148
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1149 const char *pin; /* pointer to next char in input format */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1150 Py_ssize_t flen; /* length of input format */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1151 char ch; /* next char in input format */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1152
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1153 PyObject *newfmt = NULL; /* py string, the output format */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1154 char *pnew; /* pointer to available byte in output format */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1155 size_t totalnew; /* number bytes total in output format buffer,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1156 exclusive of trailing \0 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1157 size_t usednew; /* number bytes used so far in output format buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1158
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1159 const char *ptoappend; /* ptr to string to append to output buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1160 Py_ssize_t ntoappend; /* # of bytes to append to output buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1161
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1162 assert(object && format && timetuple);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1163 assert(PyUnicode_Check(format));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1164 /* Convert the input format to a C string and size */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1165 pin = _PyUnicode_AsStringAndSize(format, &flen);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1166 if (!pin)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1167 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1168
67450
31465968ae26 Issue #1777412: extended year range of strftime down to 1000.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66799
diff changeset
1169 /* Give up if the year is before 1000.
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1170 * Python strftime() plays games with the year, and different
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1171 * games depending on whether envar PYTHON2K is set. This makes
67450
31465968ae26 Issue #1777412: extended year range of strftime down to 1000.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66799
diff changeset
1172 * years before 1000 a nightmare, even if the platform strftime
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1173 * supports them (and not all do).
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1174 * We could get a lot farther here by avoiding Python's strftime
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1175 * wrapper and calling the C strftime() directly, but that isn't
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1176 * an option in the Python implementation of this module.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1177 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1178 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1179 long year;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1180 PyObject *pyyear = PySequence_GetItem(timetuple, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1181 if (pyyear == NULL) return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1182 assert(PyLong_Check(pyyear));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1183 year = PyLong_AsLong(pyyear);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1184 Py_DECREF(pyyear);
67450
31465968ae26 Issue #1777412: extended year range of strftime down to 1000.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66799
diff changeset
1185 if (year < 1000) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1186 PyErr_Format(PyExc_ValueError, "year=%ld is before "
67450
31465968ae26 Issue #1777412: extended year range of strftime down to 1000.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66799
diff changeset
1187 "1000; the datetime strftime() "
31465968ae26 Issue #1777412: extended year range of strftime down to 1000.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66799
diff changeset
1188 "methods require year >= 1000",
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1189 year);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1190 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1191 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1192 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1193
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1194 /* Scan the input format, looking for %z/%Z/%f escapes, building
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1195 * a new format. Since computing the replacements for those codes
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1196 * is expensive, don't unless they're actually used.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1197 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1198 if (flen > INT_MAX - 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1199 PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1200 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1201 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1202
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1203 totalnew = flen + 1; /* realistic if no %z/%Z */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1204 newfmt = PyBytes_FromStringAndSize(NULL, totalnew);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1205 if (newfmt == NULL) goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1206 pnew = PyBytes_AsString(newfmt);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1207 usednew = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1208
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1209 while ((ch = *pin++) != '\0') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1210 if (ch != '%') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1211 ptoappend = pin - 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1212 ntoappend = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1213 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1214 else if ((ch = *pin++) == '\0') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1215 /* There's a lone trailing %; doesn't make sense. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1216 PyErr_SetString(PyExc_ValueError, "strftime format "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1217 "ends with raw %");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1218 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1219 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1220 /* A % has been seen and ch is the character after it. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1221 else if (ch == 'z') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1222 if (zreplacement == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1223 /* format utcoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1224 char buf[100];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1225 PyObject *tzinfo = get_tzinfo_member(object);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1226 zreplacement = PyBytes_FromStringAndSize("", 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1227 if (zreplacement == NULL) goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1228 if (tzinfo != Py_None && tzinfo != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1229 assert(tzinfoarg != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1230 if (format_utcoffset(buf,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1231 sizeof(buf),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1232 "",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1233 tzinfo,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1234 tzinfoarg) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1235 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1236 Py_DECREF(zreplacement);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1237 zreplacement =
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1238 PyBytes_FromStringAndSize(buf,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1239 strlen(buf));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1240 if (zreplacement == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1241 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1242 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1243 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1244 assert(zreplacement != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1245 ptoappend = PyBytes_AS_STRING(zreplacement);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1246 ntoappend = PyBytes_GET_SIZE(zreplacement);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1247 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1248 else if (ch == 'Z') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1249 /* format tzname */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1250 if (Zreplacement == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1251 Zreplacement = make_Zreplacement(object,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1252 tzinfoarg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1253 if (Zreplacement == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1254 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1255 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1256 assert(Zreplacement != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1257 assert(PyUnicode_Check(Zreplacement));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1258 ptoappend = _PyUnicode_AsStringAndSize(Zreplacement,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1259 &ntoappend);
66799
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66556
diff changeset
1260 if (ptoappend == NULL)
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66556
diff changeset
1261 goto Done;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1262 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1263 else if (ch == 'f') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1264 /* format microseconds */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1265 if (freplacement == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1266 freplacement = make_freplacement(object);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1267 if (freplacement == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1268 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1269 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1270 assert(freplacement != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1271 assert(PyBytes_Check(freplacement));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1272 ptoappend = PyBytes_AS_STRING(freplacement);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1273 ntoappend = PyBytes_GET_SIZE(freplacement);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1274 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1275 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1276 /* percent followed by neither z nor Z */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1277 ptoappend = pin - 2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1278 ntoappend = 2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1279 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1280
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1281 /* Append the ntoappend chars starting at ptoappend to
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1282 * the new format.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1283 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1284 if (ntoappend == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1285 continue;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1286 assert(ptoappend != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1287 assert(ntoappend > 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1288 while (usednew + ntoappend > totalnew) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1289 size_t bigger = totalnew << 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1290 if ((bigger >> 1) != totalnew) { /* overflow */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1291 PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1292 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1293 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1294 if (_PyBytes_Resize(&newfmt, bigger) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1295 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1296 totalnew = bigger;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1297 pnew = PyBytes_AsString(newfmt) + usednew;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1298 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1299 memcpy(pnew, ptoappend, ntoappend);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1300 pnew += ntoappend;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1301 usednew += ntoappend;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1302 assert(usednew <= totalnew);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1303 } /* end while() */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1304
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1305 if (_PyBytes_Resize(&newfmt, usednew) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1306 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1307 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1308 PyObject *format;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1309 PyObject *time = PyImport_ImportModuleNoBlock("time");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1310 if (time == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1311 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1312 format = PyUnicode_FromString(PyBytes_AS_STRING(newfmt));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1313 if (format != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1314 result = PyObject_CallMethod(time, "strftime", "OO",
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1315 format, timetuple, NULL);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1316 Py_DECREF(format);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1317 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1318 Py_DECREF(time);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1319 }
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1320 Done:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1321 Py_XDECREF(freplacement);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1322 Py_XDECREF(zreplacement);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1323 Py_XDECREF(Zreplacement);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1324 Py_XDECREF(newfmt);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1325 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1326 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1327
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1328 /* ---------------------------------------------------------------------------
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1329 * Wrap functions from the time module. These aren't directly available
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1330 * from C. Perhaps they should be.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1331 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1332
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1333 /* Call time.time() and return its result (a Python float). */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1334 static PyObject *
26675
bc9056d847ef Fix GCC warnings. It turns out two out of three pointed to real bugs!
Guido van Rossum <guido@python.org>
parents: 26673
diff changeset
1335 time_time(void)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1336 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1337 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1338 PyObject *time = PyImport_ImportModuleNoBlock("time");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1339
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1340 if (time != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1341 result = PyObject_CallMethod(time, "time", "()");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1342 Py_DECREF(time);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1343 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1344 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1345 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1346
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1347 /* Build a time.struct_time. The weekday and day number are automatically
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1348 * computed from the y,m,d args.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1349 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1350 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1351 build_struct_time(int y, int m, int d, int hh, int mm, int ss, int dstflag)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1352 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1353 PyObject *time;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1354 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1355
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1356 time = PyImport_ImportModuleNoBlock("time");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1357 if (time != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1358 result = PyObject_CallMethod(time, "struct_time",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1359 "((iiiiiiiii))",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1360 y, m, d,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1361 hh, mm, ss,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1362 weekday(y, m, d),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1363 days_before_month(y, m) + d,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1364 dstflag);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1365 Py_DECREF(time);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1366 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1367 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1368 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1369
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1370 /* ---------------------------------------------------------------------------
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1371 * Miscellaneous helpers.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1372 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1373
51271
87fbbf22adf3 Merged revisions 69214 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50829
diff changeset
1374 /* For various reasons, we need to use tp_richcompare instead of tp_reserved.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1375 * The comparisons here all most naturally compute a cmp()-like result.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1376 * This little helper turns that into a bool result for rich comparisons.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1377 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1378 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1379 diff_to_bool(int diff, int op)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1380 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1381 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1382 int istrue;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1383
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1384 switch (op) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1385 case Py_EQ: istrue = diff == 0; break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1386 case Py_NE: istrue = diff != 0; break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1387 case Py_LE: istrue = diff <= 0; break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1388 case Py_GE: istrue = diff >= 0; break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1389 case Py_LT: istrue = diff < 0; break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1390 case Py_GT: istrue = diff > 0; break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1391 default:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1392 assert(! "op unknown");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1393 istrue = 0; /* To shut up compiler */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1394 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1395 result = istrue ? Py_True : Py_False;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1396 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1397 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1398 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1399
27763
fc88174c0c0a Comparison for timedelta, time, date and datetime objects: __eq__ and
Tim Peters <tim.peters@gmail.com>
parents: 27682
diff changeset
1400 /* Raises a "can't compare" TypeError and returns NULL. */
fc88174c0c0a Comparison for timedelta, time, date and datetime objects: __eq__ and
Tim Peters <tim.peters@gmail.com>
parents: 27682
diff changeset
1401 static PyObject *
fc88174c0c0a Comparison for timedelta, time, date and datetime objects: __eq__ and
Tim Peters <tim.peters@gmail.com>
parents: 27682
diff changeset
1402 cmperror(PyObject *a, PyObject *b)
fc88174c0c0a Comparison for timedelta, time, date and datetime objects: __eq__ and
Tim Peters <tim.peters@gmail.com>
parents: 27682
diff changeset
1403 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1404 PyErr_Format(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1405 "can't compare %s to %s",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1406 Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1407 return NULL;
27763
fc88174c0c0a Comparison for timedelta, time, date and datetime objects: __eq__ and
Tim Peters <tim.peters@gmail.com>
parents: 27682
diff changeset
1408 }
fc88174c0c0a Comparison for timedelta, time, date and datetime objects: __eq__ and
Tim Peters <tim.peters@gmail.com>
parents: 27682
diff changeset
1409
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1410 /* ---------------------------------------------------------------------------
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1411 * Cached Python objects; these are set by the module init function.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1412 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1413
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1414 /* Conversion factors. */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1415 static PyObject *us_per_us = NULL; /* 1 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1416 static PyObject *us_per_ms = NULL; /* 1000 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1417 static PyObject *us_per_second = NULL; /* 1000000 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1418 static PyObject *us_per_minute = NULL; /* 1e6 * 60 as Python int */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1419 static PyObject *us_per_hour = NULL; /* 1e6 * 3600 as Python long */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1420 static PyObject *us_per_day = NULL; /* 1e6 * 3600 * 24 as Python long */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1421 static PyObject *us_per_week = NULL; /* 1e6*3600*24*7 as Python long */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1422 static PyObject *seconds_per_day = NULL; /* 3600*24 as Python int */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1423
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1424 /* ---------------------------------------------------------------------------
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1425 * Class implementations.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1426 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1427
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1428 /*
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1429 * PyDateTime_Delta implementation.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1430 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1431
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1432 /* Convert a timedelta to a number of us,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1433 * (24*3600*self.days + self.seconds)*1000000 + self.microseconds
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1434 * as a Python int or long.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1435 * Doing mixed-radix arithmetic by hand instead is excruciating in C,
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1436 * due to ubiquitous overflow possibilities.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1437 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1438 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1439 delta_to_microseconds(PyDateTime_Delta *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1440 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1441 PyObject *x1 = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1442 PyObject *x2 = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1443 PyObject *x3 = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1444 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1445
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1446 x1 = PyLong_FromLong(GET_TD_DAYS(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1447 if (x1 == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1448 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1449 x2 = PyNumber_Multiply(x1, seconds_per_day); /* days in seconds */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1450 if (x2 == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1451 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1452 Py_DECREF(x1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1453 x1 = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1454
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1455 /* x2 has days in seconds */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1456 x1 = PyLong_FromLong(GET_TD_SECONDS(self)); /* seconds */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1457 if (x1 == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1458 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1459 x3 = PyNumber_Add(x1, x2); /* days and seconds in seconds */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1460 if (x3 == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1461 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1462 Py_DECREF(x1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1463 Py_DECREF(x2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1464 x1 = x2 = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1465
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1466 /* x3 has days+seconds in seconds */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1467 x1 = PyNumber_Multiply(x3, us_per_second); /* us */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1468 if (x1 == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1469 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1470 Py_DECREF(x3);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1471 x3 = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1472
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1473 /* x1 has days+seconds in us */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1474 x2 = PyLong_FromLong(GET_TD_MICROSECONDS(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1475 if (x2 == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1476 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1477 result = PyNumber_Add(x1, x2);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1478
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1479 Done:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1480 Py_XDECREF(x1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1481 Py_XDECREF(x2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1482 Py_XDECREF(x3);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1483 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1484 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1485
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1486 /* Convert a number of us (as a Python int or long) to a timedelta.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1487 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1488 static PyObject *
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
1489 microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1490 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1491 int us;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1492 int s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1493 int d;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1494 long temp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1495
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1496 PyObject *tuple = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1497 PyObject *num = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1498 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1499
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1500 tuple = PyNumber_Divmod(pyus, us_per_second);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1501 if (tuple == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1502 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1503
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1504 num = PyTuple_GetItem(tuple, 1); /* us */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1505 if (num == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1506 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1507 temp = PyLong_AsLong(num);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1508 num = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1509 if (temp == -1 && PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1510 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1511 assert(0 <= temp && temp < 1000000);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1512 us = (int)temp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1513 if (us < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1514 /* The divisor was positive, so this must be an error. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1515 assert(PyErr_Occurred());
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1516 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1517 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1518
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1519 num = PyTuple_GetItem(tuple, 0); /* leftover seconds */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1520 if (num == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1521 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1522 Py_INCREF(num);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1523 Py_DECREF(tuple);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1524
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1525 tuple = PyNumber_Divmod(num, seconds_per_day);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1526 if (tuple == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1527 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1528 Py_DECREF(num);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1529
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1530 num = PyTuple_GetItem(tuple, 1); /* seconds */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1531 if (num == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1532 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1533 temp = PyLong_AsLong(num);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1534 num = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1535 if (temp == -1 && PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1536 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1537 assert(0 <= temp && temp < 24*3600);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1538 s = (int)temp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1539
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1540 if (s < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1541 /* The divisor was positive, so this must be an error. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1542 assert(PyErr_Occurred());
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1543 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1544 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1545
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1546 num = PyTuple_GetItem(tuple, 0); /* leftover days */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1547 if (num == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1548 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1549 Py_INCREF(num);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1550 temp = PyLong_AsLong(num);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1551 if (temp == -1 && PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1552 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1553 d = (int)temp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1554 if ((long)d != temp) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1555 PyErr_SetString(PyExc_OverflowError, "normalized days too "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1556 "large to fit in a C int");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1557 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1558 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1559 result = new_delta_ex(d, s, us, 0, type);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1560
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1561 Done:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1562 Py_XDECREF(tuple);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1563 Py_XDECREF(num);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1564 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1565 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1566
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1567 #define microseconds_to_delta(pymicros) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1568 microseconds_to_delta_ex(pymicros, &PyDateTime_DeltaType)
29153
16721d73ad29 datetime.timedelta is now subclassable in Python. The new test shows
Tim Peters <tim.peters@gmail.com>
parents: 29149
diff changeset
1569
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1570 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1571 multiply_int_timedelta(PyObject *intobj, PyDateTime_Delta *delta)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1572 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1573 PyObject *pyus_in;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1574 PyObject *pyus_out;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1575 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1576
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1577 pyus_in = delta_to_microseconds(delta);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1578 if (pyus_in == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1579 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1580
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1581 pyus_out = PyNumber_Multiply(pyus_in, intobj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1582 Py_DECREF(pyus_in);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1583 if (pyus_out == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1584 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1585
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1586 result = microseconds_to_delta(pyus_out);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1587 Py_DECREF(pyus_out);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1588 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1589 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1590
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1591 static PyObject *
62002
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1592 multiply_float_timedelta(PyObject *floatobj, PyDateTime_Delta *delta)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1593 {
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1594 PyObject *result = NULL;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1595 PyObject *pyus_in = NULL, *temp, *pyus_out;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1596 PyObject *ratio = NULL;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1597
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1598 pyus_in = delta_to_microseconds(delta);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1599 if (pyus_in == NULL)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1600 return NULL;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1601 ratio = PyObject_CallMethod(floatobj, "as_integer_ratio", NULL);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1602 if (ratio == NULL)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1603 goto error;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1604 temp = PyNumber_Multiply(pyus_in, PyTuple_GET_ITEM(ratio, 0));
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1605 Py_DECREF(pyus_in);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1606 pyus_in = NULL;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1607 if (temp == NULL)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1608 goto error;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1609 pyus_out = divide_nearest(temp, PyTuple_GET_ITEM(ratio, 1));
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1610 Py_DECREF(temp);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1611 if (pyus_out == NULL)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1612 goto error;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1613 result = microseconds_to_delta(pyus_out);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1614 Py_DECREF(pyus_out);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1615 error:
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1616 Py_XDECREF(pyus_in);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1617 Py_XDECREF(ratio);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1618
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1619 return result;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1620 }
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1621
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1622 static PyObject *
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1623 divide_timedelta_int(PyDateTime_Delta *delta, PyObject *intobj)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1624 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1625 PyObject *pyus_in;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1626 PyObject *pyus_out;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1627 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1628
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1629 pyus_in = delta_to_microseconds(delta);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1630 if (pyus_in == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1631 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1632
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1633 pyus_out = PyNumber_FloorDivide(pyus_in, intobj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1634 Py_DECREF(pyus_in);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1635 if (pyus_out == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1636 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1637
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1638 result = microseconds_to_delta(pyus_out);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1639 Py_DECREF(pyus_out);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1640 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1641 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1642
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1643 static PyObject *
60793
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1644 divide_timedelta_timedelta(PyDateTime_Delta *left, PyDateTime_Delta *right)
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1645 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1646 PyObject *pyus_left;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1647 PyObject *pyus_right;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1648 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1649
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1650 pyus_left = delta_to_microseconds(left);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1651 if (pyus_left == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1652 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1653
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1654 pyus_right = delta_to_microseconds(right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1655 if (pyus_right == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1656 Py_DECREF(pyus_left);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1657 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1658 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1659
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1660 result = PyNumber_FloorDivide(pyus_left, pyus_right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1661 Py_DECREF(pyus_left);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1662 Py_DECREF(pyus_right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1663 return result;
60793
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1664 }
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1665
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1666 static PyObject *
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1667 truedivide_timedelta_timedelta(PyDateTime_Delta *left, PyDateTime_Delta *right)
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1668 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1669 PyObject *pyus_left;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1670 PyObject *pyus_right;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1671 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1672
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1673 pyus_left = delta_to_microseconds(left);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1674 if (pyus_left == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1675 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1676
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1677 pyus_right = delta_to_microseconds(right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1678 if (pyus_right == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1679 Py_DECREF(pyus_left);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1680 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1681 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1682
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1683 result = PyNumber_TrueDivide(pyus_left, pyus_right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1684 Py_DECREF(pyus_left);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1685 Py_DECREF(pyus_right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1686 return result;
60793
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1687 }
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1688
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1689 static PyObject *
62002
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1690 truedivide_timedelta_float(PyDateTime_Delta *delta, PyObject *f)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1691 {
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1692 PyObject *result = NULL;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1693 PyObject *pyus_in = NULL, *temp, *pyus_out;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1694 PyObject *ratio = NULL;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1695
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1696 pyus_in = delta_to_microseconds(delta);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1697 if (pyus_in == NULL)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1698 return NULL;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1699 ratio = PyObject_CallMethod(f, "as_integer_ratio", NULL);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1700 if (ratio == NULL)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1701 goto error;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1702 temp = PyNumber_Multiply(pyus_in, PyTuple_GET_ITEM(ratio, 1));
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1703 Py_DECREF(pyus_in);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1704 pyus_in = NULL;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1705 if (temp == NULL)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1706 goto error;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1707 pyus_out = divide_nearest(temp, PyTuple_GET_ITEM(ratio, 0));
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1708 Py_DECREF(temp);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1709 if (pyus_out == NULL)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1710 goto error;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1711 result = microseconds_to_delta(pyus_out);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1712 Py_DECREF(pyus_out);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1713 error:
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1714 Py_XDECREF(pyus_in);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1715 Py_XDECREF(ratio);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1716
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1717 return result;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1718 }
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1719
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1720 static PyObject *
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1721 truedivide_timedelta_int(PyDateTime_Delta *delta, PyObject *i)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1722 {
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1723 PyObject *result;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1724 PyObject *pyus_in, *pyus_out;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1725 pyus_in = delta_to_microseconds(delta);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1726 if (pyus_in == NULL)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1727 return NULL;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1728 pyus_out = divide_nearest(pyus_in, i);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1729 Py_DECREF(pyus_in);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1730 if (pyus_out == NULL)
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1731 return NULL;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1732 result = microseconds_to_delta(pyus_out);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1733 Py_DECREF(pyus_out);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1734
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1735 return result;
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1736 }
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1737
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1738 static PyObject *
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1739 delta_add(PyObject *left, PyObject *right)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1740 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1741 PyObject *result = Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1742
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1743 if (PyDelta_Check(left) && PyDelta_Check(right)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1744 /* delta + delta */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1745 /* The C-level additions can't overflow because of the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1746 * invariant bounds.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1747 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1748 int days = GET_TD_DAYS(left) + GET_TD_DAYS(right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1749 int seconds = GET_TD_SECONDS(left) + GET_TD_SECONDS(right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1750 int microseconds = GET_TD_MICROSECONDS(left) +
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1751 GET_TD_MICROSECONDS(right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1752 result = new_delta(days, seconds, microseconds, 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1753 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1754
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1755 if (result == Py_NotImplemented)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1756 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1757 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1758 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1759
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1760 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1761 delta_negative(PyDateTime_Delta *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1762 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1763 return new_delta(-GET_TD_DAYS(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1764 -GET_TD_SECONDS(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1765 -GET_TD_MICROSECONDS(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1766 1);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1767 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1768
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1769 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1770 delta_positive(PyDateTime_Delta *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1771 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1772 /* Could optimize this (by returning self) if this isn't a
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1773 * subclass -- but who uses unary + ? Approximately nobody.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1774 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1775 return new_delta(GET_TD_DAYS(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1776 GET_TD_SECONDS(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1777 GET_TD_MICROSECONDS(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1778 0);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1779 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1780
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1781 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1782 delta_abs(PyDateTime_Delta *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1783 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1784 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1785
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1786 assert(GET_TD_MICROSECONDS(self) >= 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1787 assert(GET_TD_SECONDS(self) >= 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1788
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1789 if (GET_TD_DAYS(self) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1790 result = delta_negative(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1791 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1792 result = delta_positive(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1793
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1794 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1795 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1796
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1797 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1798 delta_subtract(PyObject *left, PyObject *right)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1799 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1800 PyObject *result = Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1801
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1802 if (PyDelta_Check(left) && PyDelta_Check(right)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1803 /* delta - delta */
69163
76180cc853b6 Issue #11576: Fixed timedelta subtraction glitch on big timedelta values
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
1804 /* The C-level additions can't overflow because of the
76180cc853b6 Issue #11576: Fixed timedelta subtraction glitch on big timedelta values
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
1805 * invariant bounds.
76180cc853b6 Issue #11576: Fixed timedelta subtraction glitch on big timedelta values
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
1806 */
76180cc853b6 Issue #11576: Fixed timedelta subtraction glitch on big timedelta values
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
1807 int days = GET_TD_DAYS(left) - GET_TD_DAYS(right);
76180cc853b6 Issue #11576: Fixed timedelta subtraction glitch on big timedelta values
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
1808 int seconds = GET_TD_SECONDS(left) - GET_TD_SECONDS(right);
76180cc853b6 Issue #11576: Fixed timedelta subtraction glitch on big timedelta values
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
1809 int microseconds = GET_TD_MICROSECONDS(left) -
76180cc853b6 Issue #11576: Fixed timedelta subtraction glitch on big timedelta values
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
1810 GET_TD_MICROSECONDS(right);
76180cc853b6 Issue #11576: Fixed timedelta subtraction glitch on big timedelta values
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
1811 result = new_delta(days, seconds, microseconds, 1);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1812 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1813
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1814 if (result == Py_NotImplemented)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1815 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1816 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1817 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1818
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1819 static int
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1820 delta_cmp(PyObject *self, PyObject *other)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1821 {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1822 int diff = GET_TD_DAYS(self) - GET_TD_DAYS(other);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1823 if (diff == 0) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1824 diff = GET_TD_SECONDS(self) - GET_TD_SECONDS(other);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1825 if (diff == 0)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1826 diff = GET_TD_MICROSECONDS(self) -
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1827 GET_TD_MICROSECONDS(other);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1828 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1829 return diff;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1830 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1831
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1832 static PyObject *
39651
1cf5285c8ab9 Fix the datetime comparison conundrum.
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
1833 delta_richcompare(PyObject *self, PyObject *other, int op)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1834 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1835 if (PyDelta_Check(other)) {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
1836 int diff = delta_cmp(self, other);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1837 return diff_to_bool(diff, op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1838 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1839 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1840 Py_INCREF(Py_NotImplemented);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1841 return Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1842 }
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1843 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1844
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1845 static PyObject *delta_getstate(PyDateTime_Delta *self);
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1846
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65319
diff changeset
1847 static Py_hash_t
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1848 delta_hash(PyDateTime_Delta *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1849 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1850 if (self->hashcode == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1851 PyObject *temp = delta_getstate(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1852 if (temp != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1853 self->hashcode = PyObject_Hash(temp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1854 Py_DECREF(temp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1855 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1856 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1857 return self->hashcode;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1858 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1859
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1860 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1861 delta_multiply(PyObject *left, PyObject *right)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1862 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1863 PyObject *result = Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1864
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1865 if (PyDelta_Check(left)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1866 /* delta * ??? */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1867 if (PyLong_Check(right))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1868 result = multiply_int_timedelta(right,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1869 (PyDateTime_Delta *) left);
62002
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1870 else if (PyFloat_Check(right))
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1871 result = multiply_float_timedelta(right,
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1872 (PyDateTime_Delta *) left);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1873 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1874 else if (PyLong_Check(left))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1875 result = multiply_int_timedelta(left,
62002
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1876 (PyDateTime_Delta *) right);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1877 else if (PyFloat_Check(left))
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1878 result = multiply_float_timedelta(left,
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1879 (PyDateTime_Delta *) right);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1880
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1881 if (result == Py_NotImplemented)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1882 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1883 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1884 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1885
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1886 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1887 delta_divide(PyObject *left, PyObject *right)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1888 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1889 PyObject *result = Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1890
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1891 if (PyDelta_Check(left)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1892 /* delta * ??? */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1893 if (PyLong_Check(right))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1894 result = divide_timedelta_int(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1895 (PyDateTime_Delta *)left,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1896 right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1897 else if (PyDelta_Check(right))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1898 result = divide_timedelta_timedelta(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1899 (PyDateTime_Delta *)left,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1900 (PyDateTime_Delta *)right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1901 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1902
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1903 if (result == Py_NotImplemented)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1904 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1905 return result;
60793
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1906 }
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1907
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1908 static PyObject *
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1909 delta_truedivide(PyObject *left, PyObject *right)
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1910 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1911 PyObject *result = Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1912
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1913 if (PyDelta_Check(left)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1914 if (PyDelta_Check(right))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1915 result = truedivide_timedelta_timedelta(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1916 (PyDateTime_Delta *)left,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1917 (PyDateTime_Delta *)right);
62002
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1918 else if (PyFloat_Check(right))
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1919 result = truedivide_timedelta_float(
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1920 (PyDateTime_Delta *)left, right);
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1921 else if (PyLong_Check(right))
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1922 result = truedivide_timedelta_int(
3e6425c221ec Issue #1289118: datetime.timedelta objects can now be multiplied by float
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61951
diff changeset
1923 (PyDateTime_Delta *)left, right);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1924 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1925
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1926 if (result == Py_NotImplemented)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1927 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1928 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1929 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1930
60793
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1931 static PyObject *
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1932 delta_remainder(PyObject *left, PyObject *right)
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1933 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1934 PyObject *pyus_left;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1935 PyObject *pyus_right;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1936 PyObject *pyus_remainder;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1937 PyObject *remainder;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1938
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1939 if (!PyDelta_Check(left) || !PyDelta_Check(right)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1940 Py_INCREF(Py_NotImplemented);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1941 return Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1942 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1943
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1944 pyus_left = delta_to_microseconds((PyDateTime_Delta *)left);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1945 if (pyus_left == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1946 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1947
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1948 pyus_right = delta_to_microseconds((PyDateTime_Delta *)right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1949 if (pyus_right == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1950 Py_DECREF(pyus_left);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1951 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1952 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1953
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1954 pyus_remainder = PyNumber_Remainder(pyus_left, pyus_right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1955 Py_DECREF(pyus_left);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1956 Py_DECREF(pyus_right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1957 if (pyus_remainder == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1958 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1959
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1960 remainder = microseconds_to_delta(pyus_remainder);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1961 Py_DECREF(pyus_remainder);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1962 if (remainder == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1963 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1964
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1965 return remainder;
60793
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1966 }
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1967
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1968 static PyObject *
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1969 delta_divmod(PyObject *left, PyObject *right)
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
1970 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1971 PyObject *pyus_left;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1972 PyObject *pyus_right;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1973 PyObject *divmod;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1974 PyObject *delta;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1975 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1976
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1977 if (!PyDelta_Check(left) || !PyDelta_Check(right)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1978 Py_INCREF(Py_NotImplemented);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1979 return Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1980 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1981
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1982 pyus_left = delta_to_microseconds((PyDateTime_Delta *)left);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1983 if (pyus_left == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1984 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1985
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1986 pyus_right = delta_to_microseconds((PyDateTime_Delta *)right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1987 if (pyus_right == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1988 Py_DECREF(pyus_left);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1989 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1990 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1991
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1992 divmod = PyNumber_Divmod(pyus_left, pyus_right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1993 Py_DECREF(pyus_left);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1994 Py_DECREF(pyus_right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1995 if (divmod == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1996 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1997
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1998 assert(PyTuple_Size(divmod) == 2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
1999 delta = microseconds_to_delta(PyTuple_GET_ITEM(divmod, 1));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2000 if (delta == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2001 Py_DECREF(divmod);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2002 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2003 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2004 result = PyTuple_Pack(2, PyTuple_GET_ITEM(divmod, 0), delta);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2005 Py_DECREF(delta);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2006 Py_DECREF(divmod);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2007 return result;
60793
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
2008 }
8b36f7175238 Issue #2706: Add support for dividing a timedelta by another timedelta.
Mark Dickinson <dickinsm@gmail.com>
parents: 60504
diff changeset
2009
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2010 /* Fold in the value of the tag ("seconds", "weeks", etc) component of a
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2011 * timedelta constructor. sofar is the # of microseconds accounted for
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2012 * so far, and there are factor microseconds per current unit, the number
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2013 * of which is given by num. num * factor is added to sofar in a
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2014 * numerically careful way, and that's the result. Any fractional
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2015 * microseconds left over (this can happen if num is a float type) are
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2016 * added into *leftover.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2017 * Note that there are many ways this can give an error (NULL) return.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2018 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2019 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2020 accum(const char* tag, PyObject *sofar, PyObject *num, PyObject *factor,
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2021 double *leftover)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2022 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2023 PyObject *prod;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2024 PyObject *sum;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2025
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2026 assert(num != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2027
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2028 if (PyLong_Check(num)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2029 prod = PyNumber_Multiply(num, factor);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2030 if (prod == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2031 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2032 sum = PyNumber_Add(sofar, prod);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2033 Py_DECREF(prod);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2034 return sum;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2035 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2036
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2037 if (PyFloat_Check(num)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2038 double dnum;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2039 double fracpart;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2040 double intpart;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2041 PyObject *x;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2042 PyObject *y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2043
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2044 /* The Plan: decompose num into an integer part and a
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2045 * fractional part, num = intpart + fracpart.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2046 * Then num * factor ==
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2047 * intpart * factor + fracpart * factor
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2048 * and the LHS can be computed exactly in long arithmetic.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2049 * The RHS is again broken into an int part and frac part.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2050 * and the frac part is added into *leftover.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2051 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2052 dnum = PyFloat_AsDouble(num);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2053 if (dnum == -1.0 && PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2054 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2055 fracpart = modf(dnum, &intpart);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2056 x = PyLong_FromDouble(intpart);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2057 if (x == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2058 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2059
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2060 prod = PyNumber_Multiply(x, factor);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2061 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2062 if (prod == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2063 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2064
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2065 sum = PyNumber_Add(sofar, prod);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2066 Py_DECREF(prod);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2067 if (sum == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2068 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2069
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2070 if (fracpart == 0.0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2071 return sum;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2072 /* So far we've lost no information. Dealing with the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2073 * fractional part requires float arithmetic, and may
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2074 * lose a little info.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2075 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2076 assert(PyLong_Check(factor));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2077 dnum = PyLong_AsDouble(factor);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2078
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2079 dnum *= fracpart;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2080 fracpart = modf(dnum, &intpart);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2081 x = PyLong_FromDouble(intpart);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2082 if (x == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2083 Py_DECREF(sum);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2084 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2085 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2086
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2087 y = PyNumber_Add(sum, x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2088 Py_DECREF(sum);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2089 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2090 *leftover += fracpart;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2091 return y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2092 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2093
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2094 PyErr_Format(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2095 "unsupported type for timedelta %s component: %s",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2096 tag, Py_TYPE(num)->tp_name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2097 return NULL;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2098 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2099
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2100 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2101 delta_new(PyTypeObject *type, PyObject *args, PyObject *kw)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2102 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2103 PyObject *self = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2104
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2105 /* Argument objects. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2106 PyObject *day = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2107 PyObject *second = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2108 PyObject *us = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2109 PyObject *ms = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2110 PyObject *minute = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2111 PyObject *hour = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2112 PyObject *week = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2113
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2114 PyObject *x = NULL; /* running sum of microseconds */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2115 PyObject *y = NULL; /* temp sum of microseconds */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2116 double leftover_us = 0.0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2117
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2118 static char *keywords[] = {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2119 "days", "seconds", "microseconds", "milliseconds",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2120 "minutes", "hours", "weeks", NULL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2121 };
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2122
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2123 if (PyArg_ParseTupleAndKeywords(args, kw, "|OOOOOOO:__new__",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2124 keywords,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2125 &day, &second, &us,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2126 &ms, &minute, &hour, &week) == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2127 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2128
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2129 x = PyLong_FromLong(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2130 if (x == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2131 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2132
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2133 #define CLEANUP \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2134 Py_DECREF(x); \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2135 x = y; \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2136 if (x == NULL) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2137 goto Done
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2138
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2139 if (us) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2140 y = accum("microseconds", x, us, us_per_us, &leftover_us);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2141 CLEANUP;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2142 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2143 if (ms) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2144 y = accum("milliseconds", x, ms, us_per_ms, &leftover_us);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2145 CLEANUP;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2146 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2147 if (second) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2148 y = accum("seconds", x, second, us_per_second, &leftover_us);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2149 CLEANUP;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2150 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2151 if (minute) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2152 y = accum("minutes", x, minute, us_per_minute, &leftover_us);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2153 CLEANUP;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2154 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2155 if (hour) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2156 y = accum("hours", x, hour, us_per_hour, &leftover_us);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2157 CLEANUP;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2158 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2159 if (day) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2160 y = accum("days", x, day, us_per_day, &leftover_us);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2161 CLEANUP;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2162 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2163 if (week) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2164 y = accum("weeks", x, week, us_per_week, &leftover_us);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2165 CLEANUP;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2166 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2167 if (leftover_us) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2168 /* Round to nearest whole # of us, and add into x. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2169 PyObject *temp = PyLong_FromLong(round_to_long(leftover_us));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2170 if (temp == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2171 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2172 goto Done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2173 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2174 y = PyNumber_Add(x, temp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2175 Py_DECREF(temp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2176 CLEANUP;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2177 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2178
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2179 self = microseconds_to_delta_ex(x, type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2180 Py_DECREF(x);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2181 Done:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2182 return self;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2183
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2184 #undef CLEANUP
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2185 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2186
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2187 static int
40401
88133417dfd0 - patch #1600346 submitted by Tomer Filiba
Jack Diederich <jackdied@gmail.com>
parents: 39651
diff changeset
2188 delta_bool(PyDateTime_Delta *self)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2189 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2190 return (GET_TD_DAYS(self) != 0
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2191 || GET_TD_SECONDS(self) != 0
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2192 || GET_TD_MICROSECONDS(self) != 0);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2193 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2194
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2195 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2196 delta_repr(PyDateTime_Delta *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2197 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2198 if (GET_TD_MICROSECONDS(self) != 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2199 return PyUnicode_FromFormat("%s(%d, %d, %d)",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2200 Py_TYPE(self)->tp_name,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2201 GET_TD_DAYS(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2202 GET_TD_SECONDS(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2203 GET_TD_MICROSECONDS(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2204 if (GET_TD_SECONDS(self) != 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2205 return PyUnicode_FromFormat("%s(%d, %d)",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2206 Py_TYPE(self)->tp_name,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2207 GET_TD_DAYS(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2208 GET_TD_SECONDS(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2209
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2210 return PyUnicode_FromFormat("%s(%d)",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2211 Py_TYPE(self)->tp_name,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2212 GET_TD_DAYS(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2213 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2214
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2215 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2216 delta_str(PyDateTime_Delta *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2217 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2218 int us = GET_TD_MICROSECONDS(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2219 int seconds = GET_TD_SECONDS(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2220 int minutes = divmod(seconds, 60, &seconds);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2221 int hours = divmod(minutes, 60, &minutes);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2222 int days = GET_TD_DAYS(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2223
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2224 if (days) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2225 if (us)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2226 return PyUnicode_FromFormat("%d day%s, %d:%02d:%02d.%06d",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2227 days, (days == 1 || days == -1) ? "" : "s",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2228 hours, minutes, seconds, us);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2229 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2230 return PyUnicode_FromFormat("%d day%s, %d:%02d:%02d",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2231 days, (days == 1 || days == -1) ? "" : "s",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2232 hours, minutes, seconds);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2233 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2234 if (us)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2235 return PyUnicode_FromFormat("%d:%02d:%02d.%06d",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2236 hours, minutes, seconds, us);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2237 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2238 return PyUnicode_FromFormat("%d:%02d:%02d",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2239 hours, minutes, seconds);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2240 }
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2241
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2242 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2243
27572
f235f135f3f8 All over: changed comments to reflect pickling is straightforward now,
Tim Peters <tim.peters@gmail.com>
parents: 27571
diff changeset
2244 /* Pickle support, a simple use of __reduce__. */
f235f135f3f8 All over: changed comments to reflect pickling is straightforward now,
Tim Peters <tim.peters@gmail.com>
parents: 27571
diff changeset
2245
27575
3b9fb57fac34 There's no good reason for datetime objects to expose __getstate__()
Tim Peters <tim.peters@gmail.com>
parents: 27573
diff changeset
2246 /* __getstate__ isn't exposed */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2247 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2248 delta_getstate(PyDateTime_Delta *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2249 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2250 return Py_BuildValue("iii", GET_TD_DAYS(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2251 GET_TD_SECONDS(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2252 GET_TD_MICROSECONDS(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2253 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2254
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2255 static PyObject *
57462
a85471c47514 Merged revisions 76529 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53816
diff changeset
2256 delta_total_seconds(PyObject *self)
a85471c47514 Merged revisions 76529 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53816
diff changeset
2257 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2258 PyObject *total_seconds;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2259 PyObject *total_microseconds;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2260 PyObject *one_million;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2261
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2262 total_microseconds = delta_to_microseconds((PyDateTime_Delta *)self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2263 if (total_microseconds == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2264 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2265
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2266 one_million = PyLong_FromLong(1000000L);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2267 if (one_million == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2268 Py_DECREF(total_microseconds);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2269 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2270 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2271
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2272 total_seconds = PyNumber_TrueDivide(total_microseconds, one_million);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2273
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2274 Py_DECREF(total_microseconds);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2275 Py_DECREF(one_million);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2276 return total_seconds;
57462
a85471c47514 Merged revisions 76529 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53816
diff changeset
2277 }
a85471c47514 Merged revisions 76529 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53816
diff changeset
2278
a85471c47514 Merged revisions 76529 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53816
diff changeset
2279 static PyObject *
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2280 delta_reduce(PyDateTime_Delta* self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2281 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2282 return Py_BuildValue("ON", Py_TYPE(self), delta_getstate(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2283 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2284
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2285 #define OFFSET(field) offsetof(PyDateTime_Delta, field)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2286
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2287 static PyMemberDef delta_members[] = {
27538
87943faf4fd2 Change the approach to pickling to use __reduce__ everywhere. Most
Guido van Rossum <guido@python.org>
parents: 27365
diff changeset
2288
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2289 {"days", T_INT, OFFSET(days), READONLY,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2290 PyDoc_STR("Number of days.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2291
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2292 {"seconds", T_INT, OFFSET(seconds), READONLY,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2293 PyDoc_STR("Number of seconds (>= 0 and less than 1 day).")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2294
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2295 {"microseconds", T_INT, OFFSET(microseconds), READONLY,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2296 PyDoc_STR("Number of microseconds (>= 0 and less than 1 second).")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2297 {NULL}
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2298 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2299
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2300 static PyMethodDef delta_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2301 {"total_seconds", (PyCFunction)delta_total_seconds, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2302 PyDoc_STR("Total seconds in the duration.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2303
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2304 {"__reduce__", (PyCFunction)delta_reduce, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2305 PyDoc_STR("__reduce__() -> (cls, state)")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2306
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2307 {NULL, NULL},
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2308 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2309
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2310 static char delta_doc[] =
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2311 PyDoc_STR("Difference between two datetime values.");
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2312
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2313 static PyNumberMethods delta_as_number = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2314 delta_add, /* nb_add */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2315 delta_subtract, /* nb_subtract */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2316 delta_multiply, /* nb_multiply */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2317 delta_remainder, /* nb_remainder */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2318 delta_divmod, /* nb_divmod */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2319 0, /* nb_power */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2320 (unaryfunc)delta_negative, /* nb_negative */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2321 (unaryfunc)delta_positive, /* nb_positive */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2322 (unaryfunc)delta_abs, /* nb_absolute */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2323 (inquiry)delta_bool, /* nb_bool */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2324 0, /*nb_invert*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2325 0, /*nb_lshift*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2326 0, /*nb_rshift*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2327 0, /*nb_and*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2328 0, /*nb_xor*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2329 0, /*nb_or*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2330 0, /*nb_int*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2331 0, /*nb_reserved*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2332 0, /*nb_float*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2333 0, /*nb_inplace_add*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2334 0, /*nb_inplace_subtract*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2335 0, /*nb_inplace_multiply*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2336 0, /*nb_inplace_remainder*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2337 0, /*nb_inplace_power*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2338 0, /*nb_inplace_lshift*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2339 0, /*nb_inplace_rshift*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2340 0, /*nb_inplace_and*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2341 0, /*nb_inplace_xor*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2342 0, /*nb_inplace_or*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2343 delta_divide, /* nb_floor_divide */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2344 delta_truedivide, /* nb_true_divide */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2345 0, /* nb_inplace_floor_divide */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2346 0, /* nb_inplace_true_divide */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2347 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2348
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2349 static PyTypeObject PyDateTime_DeltaType = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2350 PyVarObject_HEAD_INIT(NULL, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2351 "datetime.timedelta", /* tp_name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2352 sizeof(PyDateTime_Delta), /* tp_basicsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2353 0, /* tp_itemsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2354 0, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2355 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2356 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2357 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2358 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2359 (reprfunc)delta_repr, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2360 &delta_as_number, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2361 0, /* tp_as_sequence */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2362 0, /* tp_as_mapping */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2363 (hashfunc)delta_hash, /* tp_hash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2364 0, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2365 (reprfunc)delta_str, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2366 PyObject_GenericGetAttr, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2367 0, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2368 0, /* tp_as_buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2369 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2370 delta_doc, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2371 0, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2372 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2373 delta_richcompare, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2374 0, /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2375 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2376 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2377 delta_methods, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2378 delta_members, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2379 0, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2380 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2381 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2382 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2383 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2384 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2385 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2386 0, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2387 delta_new, /* tp_new */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2388 0, /* tp_free */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2389 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2390
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2391 /*
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2392 * PyDateTime_Date implementation.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2393 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2394
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2395 /* Accessor properties. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2396
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2397 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2398 date_year(PyDateTime_Date *self, void *unused)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2399 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2400 return PyLong_FromLong(GET_YEAR(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2401 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2402
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2403 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2404 date_month(PyDateTime_Date *self, void *unused)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2405 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2406 return PyLong_FromLong(GET_MONTH(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2407 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2408
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2409 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2410 date_day(PyDateTime_Date *self, void *unused)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2411 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2412 return PyLong_FromLong(GET_DAY(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2413 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2414
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2415 static PyGetSetDef date_getset[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2416 {"year", (getter)date_year},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2417 {"month", (getter)date_month},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2418 {"day", (getter)date_day},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2419 {NULL}
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2420 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2421
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2422 /* Constructors. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2423
36684
0bebeb393045 More unconsting.
Martin v. Löwis <martin@v.loewis.de>
parents: 36599
diff changeset
2424 static char *date_kws[] = {"year", "month", "day", NULL};
26773
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
2425
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2426 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2427 date_new(PyTypeObject *type, PyObject *args, PyObject *kw)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2428 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2429 PyObject *self = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2430 PyObject *state;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2431 int year;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2432 int month;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2433 int day;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2434
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2435 /* Check for invocation from pickle with __getstate__ state */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2436 if (PyTuple_GET_SIZE(args) == 1 &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2437 PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2438 PyBytes_GET_SIZE(state) == _PyDateTime_DATE_DATASIZE &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2439 MONTH_IS_SANE(PyBytes_AS_STRING(state)[2]))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2440 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2441 PyDateTime_Date *me;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2442
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2443 me = (PyDateTime_Date *) (type->tp_alloc(type, 0));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2444 if (me != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2445 char *pdata = PyBytes_AS_STRING(state);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2446 memcpy(me->data, pdata, _PyDateTime_DATE_DATASIZE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2447 me->hashcode = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2448 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2449 return (PyObject *)me;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2450 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2451
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2452 if (PyArg_ParseTupleAndKeywords(args, kw, "iii", date_kws,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2453 &year, &month, &day)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2454 if (check_date_args(year, month, day) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2455 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2456 self = new_date_ex(year, month, day, type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2457 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2458 return self;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2459 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2460
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2461 /* Return new date from localtime(t). */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2462 static PyObject *
32388
5cf507b64f31 Bug 975996: Add _PyTime_DoubleToTimet to C API
Tim Peters <tim.peters@gmail.com>
parents: 32298
diff changeset
2463 date_local_from_time_t(PyObject *cls, double ts)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2464 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2465 struct tm *tm;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2466 time_t t;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2467 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2468
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2469 t = _PyTime_DoubleToTimet(ts);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2470 if (t == (time_t)-1 && PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2471 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2472 tm = localtime(&t);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2473 if (tm)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2474 result = PyObject_CallFunction(cls, "iii",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2475 tm->tm_year + 1900,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2476 tm->tm_mon + 1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2477 tm->tm_mday);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2478 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2479 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2480 "timestamp out of range for "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2481 "platform localtime() function");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2482 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2483 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2484
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2485 /* Return new date from current time.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2486 * We say this is equivalent to fromtimestamp(time.time()), and the
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2487 * only way to be sure of that is to *call* time.time(). That's not
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2488 * generally the same as calling C's time.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2489 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2490 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2491 date_today(PyObject *cls, PyObject *dummy)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2492 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2493 PyObject *time;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2494 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2495
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2496 time = time_time();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2497 if (time == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2498 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2499
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2500 /* Note well: today() is a class method, so this may not call
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2501 * date.fromtimestamp. For example, it may call
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2502 * datetime.fromtimestamp. That's why we need all the accuracy
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2503 * time.time() delivers; if someone were gonzo about optimization,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2504 * date.today() could get away with plain C time().
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2505 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2506 result = PyObject_CallMethod(cls, "fromtimestamp", "O", time);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2507 Py_DECREF(time);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2508 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2509 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2510
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2511 /* Return new date from given timestamp (Python timestamp -- a double). */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2512 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2513 date_fromtimestamp(PyObject *cls, PyObject *args)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2514 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2515 double timestamp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2516 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2517
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2518 if (PyArg_ParseTuple(args, "d:fromtimestamp", &timestamp))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2519 result = date_local_from_time_t(cls, timestamp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2520 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2521 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2522
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2523 /* Return new date from proleptic Gregorian ordinal. Raises ValueError if
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2524 * the ordinal is out of range.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2525 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2526 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2527 date_fromordinal(PyObject *cls, PyObject *args)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2528 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2529 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2530 int ordinal;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2531
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2532 if (PyArg_ParseTuple(args, "i:fromordinal", &ordinal)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2533 int year;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2534 int month;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2535 int day;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2536
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2537 if (ordinal < 1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2538 PyErr_SetString(PyExc_ValueError, "ordinal must be "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2539 ">= 1");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2540 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2541 ord_to_ymd(ordinal, &year, &month, &day);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2542 result = PyObject_CallFunction(cls, "iii",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2543 year, month, day);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2544 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2545 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2546 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2547 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2548
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2549 /*
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2550 * Date arithmetic.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2551 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2552
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2553 /* date + timedelta -> date. If arg negate is true, subtract the timedelta
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2554 * instead.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2555 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2556 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2557 add_date_timedelta(PyDateTime_Date *date, PyDateTime_Delta *delta, int negate)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2558 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2559 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2560 int year = GET_YEAR(date);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2561 int month = GET_MONTH(date);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2562 int deltadays = GET_TD_DAYS(delta);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2563 /* C-level overflow is impossible because |deltadays| < 1e9. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2564 int day = GET_DAY(date) + (negate ? -deltadays : deltadays);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2565
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2566 if (normalize_date(&year, &month, &day) >= 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2567 result = new_date(year, month, day);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2568 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2569 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2570
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2571 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2572 date_add(PyObject *left, PyObject *right)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2573 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2574 if (PyDateTime_Check(left) || PyDateTime_Check(right)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2575 Py_INCREF(Py_NotImplemented);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2576 return Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2577 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2578 if (PyDate_Check(left)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2579 /* date + ??? */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2580 if (PyDelta_Check(right))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2581 /* date + delta */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2582 return add_date_timedelta((PyDateTime_Date *) left,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2583 (PyDateTime_Delta *) right,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2584 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2585 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2586 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2587 /* ??? + date
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2588 * 'right' must be one of us, or we wouldn't have been called
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2589 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2590 if (PyDelta_Check(left))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2591 /* delta + date */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2592 return add_date_timedelta((PyDateTime_Date *) right,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2593 (PyDateTime_Delta *) left,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2594 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2595 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2596 Py_INCREF(Py_NotImplemented);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2597 return Py_NotImplemented;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2598 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2599
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2600 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2601 date_subtract(PyObject *left, PyObject *right)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2602 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2603 if (PyDateTime_Check(left) || PyDateTime_Check(right)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2604 Py_INCREF(Py_NotImplemented);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2605 return Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2606 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2607 if (PyDate_Check(left)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2608 if (PyDate_Check(right)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2609 /* date - date */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2610 int left_ord = ymd_to_ord(GET_YEAR(left),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2611 GET_MONTH(left),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2612 GET_DAY(left));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2613 int right_ord = ymd_to_ord(GET_YEAR(right),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2614 GET_MONTH(right),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2615 GET_DAY(right));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2616 return new_delta(left_ord - right_ord, 0, 0, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2617 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2618 if (PyDelta_Check(right)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2619 /* date - delta */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2620 return add_date_timedelta((PyDateTime_Date *) left,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2621 (PyDateTime_Delta *) right,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2622 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2623 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2624 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2625 Py_INCREF(Py_NotImplemented);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2626 return Py_NotImplemented;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2627 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2628
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2629
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2630 /* Various ways to turn a date into a string. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2631
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2632 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2633 date_repr(PyDateTime_Date *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2634 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2635 return PyUnicode_FromFormat("%s(%d, %d, %d)",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2636 Py_TYPE(self)->tp_name,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2637 GET_YEAR(self), GET_MONTH(self), GET_DAY(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2638 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2639
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2640 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2641 date_isoformat(PyDateTime_Date *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2642 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2643 return PyUnicode_FromFormat("%04d-%02d-%02d",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2644 GET_YEAR(self), GET_MONTH(self), GET_DAY(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2645 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2646
28928
c798d28dee46 SF patch 731504: Typo in datetimemodule.c comment.
Tim Peters <tim.peters@gmail.com>
parents: 28609
diff changeset
2647 /* str() calls the appropriate isoformat() method. */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2648 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2649 date_str(PyDateTime_Date *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2650 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2651 return PyObject_CallMethod((PyObject *)self, "isoformat", "()");
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2652 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2653
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2654
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2655 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2656 date_ctime(PyDateTime_Date *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2657 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2658 return format_ctime(self, 0, 0, 0);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2659 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2660
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2661 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2662 date_strftime(PyDateTime_Date *self, PyObject *args, PyObject *kw)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2663 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2664 /* This method can be inherited, and needs to call the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2665 * timetuple() method appropriate to self's class.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2666 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2667 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2668 PyObject *tuple;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2669 PyObject *format;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2670 static char *keywords[] = {"format", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2671
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2672 if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2673 &format))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2674 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2675
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2676 tuple = PyObject_CallMethod((PyObject *)self, "timetuple", "()");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2677 if (tuple == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2678 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2679 result = wrap_strftime((PyObject *)self, format, tuple,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2680 (PyObject *)self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2681 Py_DECREF(tuple);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2682 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2683 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2684
43332
18d5aa5135ca Added __format__ method to datetime.datetime, datetime.date, and datetime.time.
Eric Smith <eric@trueblade.com>
parents: 43124
diff changeset
2685 static PyObject *
18d5aa5135ca Added __format__ method to datetime.datetime, datetime.date, and datetime.time.
Eric Smith <eric@trueblade.com>
parents: 43124
diff changeset
2686 date_format(PyDateTime_Date *self, PyObject *args)
18d5aa5135ca Added __format__ method to datetime.datetime, datetime.date, and datetime.time.
Eric Smith <eric@trueblade.com>
parents: 43124
diff changeset
2687 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2688 PyObject *format;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2689
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2690 if (!PyArg_ParseTuple(args, "U:__format__", &format))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2691 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2692
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2693 /* if the format is zero length, return str(self) */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2694 if (PyUnicode_GetSize(format) == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2695 return PyObject_Str((PyObject *)self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2696
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2697 return PyObject_CallMethod((PyObject *)self, "strftime", "O", format);
43332
18d5aa5135ca Added __format__ method to datetime.datetime, datetime.date, and datetime.time.
Eric Smith <eric@trueblade.com>
parents: 43124
diff changeset
2698 }
18d5aa5135ca Added __format__ method to datetime.datetime, datetime.date, and datetime.time.
Eric Smith <eric@trueblade.com>
parents: 43124
diff changeset
2699
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2700 /* ISO methods. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2701
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2702 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2703 date_isoweekday(PyDateTime_Date *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2704 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2705 int dow = weekday(GET_YEAR(self), GET_MONTH(self), GET_DAY(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2706
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2707 return PyLong_FromLong(dow + 1);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2708 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2709
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2710 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2711 date_isocalendar(PyDateTime_Date *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2712 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2713 int year = GET_YEAR(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2714 int week1_monday = iso_week1_monday(year);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2715 int today = ymd_to_ord(year, GET_MONTH(self), GET_DAY(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2716 int week;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2717 int day;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2718
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2719 week = divmod(today - week1_monday, 7, &day);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2720 if (week < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2721 --year;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2722 week1_monday = iso_week1_monday(year);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2723 week = divmod(today - week1_monday, 7, &day);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2724 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2725 else if (week >= 52 && today >= iso_week1_monday(year + 1)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2726 ++year;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2727 week = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2728 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2729 return Py_BuildValue("iii", year, week + 1, day + 1);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2730 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2731
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2732 /* Miscellaneous methods. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2733
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2734 static PyObject *
39651
1cf5285c8ab9 Fix the datetime comparison conundrum.
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
2735 date_richcompare(PyObject *self, PyObject *other, int op)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2736 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2737 if (PyDate_Check(other)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2738 int diff = memcmp(((PyDateTime_Date *)self)->data,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2739 ((PyDateTime_Date *)other)->data,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2740 _PyDateTime_DATE_DATASIZE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2741 return diff_to_bool(diff, op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2742 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2743 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2744 Py_INCREF(Py_NotImplemented);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2745 return Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2746 }
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2747 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2748
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2749 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2750 date_timetuple(PyDateTime_Date *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2751 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2752 return build_struct_time(GET_YEAR(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2753 GET_MONTH(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2754 GET_DAY(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2755 0, 0, 0, -1);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2756 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2757
26773
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
2758 static PyObject *
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
2759 date_replace(PyDateTime_Date *self, PyObject *args, PyObject *kw)
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
2760 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2761 PyObject *clone;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2762 PyObject *tuple;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2763 int year = GET_YEAR(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2764 int month = GET_MONTH(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2765 int day = GET_DAY(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2766
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2767 if (! PyArg_ParseTupleAndKeywords(args, kw, "|iii:replace", date_kws,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2768 &year, &month, &day))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2769 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2770 tuple = Py_BuildValue("iii", year, month, day);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2771 if (tuple == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2772 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2773 clone = date_new(Py_TYPE(self), tuple, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2774 Py_DECREF(tuple);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2775 return clone;
26773
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
2776 }
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
2777
42764
b626b84b5070 Fixes by Ero Carrera to remove PyString_. I had to massage a few problems away.
Guido van Rossum <guido@python.org>
parents: 42625
diff changeset
2778 /*
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2779 Borrowed from stringobject.c, originally it was string_hash()
42764
b626b84b5070 Fixes by Ero Carrera to remove PyString_. I had to massage a few problems away.
Guido van Rossum <guido@python.org>
parents: 42625
diff changeset
2780 */
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65319
diff changeset
2781 static Py_hash_t
42764
b626b84b5070 Fixes by Ero Carrera to remove PyString_. I had to massage a few problems away.
Guido van Rossum <guido@python.org>
parents: 42625
diff changeset
2782 generic_hash(unsigned char *data, int len)
b626b84b5070 Fixes by Ero Carrera to remove PyString_. I had to massage a few problems away.
Guido van Rossum <guido@python.org>
parents: 42625
diff changeset
2783 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2784 register unsigned char *p;
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65319
diff changeset
2785 register Py_hash_t x;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2786
75127
160a56eac332 ensure no one tries to hash things before the random seed is found
Benjamin Peterson <benjamin@python.org>
parents: 75066
diff changeset
2787 assert(_Py_HashSecret_Initialized);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2788 p = (unsigned char *) data;
75066
f4b7ecf8a5f8 Issue #13703: add a way to randomize the hash values of basic types (str, bytes, datetime)
Georg Brandl <georg@python.org>
parents: 62962
diff changeset
2789 x = _Py_HashSecret.prefix;
f4b7ecf8a5f8 Issue #13703: add a way to randomize the hash values of basic types (str, bytes, datetime)
Georg Brandl <georg@python.org>
parents: 62962
diff changeset
2790 x ^= *p << 7;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2791 while (--len >= 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2792 x = (1000003*x) ^ *p++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2793 x ^= len;
75066
f4b7ecf8a5f8 Issue #13703: add a way to randomize the hash values of basic types (str, bytes, datetime)
Georg Brandl <georg@python.org>
parents: 62962
diff changeset
2794 x ^= _Py_HashSecret.suffix;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2795 if (x == -1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2796 x = -2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2797
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2798 return x;
42764
b626b84b5070 Fixes by Ero Carrera to remove PyString_. I had to massage a few problems away.
Guido van Rossum <guido@python.org>
parents: 42625
diff changeset
2799 }
b626b84b5070 Fixes by Ero Carrera to remove PyString_. I had to massage a few problems away.
Guido van Rossum <guido@python.org>
parents: 42625
diff changeset
2800
b626b84b5070 Fixes by Ero Carrera to remove PyString_. I had to massage a few problems away.
Guido van Rossum <guido@python.org>
parents: 42625
diff changeset
2801
b626b84b5070 Fixes by Ero Carrera to remove PyString_. I had to massage a few problems away.
Guido van Rossum <guido@python.org>
parents: 42625
diff changeset
2802 static PyObject *date_getstate(PyDateTime_Date *self);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2803
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65319
diff changeset
2804 static Py_hash_t
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2805 date_hash(PyDateTime_Date *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2806 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2807 if (self->hashcode == -1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2808 self->hashcode = generic_hash(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2809 (unsigned char *)self->data, _PyDateTime_DATE_DATASIZE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2810
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2811 return self->hashcode;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2812 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2813
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2814 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2815 date_toordinal(PyDateTime_Date *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2816 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2817 return PyLong_FromLong(ymd_to_ord(GET_YEAR(self), GET_MONTH(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2818 GET_DAY(self)));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2819 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2820
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2821 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2822 date_weekday(PyDateTime_Date *self)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2823 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2824 int dow = weekday(GET_YEAR(self), GET_MONTH(self), GET_DAY(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2825
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2826 return PyLong_FromLong(dow);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2827 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2828
27572
f235f135f3f8 All over: changed comments to reflect pickling is straightforward now,
Tim Peters <tim.peters@gmail.com>
parents: 27571
diff changeset
2829 /* Pickle support, a simple use of __reduce__. */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2830
27575
3b9fb57fac34 There's no good reason for datetime objects to expose __getstate__()
Tim Peters <tim.peters@gmail.com>
parents: 27573
diff changeset
2831 /* __getstate__ isn't exposed */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2832 static PyObject *
42764
b626b84b5070 Fixes by Ero Carrera to remove PyString_. I had to massage a few problems away.
Guido van Rossum <guido@python.org>
parents: 42625
diff changeset
2833 date_getstate(PyDateTime_Date *self)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2834 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2835 PyObject* field;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2836 field = PyBytes_FromStringAndSize((char*)self->data,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2837 _PyDateTime_DATE_DATASIZE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2838 return Py_BuildValue("(N)", field);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2839 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2840
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2841 static PyObject *
27538
87943faf4fd2 Change the approach to pickling to use __reduce__ everywhere. Most
Guido van Rossum <guido@python.org>
parents: 27365
diff changeset
2842 date_reduce(PyDateTime_Date *self, PyObject *arg)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2843 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2844 return Py_BuildValue("(ON)", Py_TYPE(self), date_getstate(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2845 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2846
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2847 static PyMethodDef date_methods[] = {
27538
87943faf4fd2 Change the approach to pickling to use __reduce__ everywhere. Most
Guido van Rossum <guido@python.org>
parents: 27365
diff changeset
2848
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2849 /* Class methods: */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2850
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2851 {"fromtimestamp", (PyCFunction)date_fromtimestamp, METH_VARARGS |
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2852 METH_CLASS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2853 PyDoc_STR("timestamp -> local date from a POSIX timestamp (like "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2854 "time.time()).")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2855
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2856 {"fromordinal", (PyCFunction)date_fromordinal, METH_VARARGS |
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2857 METH_CLASS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2858 PyDoc_STR("int -> date corresponding to a proleptic Gregorian "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2859 "ordinal.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2860
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2861 {"today", (PyCFunction)date_today, METH_NOARGS | METH_CLASS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2862 PyDoc_STR("Current date or datetime: same as "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2863 "self.__class__.fromtimestamp(time.time()).")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2864
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2865 /* Instance methods: */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2866
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2867 {"ctime", (PyCFunction)date_ctime, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2868 PyDoc_STR("Return ctime() style string.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2869
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2870 {"strftime", (PyCFunction)date_strftime, METH_VARARGS | METH_KEYWORDS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2871 PyDoc_STR("format -> strftime() style string.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2872
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2873 {"__format__", (PyCFunction)date_format, METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2874 PyDoc_STR("Formats self with strftime.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2875
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2876 {"timetuple", (PyCFunction)date_timetuple, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2877 PyDoc_STR("Return time tuple, compatible with time.localtime().")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2878
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2879 {"isocalendar", (PyCFunction)date_isocalendar, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2880 PyDoc_STR("Return a 3-tuple containing ISO year, week number, and "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2881 "weekday.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2882
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2883 {"isoformat", (PyCFunction)date_isoformat, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2884 PyDoc_STR("Return string in ISO 8601 format, YYYY-MM-DD.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2885
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2886 {"isoweekday", (PyCFunction)date_isoweekday, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2887 PyDoc_STR("Return the day of the week represented by the date.\n"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2888 "Monday == 1 ... Sunday == 7")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2889
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2890 {"toordinal", (PyCFunction)date_toordinal, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2891 PyDoc_STR("Return proleptic Gregorian ordinal. January 1 of year "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2892 "1 is day 1.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2893
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2894 {"weekday", (PyCFunction)date_weekday, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2895 PyDoc_STR("Return the day of the week represented by the date.\n"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2896 "Monday == 0 ... Sunday == 6")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2897
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2898 {"replace", (PyCFunction)date_replace, METH_VARARGS | METH_KEYWORDS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2899 PyDoc_STR("Return date with new specified fields.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2900
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2901 {"__reduce__", (PyCFunction)date_reduce, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2902 PyDoc_STR("__reduce__() -> (cls, state)")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2903
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2904 {NULL, NULL}
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2905 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2906
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2907 static char date_doc[] =
34191
cd4dd6dd9721 Bug #1087216: datetime module documentation missing critical detail
Raymond Hettinger <python@rcn.com>
parents: 33498
diff changeset
2908 PyDoc_STR("date(year, month, day) --> date object");
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2909
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2910 static PyNumberMethods date_as_number = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2911 date_add, /* nb_add */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2912 date_subtract, /* nb_subtract */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2913 0, /* nb_multiply */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2914 0, /* nb_remainder */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2915 0, /* nb_divmod */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2916 0, /* nb_power */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2917 0, /* nb_negative */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2918 0, /* nb_positive */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2919 0, /* nb_absolute */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2920 0, /* nb_bool */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2921 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2922
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2923 static PyTypeObject PyDateTime_DateType = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2924 PyVarObject_HEAD_INIT(NULL, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2925 "datetime.date", /* tp_name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2926 sizeof(PyDateTime_Date), /* tp_basicsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2927 0, /* tp_itemsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2928 0, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2929 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2930 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2931 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2932 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2933 (reprfunc)date_repr, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2934 &date_as_number, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2935 0, /* tp_as_sequence */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2936 0, /* tp_as_mapping */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2937 (hashfunc)date_hash, /* tp_hash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2938 0, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2939 (reprfunc)date_str, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2940 PyObject_GenericGetAttr, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2941 0, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2942 0, /* tp_as_buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2943 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2944 date_doc, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2945 0, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2946 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2947 date_richcompare, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2948 0, /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2949 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2950 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2951 date_methods, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2952 0, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2953 date_getset, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2954 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2955 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2956 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2957 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2958 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2959 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2960 0, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2961 date_new, /* tp_new */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2962 0, /* tp_free */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2963 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2964
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2965 /*
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2966 * PyDateTime_TZInfo implementation.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2967 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2968
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2969 /* This is a pure abstract base class, so doesn't do anything beyond
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2970 * raising NotImplemented exceptions. Real tzinfo classes need
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2971 * to derive from this. This is mostly for clarity, and for efficiency in
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
2972 * datetime and time constructors (their tzinfo arguments need to
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2973 * be subclasses of this tzinfo class, which is easy and quick to check).
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2974 *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2975 * Note: For reasons having to do with pickling of subclasses, we have
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2976 * to allow tzinfo objects to be instantiated. This wasn't an issue
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2977 * in the Python implementation (__init__() could raise NotImplementedError
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2978 * there without ill effect), but doing so in the C implementation hit a
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2979 * brick wall.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2980 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2981
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2982 static PyObject *
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2983 tzinfo_nogo(const char* methodname)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2984 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2985 PyErr_Format(PyExc_NotImplementedError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2986 "a tzinfo subclass must implement %s()",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2987 methodname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2988 return NULL;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2989 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2990
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2991 /* Methods. A subclass must implement these. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2992
27346
2055d037295c Bringing the code and test suite into line with doc and NEWS changes
Tim Peters <tim.peters@gmail.com>
parents: 27315
diff changeset
2993 static PyObject *
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2994 tzinfo_tzname(PyDateTime_TZInfo *self, PyObject *dt)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2995 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
2996 return tzinfo_nogo("tzname");
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2997 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2998
27346
2055d037295c Bringing the code and test suite into line with doc and NEWS changes
Tim Peters <tim.peters@gmail.com>
parents: 27315
diff changeset
2999 static PyObject *
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3000 tzinfo_utcoffset(PyDateTime_TZInfo *self, PyObject *dt)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3001 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3002 return tzinfo_nogo("utcoffset");
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3003 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3004
27346
2055d037295c Bringing the code and test suite into line with doc and NEWS changes
Tim Peters <tim.peters@gmail.com>
parents: 27315
diff changeset
3005 static PyObject *
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3006 tzinfo_dst(PyDateTime_TZInfo *self, PyObject *dt)
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3007 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3008 return tzinfo_nogo("dst");
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3009 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3010
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3011
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3012 static PyObject *add_datetime_timedelta(PyDateTime_DateTime *date,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3013 PyDateTime_Delta *delta,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3014 int factor);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3015 static PyObject *datetime_utcoffset(PyObject *self, PyObject *);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3016 static PyObject *datetime_dst(PyObject *self, PyObject *);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3017
27346
2055d037295c Bringing the code and test suite into line with doc and NEWS changes
Tim Peters <tim.peters@gmail.com>
parents: 27315
diff changeset
3018 static PyObject *
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3019 tzinfo_fromutc(PyDateTime_TZInfo *self, PyObject *dt)
27346
2055d037295c Bringing the code and test suite into line with doc and NEWS changes
Tim Peters <tim.peters@gmail.com>
parents: 27315
diff changeset
3020 {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3021 PyObject *result = NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3022 PyObject *off = NULL, *dst = NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3023 PyDateTime_Delta *delta = NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3024
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3025 if (!PyDateTime_Check(dt)) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3026 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3027 "fromutc: argument must be a datetime");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3028 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3029 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3030 if (GET_DT_TZINFO(dt) != (PyObject *)self) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3031 PyErr_SetString(PyExc_ValueError, "fromutc: dt.tzinfo "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3032 "is not self");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3033 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3034 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3035
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3036 off = datetime_utcoffset(dt, NULL);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3037 if (off == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3038 return NULL;
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3039 if (off == Py_None) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3040 PyErr_SetString(PyExc_ValueError, "fromutc: non-None "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3041 "utcoffset() result required");
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3042 goto Fail;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3043 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3044
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3045 dst = datetime_dst(dt, NULL);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3046 if (dst == NULL)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3047 goto Fail;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3048 if (dst == Py_None) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3049 PyErr_SetString(PyExc_ValueError, "fromutc: non-None "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3050 "dst() result required");
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3051 goto Fail;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3052 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3053
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3054 delta = (PyDateTime_Delta *)delta_subtract(off, dst);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3055 if (delta == NULL)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3056 goto Fail;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3057 result = add_datetime_timedelta((PyDateTime_DateTime *)dt, delta, 1);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3058 if (result == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3059 goto Fail;
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3060
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3061 Py_DECREF(dst);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3062 dst = call_dst(GET_DT_TZINFO(dt), result);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3063 if (dst == NULL)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3064 goto Fail;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3065 if (dst == Py_None)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3066 goto Inconsistent;
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3067 if (delta_bool(delta) != 0) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3068 PyObject *temp = result;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3069 result = add_datetime_timedelta((PyDateTime_DateTime *)result,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3070 (PyDateTime_Delta *)dst, 1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3071 Py_DECREF(temp);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3072 if (result == NULL)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3073 goto Fail;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3074 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3075 Py_DECREF(delta);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3076 Py_DECREF(dst);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3077 Py_DECREF(off);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3078 return result;
27346
2055d037295c Bringing the code and test suite into line with doc and NEWS changes
Tim Peters <tim.peters@gmail.com>
parents: 27315
diff changeset
3079
2055d037295c Bringing the code and test suite into line with doc and NEWS changes
Tim Peters <tim.peters@gmail.com>
parents: 27315
diff changeset
3080 Inconsistent:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3081 PyErr_SetString(PyExc_ValueError, "fromutc: tz.dst() gave"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3082 "inconsistent results; cannot convert");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3083
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3084 /* fall thru to failure */
27346
2055d037295c Bringing the code and test suite into line with doc and NEWS changes
Tim Peters <tim.peters@gmail.com>
parents: 27315
diff changeset
3085 Fail:
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3086 Py_XDECREF(off);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3087 Py_XDECREF(dst);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3088 Py_XDECREF(delta);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3089 Py_XDECREF(result);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3090 return NULL;
27346
2055d037295c Bringing the code and test suite into line with doc and NEWS changes
Tim Peters <tim.peters@gmail.com>
parents: 27315
diff changeset
3091 }
2055d037295c Bringing the code and test suite into line with doc and NEWS changes
Tim Peters <tim.peters@gmail.com>
parents: 27315
diff changeset
3092
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3093 /*
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3094 * Pickle support. This is solely so that tzinfo subclasses can use
27538
87943faf4fd2 Change the approach to pickling to use __reduce__ everywhere. Most
Guido van Rossum <guido@python.org>
parents: 27365
diff changeset
3095 * pickling -- tzinfo itself is supposed to be uninstantiable.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3096 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3097
27538
87943faf4fd2 Change the approach to pickling to use __reduce__ everywhere. Most
Guido van Rossum <guido@python.org>
parents: 27365
diff changeset
3098 static PyObject *
87943faf4fd2 Change the approach to pickling to use __reduce__ everywhere. Most
Guido van Rossum <guido@python.org>
parents: 27365
diff changeset
3099 tzinfo_reduce(PyObject *self)
87943faf4fd2 Change the approach to pickling to use __reduce__ everywhere. Most
Guido van Rossum <guido@python.org>
parents: 27365
diff changeset
3100 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3101 PyObject *args, *state, *tmp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3102 PyObject *getinitargs, *getstate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3103
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3104 tmp = PyTuple_New(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3105 if (tmp == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3106 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3107
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3108 getinitargs = PyObject_GetAttrString(self, "__getinitargs__");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3109 if (getinitargs != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3110 args = PyObject_CallObject(getinitargs, tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3111 Py_DECREF(getinitargs);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3112 if (args == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3113 Py_DECREF(tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3114 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3115 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3116 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3117 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3118 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3119 args = tmp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3120 Py_INCREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3121 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3122
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3123 getstate = PyObject_GetAttrString(self, "__getstate__");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3124 if (getstate != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3125 state = PyObject_CallObject(getstate, tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3126 Py_DECREF(getstate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3127 if (state == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3128 Py_DECREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3129 Py_DECREF(tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3130 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3131 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3132 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3133 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3134 PyObject **dictptr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3135 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3136 state = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3137 dictptr = _PyObject_GetDictPtr(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3138 if (dictptr && *dictptr && PyDict_Size(*dictptr))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3139 state = *dictptr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3140 Py_INCREF(state);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3141 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3142
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3143 Py_DECREF(tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3144
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3145 if (state == Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3146 Py_DECREF(state);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3147 return Py_BuildValue("(ON)", Py_TYPE(self), args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3148 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3149 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3150 return Py_BuildValue("(ONN)", Py_TYPE(self), args, state);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3151 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3152
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3153 static PyMethodDef tzinfo_methods[] = {
27538
87943faf4fd2 Change the approach to pickling to use __reduce__ everywhere. Most
Guido van Rossum <guido@python.org>
parents: 27365
diff changeset
3154
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3155 {"tzname", (PyCFunction)tzinfo_tzname, METH_O,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3156 PyDoc_STR("datetime -> string name of time zone.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3157
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3158 {"utcoffset", (PyCFunction)tzinfo_utcoffset, METH_O,
62059
26803168ce8a Issue8810: Clearing up docstring for tzinfo.utcoffset.
Sean Reifscheider <jafo@tummy.com>
parents: 62002
diff changeset
3159 PyDoc_STR("datetime -> timedelta showing offset from UTC, negative "
26803168ce8a Issue8810: Clearing up docstring for tzinfo.utcoffset.
Sean Reifscheider <jafo@tummy.com>
parents: 62002
diff changeset
3160 "values indicating West of UTC")},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3161
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3162 {"dst", (PyCFunction)tzinfo_dst, METH_O,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3163 PyDoc_STR("datetime -> DST offset in minutes east of UTC.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3164
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3165 {"fromutc", (PyCFunction)tzinfo_fromutc, METH_O,
62708
b0be89f70ff9 Merged revisions 82466 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62595
diff changeset
3166 PyDoc_STR("datetime in UTC -> datetime in local time.")},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3167
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3168 {"__reduce__", (PyCFunction)tzinfo_reduce, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3169 PyDoc_STR("-> (cls, state)")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3170
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3171 {NULL, NULL}
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3172 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3173
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3174 static char tzinfo_doc[] =
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3175 PyDoc_STR("Abstract base class for time zone info objects.");
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3176
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36684
diff changeset
3177 static PyTypeObject PyDateTime_TZInfoType = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3178 PyVarObject_HEAD_INIT(NULL, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3179 "datetime.tzinfo", /* tp_name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3180 sizeof(PyDateTime_TZInfo), /* tp_basicsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3181 0, /* tp_itemsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3182 0, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3183 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3184 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3185 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3186 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3187 0, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3188 0, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3189 0, /* tp_as_sequence */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3190 0, /* tp_as_mapping */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3191 0, /* tp_hash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3192 0, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3193 0, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3194 PyObject_GenericGetAttr, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3195 0, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3196 0, /* tp_as_buffer */
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3197 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3198 tzinfo_doc, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3199 0, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3200 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3201 0, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3202 0, /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3203 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3204 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3205 tzinfo_methods, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3206 0, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3207 0, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3208 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3209 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3210 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3211 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3212 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3213 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3214 0, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3215 PyType_GenericNew, /* tp_new */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3216 0, /* tp_free */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3217 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3218
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3219 static char *timezone_kws[] = {"offset", "name", NULL};
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3220
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3221 static PyObject *
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3222 timezone_new(PyTypeObject *type, PyObject *args, PyObject *kw)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3223 {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3224 PyObject *offset;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3225 PyObject *name = NULL;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3226 if (PyArg_ParseTupleAndKeywords(args, kw, "O!|O!:timezone", timezone_kws,
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3227 &PyDateTime_DeltaType, &offset,
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3228 &PyUnicode_Type, &name))
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3229 return new_timezone(offset, name);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3230
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3231 return NULL;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3232 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3233
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3234 static void
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3235 timezone_dealloc(PyDateTime_TimeZone *self)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3236 {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3237 Py_CLEAR(self->offset);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3238 Py_CLEAR(self->name);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3239 Py_TYPE(self)->tp_free((PyObject *)self);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3240 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3241
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3242 static PyObject *
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3243 timezone_richcompare(PyDateTime_TimeZone *self,
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3244 PyDateTime_TimeZone *other, int op)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3245 {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3246 if (op != Py_EQ && op != Py_NE) {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3247 Py_INCREF(Py_NotImplemented);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3248 return Py_NotImplemented;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3249 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3250 return delta_richcompare(self->offset, other->offset, op);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3251 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3252
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65319
diff changeset
3253 static Py_hash_t
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3254 timezone_hash(PyDateTime_TimeZone *self)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3255 {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3256 return delta_hash((PyDateTime_Delta *)self->offset);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3257 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3258
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3259 /* Check argument type passed to tzname, utcoffset, or dst methods.
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3260 Returns 0 for good argument. Returns -1 and sets exception info
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3261 otherwise.
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3262 */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3263 static int
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3264 _timezone_check_argument(PyObject *dt, const char *meth)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3265 {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3266 if (dt == Py_None || PyDateTime_Check(dt))
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3267 return 0;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3268 PyErr_Format(PyExc_TypeError, "%s(dt) argument must be a datetime instance"
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3269 " or None, not %.200s", meth, Py_TYPE(dt)->tp_name);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3270 return -1;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3271 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3272
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3273 static PyObject *
62837
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3274 timezone_repr(PyDateTime_TimeZone *self)
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3275 {
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3276 /* Note that although timezone is not subclassable, it is convenient
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3277 to use Py_TYPE(self)->tp_name here. */
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3278 const char *type_name = Py_TYPE(self)->tp_name;
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3279
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3280 if (((PyObject *)self) == PyDateTime_TimeZone_UTC)
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3281 return PyUnicode_FromFormat("%s.utc", type_name);
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3282
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3283 if (self->name == NULL)
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3284 return PyUnicode_FromFormat("%s(%R)", type_name, self->offset);
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3285
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3286 return PyUnicode_FromFormat("%s(%R, %R)", type_name, self->offset,
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3287 self->name);
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3288 }
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3289
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3290
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3291 static PyObject *
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3292 timezone_str(PyDateTime_TimeZone *self)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3293 {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3294 char buf[10];
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3295 int hours, minutes, seconds;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3296 PyObject *offset;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3297 char sign;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3298
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3299 if (self->name != NULL) {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3300 Py_INCREF(self->name);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3301 return self->name;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3302 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3303 /* Offset is normalized, so it is negative if days < 0 */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3304 if (GET_TD_DAYS(self->offset) < 0) {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3305 sign = '-';
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3306 offset = delta_negative((PyDateTime_Delta *)self->offset);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3307 if (offset == NULL)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3308 return NULL;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3309 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3310 else {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3311 sign = '+';
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3312 offset = self->offset;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3313 Py_INCREF(offset);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3314 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3315 /* Offset is not negative here. */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3316 seconds = GET_TD_SECONDS(offset);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3317 Py_DECREF(offset);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3318 minutes = divmod(seconds, 60, &seconds);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3319 hours = divmod(minutes, 60, &minutes);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3320 assert(seconds == 0);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3321 /* XXX ignore sub-minute data, curently not allowed. */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3322 PyOS_snprintf(buf, sizeof(buf), "UTC%c%02d:%02d", sign, hours, minutes);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3323
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3324 return PyUnicode_FromString(buf);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3325 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3326
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3327 static PyObject *
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3328 timezone_tzname(PyDateTime_TimeZone *self, PyObject *dt)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3329 {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3330 if (_timezone_check_argument(dt, "tzname") == -1)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3331 return NULL;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3332
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3333 return timezone_str(self);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3334 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3335
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3336 static PyObject *
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3337 timezone_utcoffset(PyDateTime_TimeZone *self, PyObject *dt)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3338 {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3339 if (_timezone_check_argument(dt, "utcoffset") == -1)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3340 return NULL;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3341
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3342 Py_INCREF(self->offset);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3343 return self->offset;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3344 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3345
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3346 static PyObject *
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3347 timezone_dst(PyObject *self, PyObject *dt)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3348 {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3349 if (_timezone_check_argument(dt, "dst") == -1)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3350 return NULL;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3351
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3352 Py_RETURN_NONE;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3353 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3354
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3355 static PyObject *
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3356 timezone_fromutc(PyDateTime_TimeZone *self, PyDateTime_DateTime *dt)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3357 {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3358 if (!PyDateTime_Check(dt)) {
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3359 PyErr_SetString(PyExc_TypeError,
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3360 "fromutc: argument must be a datetime");
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3361 return NULL;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3362 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3363 if (!HASTZINFO(dt) || dt->tzinfo != (PyObject *)self) {
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3364 PyErr_SetString(PyExc_ValueError, "fromutc: dt.tzinfo "
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3365 "is not self");
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3366 return NULL;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3367 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3368
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3369 return add_datetime_timedelta(dt, (PyDateTime_Delta *)self->offset, 1);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3370 }
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3371
62464
3cf35231f7d3 Issue #9051: Instances of timezone class can now be pickled.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62419
diff changeset
3372 static PyObject *
3cf35231f7d3 Issue #9051: Instances of timezone class can now be pickled.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62419
diff changeset
3373 timezone_getinitargs(PyDateTime_TimeZone *self)
3cf35231f7d3 Issue #9051: Instances of timezone class can now be pickled.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62419
diff changeset
3374 {
3cf35231f7d3 Issue #9051: Instances of timezone class can now be pickled.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62419
diff changeset
3375 if (self->name == NULL)
3cf35231f7d3 Issue #9051: Instances of timezone class can now be pickled.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62419
diff changeset
3376 return Py_BuildValue("(O)", self->offset);
3cf35231f7d3 Issue #9051: Instances of timezone class can now be pickled.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62419
diff changeset
3377 return Py_BuildValue("(OO)", self->offset, self->name);
3cf35231f7d3 Issue #9051: Instances of timezone class can now be pickled.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62419
diff changeset
3378 }
3cf35231f7d3 Issue #9051: Instances of timezone class can now be pickled.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62419
diff changeset
3379
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3380 static PyMethodDef timezone_methods[] = {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3381 {"tzname", (PyCFunction)timezone_tzname, METH_O,
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3382 PyDoc_STR("If name is specified when timezone is created, returns the name."
62341
354b751e46d6 Issue 5094: minor documentation fixes
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62325
diff changeset
3383 " Otherwise returns offset as 'UTC(+|-)HH:MM'.")},
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3384
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3385 {"utcoffset", (PyCFunction)timezone_utcoffset, METH_O,
62341
354b751e46d6 Issue 5094: minor documentation fixes
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62325
diff changeset
3386 PyDoc_STR("Return fixed offset.")},
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3387
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3388 {"dst", (PyCFunction)timezone_dst, METH_O,
62341
354b751e46d6 Issue 5094: minor documentation fixes
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62325
diff changeset
3389 PyDoc_STR("Return None.")},
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3390
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3391 {"fromutc", (PyCFunction)timezone_fromutc, METH_O,
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3392 PyDoc_STR("datetime in UTC -> datetime in local time.")},
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3393
62464
3cf35231f7d3 Issue #9051: Instances of timezone class can now be pickled.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62419
diff changeset
3394 {"__getinitargs__", (PyCFunction)timezone_getinitargs, METH_NOARGS,
3cf35231f7d3 Issue #9051: Instances of timezone class can now be pickled.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62419
diff changeset
3395 PyDoc_STR("pickle support")},
3cf35231f7d3 Issue #9051: Instances of timezone class can now be pickled.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62419
diff changeset
3396
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3397 {NULL, NULL}
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3398 };
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3399
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3400 static char timezone_doc[] =
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3401 PyDoc_STR("Fixed offset from UTC implementation of tzinfo.");
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3402
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3403 static PyTypeObject PyDateTime_TimeZoneType = {
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3404 PyVarObject_HEAD_INIT(NULL, 0)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3405 "datetime.timezone", /* tp_name */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3406 sizeof(PyDateTime_TimeZone), /* tp_basicsize */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3407 0, /* tp_itemsize */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3408 (destructor)timezone_dealloc, /* tp_dealloc */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3409 0, /* tp_print */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3410 0, /* tp_getattr */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3411 0, /* tp_setattr */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3412 0, /* tp_reserved */
62837
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
3413 (reprfunc)timezone_repr, /* tp_repr */
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3414 0, /* tp_as_number */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3415 0, /* tp_as_sequence */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3416 0, /* tp_as_mapping */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3417 (hashfunc)timezone_hash, /* tp_hash */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3418 0, /* tp_call */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3419 (reprfunc)timezone_str, /* tp_str */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3420 0, /* tp_getattro */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3421 0, /* tp_setattro */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3422 0, /* tp_as_buffer */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3423 Py_TPFLAGS_DEFAULT, /* tp_flags */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3424 timezone_doc, /* tp_doc */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3425 0, /* tp_traverse */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3426 0, /* tp_clear */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3427 (richcmpfunc)timezone_richcompare,/* tp_richcompare */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3428 0, /* tp_weaklistoffset */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3429 0, /* tp_iter */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3430 0, /* tp_iternext */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3431 timezone_methods, /* tp_methods */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3432 0, /* tp_members */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3433 0, /* tp_getset */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3434 &PyDateTime_TZInfoType, /* tp_base */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3435 0, /* tp_dict */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3436 0, /* tp_descr_get */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3437 0, /* tp_descr_set */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3438 0, /* tp_dictoffset */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3439 0, /* tp_init */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3440 0, /* tp_alloc */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3441 timezone_new, /* tp_new */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3442 };
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
3443
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3444 /*
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3445 * PyDateTime_Time implementation.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3446 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3447
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3448 /* Accessor properties.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3449 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3450
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3451 static PyObject *
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3452 time_hour(PyDateTime_Time *self, void *unused)
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3453 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3454 return PyLong_FromLong(TIME_GET_HOUR(self));
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3455 }
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3456
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3457 static PyObject *
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3458 time_minute(PyDateTime_Time *self, void *unused)
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3459 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3460 return PyLong_FromLong(TIME_GET_MINUTE(self));
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3461 }
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3462
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3463 /* The name time_second conflicted with some platform header file. */
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3464 static PyObject *
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3465 py_time_second(PyDateTime_Time *self, void *unused)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3466 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3467 return PyLong_FromLong(TIME_GET_SECOND(self));
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3468 }
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3469
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3470 static PyObject *
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3471 time_microsecond(PyDateTime_Time *self, void *unused)
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3472 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3473 return PyLong_FromLong(TIME_GET_MICROSECOND(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3474 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3475
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3476 static PyObject *
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3477 time_tzinfo(PyDateTime_Time *self, void *unused)
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3478 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3479 PyObject *result = HASTZINFO(self) ? self->tzinfo : Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3480 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3481 return result;
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3482 }
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3483
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3484 static PyGetSetDef time_getset[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3485 {"hour", (getter)time_hour},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3486 {"minute", (getter)time_minute},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3487 {"second", (getter)py_time_second},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3488 {"microsecond", (getter)time_microsecond},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3489 {"tzinfo", (getter)time_tzinfo},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3490 {NULL}
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3491 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3492
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3493 /*
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3494 * Constructors.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3495 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3496
36684
0bebeb393045 More unconsting.
Martin v. Löwis <martin@v.loewis.de>
parents: 36599
diff changeset
3497 static char *time_kws[] = {"hour", "minute", "second", "microsecond",
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3498 "tzinfo", NULL};
26773
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
3499
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3500 static PyObject *
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3501 time_new(PyTypeObject *type, PyObject *args, PyObject *kw)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3502 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3503 PyObject *self = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3504 PyObject *state;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3505 int hour = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3506 int minute = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3507 int second = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3508 int usecond = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3509 PyObject *tzinfo = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3510
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3511 /* Check for invocation from pickle with __getstate__ state */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3512 if (PyTuple_GET_SIZE(args) >= 1 &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3513 PyTuple_GET_SIZE(args) <= 2 &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3514 PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3515 PyBytes_GET_SIZE(state) == _PyDateTime_TIME_DATASIZE &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3516 ((unsigned char) (PyBytes_AS_STRING(state)[0])) < 24)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3517 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3518 PyDateTime_Time *me;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3519 char aware;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3520
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3521 if (PyTuple_GET_SIZE(args) == 2) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3522 tzinfo = PyTuple_GET_ITEM(args, 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3523 if (check_tzinfo_subclass(tzinfo) < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3524 PyErr_SetString(PyExc_TypeError, "bad "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3525 "tzinfo state arg");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3526 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3527 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3528 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3529 aware = (char)(tzinfo != Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3530 me = (PyDateTime_Time *) (type->tp_alloc(type, aware));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3531 if (me != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3532 char *pdata = PyBytes_AS_STRING(state);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3533
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3534 memcpy(me->data, pdata, _PyDateTime_TIME_DATASIZE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3535 me->hashcode = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3536 me->hastzinfo = aware;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3537 if (aware) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3538 Py_INCREF(tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3539 me->tzinfo = tzinfo;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3540 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3541 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3542 return (PyObject *)me;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3543 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3544
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3545 if (PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO", time_kws,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3546 &hour, &minute, &second, &usecond,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3547 &tzinfo)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3548 if (check_time_args(hour, minute, second, usecond) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3549 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3550 if (check_tzinfo_subclass(tzinfo) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3551 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3552 self = new_time_ex(hour, minute, second, usecond, tzinfo,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3553 type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3554 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3555 return self;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3556 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3557
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3558 /*
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3559 * Destructor.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3560 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3561
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3562 static void
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3563 time_dealloc(PyDateTime_Time *self)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3564 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3565 if (HASTZINFO(self)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3566 Py_XDECREF(self->tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3567 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3568 Py_TYPE(self)->tp_free((PyObject *)self);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3569 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3570
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3571 /*
26743
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
3572 * Indirect access to tzinfo methods.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3573 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3574
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3575 /* These are all METH_NOARGS, so don't need to check the arglist. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3576 static PyObject *
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3577 time_utcoffset(PyObject *self, PyObject *unused) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3578 return call_utcoffset(GET_TIME_TZINFO(self), Py_None);
26743
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
3579 }
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
3580
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
3581 static PyObject *
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3582 time_dst(PyObject *self, PyObject *unused) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3583 return call_dst(GET_TIME_TZINFO(self), Py_None);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3584 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3585
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3586 static PyObject *
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3587 time_tzname(PyDateTime_Time *self, PyObject *unused) {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3588 return call_tzname(GET_TIME_TZINFO(self), Py_None);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3589 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3590
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3591 /*
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3592 * Various ways to turn a time into a string.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3593 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3594
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3595 static PyObject *
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3596 time_repr(PyDateTime_Time *self)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3597 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3598 const char *type_name = Py_TYPE(self)->tp_name;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3599 int h = TIME_GET_HOUR(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3600 int m = TIME_GET_MINUTE(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3601 int s = TIME_GET_SECOND(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3602 int us = TIME_GET_MICROSECOND(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3603 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3604
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3605 if (us)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3606 result = PyUnicode_FromFormat("%s(%d, %d, %d, %d)",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3607 type_name, h, m, s, us);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3608 else if (s)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3609 result = PyUnicode_FromFormat("%s(%d, %d, %d)",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3610 type_name, h, m, s);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3611 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3612 result = PyUnicode_FromFormat("%s(%d, %d)", type_name, h, m);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3613 if (result != NULL && HASTZINFO(self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3614 result = append_keyword_tzinfo(result, self->tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3615 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3616 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3617
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3618 static PyObject *
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3619 time_str(PyDateTime_Time *self)
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3620 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3621 return PyObject_CallMethod((PyObject *)self, "isoformat", "()");
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3622 }
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3623
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3624 static PyObject *
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
3625 time_isoformat(PyDateTime_Time *self, PyObject *unused)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3626 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3627 char buf[100];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3628 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3629 int us = TIME_GET_MICROSECOND(self);;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3630
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3631 if (us)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3632 result = PyUnicode_FromFormat("%02d:%02d:%02d.%06d",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3633 TIME_GET_HOUR(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3634 TIME_GET_MINUTE(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3635 TIME_GET_SECOND(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3636 us);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3637 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3638 result = PyUnicode_FromFormat("%02d:%02d:%02d",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3639 TIME_GET_HOUR(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3640 TIME_GET_MINUTE(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3641 TIME_GET_SECOND(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3642
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3643 if (result == NULL || !HASTZINFO(self) || self->tzinfo == Py_None)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3644 return result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3645
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3646 /* We need to append the UTC offset. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3647 if (format_utcoffset(buf, sizeof(buf), ":", self->tzinfo,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3648 Py_None) < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3649 Py_DECREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3650 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3651 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3652 PyUnicode_AppendAndDel(&result, PyUnicode_FromString(buf));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3653 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3654 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3655
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3656 static PyObject *
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3657 time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw)
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3658 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3659 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3660 PyObject *tuple;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3661 PyObject *format;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3662 static char *keywords[] = {"format", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3663
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3664 if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3665 &format))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3666 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3667
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3668 /* Python's strftime does insane things with the year part of the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3669 * timetuple. The year is forced to (the otherwise nonsensical)
67450
31465968ae26 Issue #1777412: extended year range of strftime down to 1000.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66799
diff changeset
3670 * 1900 to work around that.
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3671 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3672 tuple = Py_BuildValue("iiiiiiiii",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3673 1900, 1, 1, /* year, month, day */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3674 TIME_GET_HOUR(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3675 TIME_GET_MINUTE(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3676 TIME_GET_SECOND(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3677 0, 1, -1); /* weekday, daynum, dst */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3678 if (tuple == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3679 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3680 assert(PyTuple_Size(tuple) == 9);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3681 result = wrap_strftime((PyObject *)self, format, tuple,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3682 Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3683 Py_DECREF(tuple);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3684 return result;
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3685 }
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3686
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3687 /*
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3688 * Miscellaneous methods.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3689 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3690
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3691 static PyObject *
39651
1cf5285c8ab9 Fix the datetime comparison conundrum.
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
3692 time_richcompare(PyObject *self, PyObject *other, int op)
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3693 {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3694 PyObject *result = NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3695 PyObject *offset1, *offset2;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3696 int diff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3697
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3698 if (! PyTime_Check(other)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3699 Py_INCREF(Py_NotImplemented);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3700 return Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3701 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3702
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3703 if (GET_TIME_TZINFO(self) == GET_TIME_TZINFO(other)) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3704 diff = memcmp(((PyDateTime_Time *)self)->data,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3705 ((PyDateTime_Time *)other)->data,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3706 _PyDateTime_TIME_DATASIZE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3707 return diff_to_bool(diff, op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3708 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3709 offset1 = time_utcoffset(self, NULL);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3710 if (offset1 == NULL)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3711 return NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3712 offset2 = time_utcoffset(other, NULL);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3713 if (offset2 == NULL)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3714 goto done;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3715 /* If they're both naive, or both aware and have the same offsets,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3716 * we get off cheap. Note that if they're both naive, offset1 ==
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3717 * offset2 == Py_None at this point.
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3718 */
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3719 if ((offset1 == offset2) ||
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3720 (PyDelta_Check(offset1) && PyDelta_Check(offset2) &&
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3721 delta_cmp(offset1, offset2) == 0)) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3722 diff = memcmp(((PyDateTime_Time *)self)->data,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3723 ((PyDateTime_Time *)other)->data,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3724 _PyDateTime_TIME_DATASIZE);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3725 result = diff_to_bool(diff, op);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3726 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3727 /* The hard case: both aware with different UTC offsets */
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3728 else if (offset1 != Py_None && offset2 != Py_None) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3729 int offsecs1, offsecs2;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3730 assert(offset1 != offset2); /* else last "if" handled it */
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3731 offsecs1 = TIME_GET_HOUR(self) * 3600 +
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3732 TIME_GET_MINUTE(self) * 60 +
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3733 TIME_GET_SECOND(self) -
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3734 GET_TD_DAYS(offset1) * 86400 -
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3735 GET_TD_SECONDS(offset1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3736 offsecs2 = TIME_GET_HOUR(other) * 3600 +
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3737 TIME_GET_MINUTE(other) * 60 +
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3738 TIME_GET_SECOND(other) -
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3739 GET_TD_DAYS(offset2) * 86400 -
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3740 GET_TD_SECONDS(offset2);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3741 diff = offsecs1 - offsecs2;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3742 if (diff == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3743 diff = TIME_GET_MICROSECOND(self) -
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3744 TIME_GET_MICROSECOND(other);
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3745 result = diff_to_bool(diff, op);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3746 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3747 else {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3748 PyErr_SetString(PyExc_TypeError,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3749 "can't compare offset-naive and "
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3750 "offset-aware times");
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3751 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3752 done:
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3753 Py_DECREF(offset1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3754 Py_XDECREF(offset2);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3755 return result;
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3756 }
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3757
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65319
diff changeset
3758 static Py_hash_t
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3759 time_hash(PyDateTime_Time *self)
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3760 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3761 if (self->hashcode == -1) {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3762 PyObject *offset;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3763
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3764 offset = time_utcoffset((PyObject *)self, NULL);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3765
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3766 if (offset == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3767 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3768
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3769 /* Reduce this to a hash of another object. */
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3770 if (offset == Py_None)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3771 self->hashcode = generic_hash(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3772 (unsigned char *)self->data, _PyDateTime_TIME_DATASIZE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3773 else {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3774 PyObject *temp1, *temp2;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3775 int seconds, microseconds;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3776 assert(HASTZINFO(self));
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3777 seconds = TIME_GET_HOUR(self) * 3600 +
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3778 TIME_GET_MINUTE(self) * 60 +
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3779 TIME_GET_SECOND(self);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3780 microseconds = TIME_GET_MICROSECOND(self);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3781 temp1 = new_delta(0, seconds, microseconds, 1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3782 if (temp1 == NULL) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3783 Py_DECREF(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3784 return -1;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3785 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3786 temp2 = delta_subtract(temp1, offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3787 Py_DECREF(temp1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3788 if (temp2 == NULL) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3789 Py_DECREF(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3790 return -1;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3791 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3792 self->hashcode = PyObject_Hash(temp2);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3793 Py_DECREF(temp2);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3794 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3795 Py_DECREF(offset);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3796 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3797 return self->hashcode;
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3798 }
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3799
26773
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
3800 static PyObject *
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3801 time_replace(PyDateTime_Time *self, PyObject *args, PyObject *kw)
26773
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
3802 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3803 PyObject *clone;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3804 PyObject *tuple;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3805 int hh = TIME_GET_HOUR(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3806 int mm = TIME_GET_MINUTE(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3807 int ss = TIME_GET_SECOND(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3808 int us = TIME_GET_MICROSECOND(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3809 PyObject *tzinfo = HASTZINFO(self) ? self->tzinfo : Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3810
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3811 if (! PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO:replace",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3812 time_kws,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3813 &hh, &mm, &ss, &us, &tzinfo))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3814 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3815 tuple = Py_BuildValue("iiiiO", hh, mm, ss, us, tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3816 if (tuple == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3817 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3818 clone = time_new(Py_TYPE(self), tuple, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3819 Py_DECREF(tuple);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3820 return clone;
26773
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
3821 }
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
3822
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3823 static int
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3824 time_bool(PyObject *self)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3825 {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3826 PyObject *offset, *tzinfo;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3827 int offsecs = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3828
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3829 if (TIME_GET_SECOND(self) || TIME_GET_MICROSECOND(self)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3830 /* Since utcoffset is in whole minutes, nothing can
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3831 * alter the conclusion that this is nonzero.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3832 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3833 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3834 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3835 tzinfo = GET_TIME_TZINFO(self);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3836 if (tzinfo != Py_None) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3837 offset = call_utcoffset(tzinfo, Py_None);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3838 if (offset == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3839 return -1;
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3840 offsecs = GET_TD_DAYS(offset)*86400 + GET_TD_SECONDS(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3841 Py_DECREF(offset);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3842 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
3843 return (TIME_GET_MINUTE(self)*60 - offsecs + TIME_GET_HOUR(self)*3600) != 0;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3844 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3845
27572
f235f135f3f8 All over: changed comments to reflect pickling is straightforward now,
Tim Peters <tim.peters@gmail.com>
parents: 27571
diff changeset
3846 /* Pickle support, a simple use of __reduce__. */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3847
27193
934732787419 Removed more now-pointless pickle code.
Tim Peters <tim.peters@gmail.com>
parents: 27172
diff changeset
3848 /* Let basestate be the non-tzinfo data string.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3849 * If tzinfo is None, this returns (basestate,), else (basestate, tzinfo).
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3850 * So it's a tuple in any (non-error) case.
27575
3b9fb57fac34 There's no good reason for datetime objects to expose __getstate__()
Tim Peters <tim.peters@gmail.com>
parents: 27573
diff changeset
3851 * __getstate__ isn't exposed.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3852 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3853 static PyObject *
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3854 time_getstate(PyDateTime_Time *self)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3855 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3856 PyObject *basestate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3857 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3858
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3859 basestate = PyBytes_FromStringAndSize((char *)self->data,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3860 _PyDateTime_TIME_DATASIZE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3861 if (basestate != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3862 if (! HASTZINFO(self) || self->tzinfo == Py_None)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3863 result = PyTuple_Pack(1, basestate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3864 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3865 result = PyTuple_Pack(2, basestate, self->tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3866 Py_DECREF(basestate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3867 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3868 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3869 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3870
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3871 static PyObject *
27538
87943faf4fd2 Change the approach to pickling to use __reduce__ everywhere. Most
Guido van Rossum <guido@python.org>
parents: 27365
diff changeset
3872 time_reduce(PyDateTime_Time *self, PyObject *arg)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3873 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3874 return Py_BuildValue("(ON)", Py_TYPE(self), time_getstate(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3875 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3876
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3877 static PyMethodDef time_methods[] = {
27538
87943faf4fd2 Change the approach to pickling to use __reduce__ everywhere. Most
Guido van Rossum <guido@python.org>
parents: 27365
diff changeset
3878
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3879 {"isoformat", (PyCFunction)time_isoformat, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3880 PyDoc_STR("Return string in ISO 8601 format, HH:MM:SS[.mmmmmm]"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3881 "[+HH:MM].")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3882
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3883 {"strftime", (PyCFunction)time_strftime, METH_VARARGS | METH_KEYWORDS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3884 PyDoc_STR("format -> strftime() style string.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3885
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3886 {"__format__", (PyCFunction)date_format, METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3887 PyDoc_STR("Formats self with strftime.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3888
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3889 {"utcoffset", (PyCFunction)time_utcoffset, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3890 PyDoc_STR("Return self.tzinfo.utcoffset(self).")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3891
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3892 {"tzname", (PyCFunction)time_tzname, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3893 PyDoc_STR("Return self.tzinfo.tzname(self).")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3894
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3895 {"dst", (PyCFunction)time_dst, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3896 PyDoc_STR("Return self.tzinfo.dst(self).")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3897
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3898 {"replace", (PyCFunction)time_replace, METH_VARARGS | METH_KEYWORDS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3899 PyDoc_STR("Return time with new specified fields.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3900
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3901 {"__reduce__", (PyCFunction)time_reduce, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3902 PyDoc_STR("__reduce__() -> (cls, state)")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3903
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3904 {NULL, NULL}
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3905 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3906
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3907 static char time_doc[] =
34191
cd4dd6dd9721 Bug #1087216: datetime module documentation missing critical detail
Raymond Hettinger <python@rcn.com>
parents: 33498
diff changeset
3908 PyDoc_STR("time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\n\
cd4dd6dd9721 Bug #1087216: datetime module documentation missing critical detail
Raymond Hettinger <python@rcn.com>
parents: 33498
diff changeset
3909 \n\
cd4dd6dd9721 Bug #1087216: datetime module documentation missing critical detail
Raymond Hettinger <python@rcn.com>
parents: 33498
diff changeset
3910 All arguments are optional. tzinfo may be None, or an instance of\n\
cd4dd6dd9721 Bug #1087216: datetime module documentation missing critical detail
Raymond Hettinger <python@rcn.com>
parents: 33498
diff changeset
3911 a tzinfo subclass. The remaining arguments may be ints or longs.\n");
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3912
27195
65dc0110a735 Got rid of the timetz type entirely. This was a bit trickier than I
Tim Peters <tim.peters@gmail.com>
parents: 27193
diff changeset
3913 static PyNumberMethods time_as_number = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3914 0, /* nb_add */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3915 0, /* nb_subtract */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3916 0, /* nb_multiply */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3917 0, /* nb_remainder */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3918 0, /* nb_divmod */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3919 0, /* nb_power */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3920 0, /* nb_negative */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3921 0, /* nb_positive */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3922 0, /* nb_absolute */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3923 (inquiry)time_bool, /* nb_bool */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3924 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3925
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36684
diff changeset
3926 static PyTypeObject PyDateTime_TimeType = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3927 PyVarObject_HEAD_INIT(NULL, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3928 "datetime.time", /* tp_name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3929 sizeof(PyDateTime_Time), /* tp_basicsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3930 0, /* tp_itemsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3931 (destructor)time_dealloc, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3932 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3933 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3934 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3935 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3936 (reprfunc)time_repr, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3937 &time_as_number, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3938 0, /* tp_as_sequence */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3939 0, /* tp_as_mapping */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3940 (hashfunc)time_hash, /* tp_hash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3941 0, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3942 (reprfunc)time_str, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3943 PyObject_GenericGetAttr, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3944 0, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3945 0, /* tp_as_buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3946 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3947 time_doc, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3948 0, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3949 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3950 time_richcompare, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3951 0, /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3952 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3953 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3954 time_methods, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3955 0, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3956 time_getset, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3957 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3958 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3959 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3960 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3961 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3962 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3963 time_alloc, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3964 time_new, /* tp_new */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3965 0, /* tp_free */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3966 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3967
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3968 /*
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3969 * PyDateTime_DateTime implementation.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3970 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3971
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3972 /* Accessor properties. Properties for day, month, and year are inherited
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3973 * from date.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3974 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3975
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3976 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3977 datetime_hour(PyDateTime_DateTime *self, void *unused)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3978 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3979 return PyLong_FromLong(DATE_GET_HOUR(self));
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3980 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3981
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3982 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3983 datetime_minute(PyDateTime_DateTime *self, void *unused)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3984 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3985 return PyLong_FromLong(DATE_GET_MINUTE(self));
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3986 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3987
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3988 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3989 datetime_second(PyDateTime_DateTime *self, void *unused)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3990 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3991 return PyLong_FromLong(DATE_GET_SECOND(self));
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3992 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3993
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3994 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3995 datetime_microsecond(PyDateTime_DateTime *self, void *unused)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
3996 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
3997 return PyLong_FromLong(DATE_GET_MICROSECOND(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3998 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3999
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4000 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4001 datetime_tzinfo(PyDateTime_DateTime *self, void *unused)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4002 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4003 PyObject *result = HASTZINFO(self) ? self->tzinfo : Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4004 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4005 return result;
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4006 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4007
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4008 static PyGetSetDef datetime_getset[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4009 {"hour", (getter)datetime_hour},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4010 {"minute", (getter)datetime_minute},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4011 {"second", (getter)datetime_second},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4012 {"microsecond", (getter)datetime_microsecond},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4013 {"tzinfo", (getter)datetime_tzinfo},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4014 {NULL}
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4015 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4016
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4017 /*
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4018 * Constructors.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4019 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4020
36684
0bebeb393045 More unconsting.
Martin v. Löwis <martin@v.loewis.de>
parents: 36599
diff changeset
4021 static char *datetime_kws[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4022 "year", "month", "day", "hour", "minute", "second",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4023 "microsecond", "tzinfo", NULL
26773
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
4024 };
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
4025
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4026 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4027 datetime_new(PyTypeObject *type, PyObject *args, PyObject *kw)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4028 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4029 PyObject *self = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4030 PyObject *state;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4031 int year;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4032 int month;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4033 int day;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4034 int hour = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4035 int minute = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4036 int second = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4037 int usecond = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4038 PyObject *tzinfo = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4039
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4040 /* Check for invocation from pickle with __getstate__ state */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4041 if (PyTuple_GET_SIZE(args) >= 1 &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4042 PyTuple_GET_SIZE(args) <= 2 &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4043 PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4044 PyBytes_GET_SIZE(state) == _PyDateTime_DATETIME_DATASIZE &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4045 MONTH_IS_SANE(PyBytes_AS_STRING(state)[2]))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4046 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4047 PyDateTime_DateTime *me;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4048 char aware;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4049
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4050 if (PyTuple_GET_SIZE(args) == 2) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4051 tzinfo = PyTuple_GET_ITEM(args, 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4052 if (check_tzinfo_subclass(tzinfo) < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4053 PyErr_SetString(PyExc_TypeError, "bad "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4054 "tzinfo state arg");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4055 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4056 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4057 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4058 aware = (char)(tzinfo != Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4059 me = (PyDateTime_DateTime *) (type->tp_alloc(type , aware));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4060 if (me != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4061 char *pdata = PyBytes_AS_STRING(state);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4062
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4063 memcpy(me->data, pdata, _PyDateTime_DATETIME_DATASIZE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4064 me->hashcode = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4065 me->hastzinfo = aware;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4066 if (aware) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4067 Py_INCREF(tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4068 me->tzinfo = tzinfo;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4069 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4070 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4071 return (PyObject *)me;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4072 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4073
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4074 if (PyArg_ParseTupleAndKeywords(args, kw, "iii|iiiiO", datetime_kws,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4075 &year, &month, &day, &hour, &minute,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4076 &second, &usecond, &tzinfo)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4077 if (check_date_args(year, month, day) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4078 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4079 if (check_time_args(hour, minute, second, usecond) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4080 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4081 if (check_tzinfo_subclass(tzinfo) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4082 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4083 self = new_datetime_ex(year, month, day,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4084 hour, minute, second, usecond,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4085 tzinfo, type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4086 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4087 return self;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4088 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4089
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4090 /* TM_FUNC is the shared type of localtime() and gmtime(). */
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4091 typedef struct tm *(*TM_FUNC)(const time_t *timer);
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4092
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4093 /* Internal helper.
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4094 * Build datetime from a time_t and a distinct count of microseconds.
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4095 * Pass localtime or gmtime for f, to control the interpretation of timet.
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4096 */
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4097 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4098 datetime_from_timet_and_us(PyObject *cls, TM_FUNC f, time_t timet, int us,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4099 PyObject *tzinfo)
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4100 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4101 struct tm *tm;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4102 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4103
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4104 tm = f(&timet);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4105 if (tm) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4106 /* The platform localtime/gmtime may insert leap seconds,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4107 * indicated by tm->tm_sec > 59. We don't care about them,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4108 * except to the extent that passing them on to the datetime
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4109 * constructor would raise ValueError for a reason that
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4110 * made no sense to the user.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4111 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4112 if (tm->tm_sec > 59)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4113 tm->tm_sec = 59;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4114 result = PyObject_CallFunction(cls, "iiiiiiiO",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4115 tm->tm_year + 1900,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4116 tm->tm_mon + 1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4117 tm->tm_mday,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4118 tm->tm_hour,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4119 tm->tm_min,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4120 tm->tm_sec,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4121 us,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4122 tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4123 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4124 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4125 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4126 "timestamp out of range for "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4127 "platform localtime()/gmtime() function");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4128 return result;
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4129 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4130
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4131 /* Internal helper.
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4132 * Build datetime from a Python timestamp. Pass localtime or gmtime for f,
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4133 * to control the interpretation of the timestamp. Since a double doesn't
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4134 * have enough bits to cover a datetime's full range of precision, it's
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4135 * better to call datetime_from_timet_and_us provided you have a way
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4136 * to get that much precision (e.g., C time() isn't good enough).
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4137 */
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4138 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4139 datetime_from_timestamp(PyObject *cls, TM_FUNC f, double timestamp,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4140 PyObject *tzinfo)
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4141 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4142 time_t timet;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4143 double fraction;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4144 int us;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4145
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4146 timet = _PyTime_DoubleToTimet(timestamp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4147 if (timet == (time_t)-1 && PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4148 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4149 fraction = timestamp - (double)timet;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4150 us = (int)round_to_long(fraction * 1e6);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4151 if (us < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4152 /* Truncation towards zero is not what we wanted
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4153 for negative numbers (Python's mod semantics) */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4154 timet -= 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4155 us += 1000000;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4156 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4157 /* If timestamp is less than one microsecond smaller than a
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4158 * full second, round up. Otherwise, ValueErrors are raised
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4159 * for some floats. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4160 if (us == 1000000) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4161 timet += 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4162 us = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4163 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4164 return datetime_from_timet_and_us(cls, f, timet, us, tzinfo);
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4165 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4166
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4167 /* Internal helper.
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4168 * Build most accurate possible datetime for current time. Pass localtime or
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4169 * gmtime for f as appropriate.
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4170 */
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4171 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4172 datetime_best_possible(PyObject *cls, TM_FUNC f, PyObject *tzinfo)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4173 {
63757
c16803bbd790 Issue #9079: Added _PyTime_gettimeofday(_PyTime_timeval *tp) to C API
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63184
diff changeset
4174 _PyTime_timeval t;
c16803bbd790 Issue #9079: Added _PyTime_gettimeofday(_PyTime_timeval *tp) to C API
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63184
diff changeset
4175 _PyTime_gettimeofday(&t);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4176 return datetime_from_timet_and_us(cls, f, t.tv_sec, (int)t.tv_usec,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4177 tzinfo);
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4178 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4179
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4180 /* Return best possible local time -- this isn't constrained by the
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4181 * precision of a timestamp.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4182 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4183 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4184 datetime_now(PyObject *cls, PyObject *args, PyObject *kw)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4185 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4186 PyObject *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4187 PyObject *tzinfo = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4188 static char *keywords[] = {"tz", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4189
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4190 if (! PyArg_ParseTupleAndKeywords(args, kw, "|O:now", keywords,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4191 &tzinfo))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4192 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4193 if (check_tzinfo_subclass(tzinfo) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4194 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4195
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4196 self = datetime_best_possible(cls,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4197 tzinfo == Py_None ? localtime : gmtime,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4198 tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4199 if (self != NULL && tzinfo != Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4200 /* Convert UTC to tzinfo's zone. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4201 PyObject *temp = self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4202 self = PyObject_CallMethod(tzinfo, "fromutc", "O", self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4203 Py_DECREF(temp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4204 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4205 return self;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4206 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4207
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4208 /* Return best possible UTC time -- this isn't constrained by the
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4209 * precision of a timestamp.
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4210 */
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4211 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4212 datetime_utcnow(PyObject *cls, PyObject *dummy)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4213 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4214 return datetime_best_possible(cls, gmtime, Py_None);
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4215 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4216
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4217 /* Return new local datetime from timestamp (Python timestamp -- a double). */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4218 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4219 datetime_fromtimestamp(PyObject *cls, PyObject *args, PyObject *kw)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4220 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4221 PyObject *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4222 double timestamp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4223 PyObject *tzinfo = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4224 static char *keywords[] = {"timestamp", "tz", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4225
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4226 if (! PyArg_ParseTupleAndKeywords(args, kw, "d|O:fromtimestamp",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4227 keywords, &timestamp, &tzinfo))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4228 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4229 if (check_tzinfo_subclass(tzinfo) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4230 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4231
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4232 self = datetime_from_timestamp(cls,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4233 tzinfo == Py_None ? localtime : gmtime,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4234 timestamp,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4235 tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4236 if (self != NULL && tzinfo != Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4237 /* Convert UTC to tzinfo's zone. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4238 PyObject *temp = self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4239 self = PyObject_CallMethod(tzinfo, "fromutc", "O", self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4240 Py_DECREF(temp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4241 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4242 return self;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4243 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4244
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4245 /* Return new UTC datetime from timestamp (Python timestamp -- a double). */
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4246 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4247 datetime_utcfromtimestamp(PyObject *cls, PyObject *args)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4248 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4249 double timestamp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4250 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4251
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4252 if (PyArg_ParseTuple(args, "d:utcfromtimestamp", &timestamp))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4253 result = datetime_from_timestamp(cls, gmtime, timestamp,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4254 Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4255 return result;
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4256 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4257
62383
5c0d8c284c32 Issue #6641: The datetime.strptime method now supports the %z directive.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62341
diff changeset
4258 /* Return new datetime from _strptime.strptime_datetime(). */
34416
563cbf4d6be4 Add strptime() constructor to datetime class. Thanks to Josh Spoerri for
Skip Montanaro <skip@pobox.com>
parents: 34191
diff changeset
4259 static PyObject *
563cbf4d6be4 Add strptime() constructor to datetime class. Thanks to Josh Spoerri for
Skip Montanaro <skip@pobox.com>
parents: 34191
diff changeset
4260 datetime_strptime(PyObject *cls, PyObject *args)
563cbf4d6be4 Add strptime() constructor to datetime class. Thanks to Josh Spoerri for
Skip Montanaro <skip@pobox.com>
parents: 34191
diff changeset
4261 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4262 static PyObject *module = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4263 const Py_UNICODE *string, *format;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4264
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4265 if (!PyArg_ParseTuple(args, "uu:strptime", &string, &format))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4266 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4267
62383
5c0d8c284c32 Issue #6641: The datetime.strptime method now supports the %z directive.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62341
diff changeset
4268 if (module == NULL) {
5c0d8c284c32 Issue #6641: The datetime.strptime method now supports the %z directive.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62341
diff changeset
4269 module = PyImport_ImportModuleNoBlock("_strptime");
62595
28f9a000a379 Added missing white space
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62569
diff changeset
4270 if (module == NULL)
62383
5c0d8c284c32 Issue #6641: The datetime.strptime method now supports the %z directive.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62341
diff changeset
4271 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4272 }
62399
90cc266798a2 Issue #6641: Original commit for this issue, r82053, introduced a
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62383
diff changeset
4273 return PyObject_CallMethod(module, "_strptime_datetime", "Ouu",
90cc266798a2 Issue #6641: Original commit for this issue, r82053, introduced a
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62383
diff changeset
4274 cls, string, format);
34416
563cbf4d6be4 Add strptime() constructor to datetime class. Thanks to Josh Spoerri for
Skip Montanaro <skip@pobox.com>
parents: 34191
diff changeset
4275 }
563cbf4d6be4 Add strptime() constructor to datetime class. Thanks to Josh Spoerri for
Skip Montanaro <skip@pobox.com>
parents: 34191
diff changeset
4276
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4277 /* Return new datetime from date/datetime and time arguments. */
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4278 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4279 datetime_combine(PyObject *cls, PyObject *args, PyObject *kw)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4280 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4281 static char *keywords[] = {"date", "time", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4282 PyObject *date;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4283 PyObject *time;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4284 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4285
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4286 if (PyArg_ParseTupleAndKeywords(args, kw, "O!O!:combine", keywords,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4287 &PyDateTime_DateType, &date,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4288 &PyDateTime_TimeType, &time)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4289 PyObject *tzinfo = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4290
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4291 if (HASTZINFO(time))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4292 tzinfo = ((PyDateTime_Time *)time)->tzinfo;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4293 result = PyObject_CallFunction(cls, "iiiiiiiO",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4294 GET_YEAR(date),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4295 GET_MONTH(date),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4296 GET_DAY(date),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4297 TIME_GET_HOUR(time),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4298 TIME_GET_MINUTE(time),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4299 TIME_GET_SECOND(time),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4300 TIME_GET_MICROSECOND(time),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4301 tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4302 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4303 return result;
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4304 }
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4305
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4306 /*
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4307 * Destructor.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4308 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4309
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4310 static void
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4311 datetime_dealloc(PyDateTime_DateTime *self)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4312 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4313 if (HASTZINFO(self)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4314 Py_XDECREF(self->tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4315 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4316 Py_TYPE(self)->tp_free((PyObject *)self);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4317 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4318
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4319 /*
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4320 * Indirect access to tzinfo methods.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4321 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4322
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4323 /* These are all METH_NOARGS, so don't need to check the arglist. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4324 static PyObject *
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4325 datetime_utcoffset(PyObject *self, PyObject *unused) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4326 return call_utcoffset(GET_DT_TZINFO(self), self);
26743
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
4327 }
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
4328
d052112731a8 Implemented a Wiki suggestion:
Tim Peters <tim.peters@gmail.com>
parents: 26728
diff changeset
4329 static PyObject *
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4330 datetime_dst(PyObject *self, PyObject *unused) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4331 return call_dst(GET_DT_TZINFO(self), self);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4332 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4333
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4334 static PyObject *
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4335 datetime_tzname(PyObject *self, PyObject *unused) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4336 return call_tzname(GET_DT_TZINFO(self), self);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4337 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4338
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4339 /*
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4340 * datetime arithmetic.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4341 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4342
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4343 /* factor must be 1 (to add) or -1 (to subtract). The result inherits
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4344 * the tzinfo state of date.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4345 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4346 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4347 add_datetime_timedelta(PyDateTime_DateTime *date, PyDateTime_Delta *delta,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4348 int factor)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4349 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4350 /* Note that the C-level additions can't overflow, because of
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4351 * invariant bounds on the member values.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4352 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4353 int year = GET_YEAR(date);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4354 int month = GET_MONTH(date);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4355 int day = GET_DAY(date) + GET_TD_DAYS(delta) * factor;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4356 int hour = DATE_GET_HOUR(date);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4357 int minute = DATE_GET_MINUTE(date);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4358 int second = DATE_GET_SECOND(date) + GET_TD_SECONDS(delta) * factor;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4359 int microsecond = DATE_GET_MICROSECOND(date) +
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4360 GET_TD_MICROSECONDS(delta) * factor;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4361
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4362 assert(factor == 1 || factor == -1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4363 if (normalize_datetime(&year, &month, &day,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4364 &hour, &minute, &second, &microsecond) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4365 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4366 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4367 return new_datetime(year, month, day,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4368 hour, minute, second, microsecond,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4369 HASTZINFO(date) ? date->tzinfo : Py_None);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4370 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4371
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4372 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4373 datetime_add(PyObject *left, PyObject *right)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4374 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4375 if (PyDateTime_Check(left)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4376 /* datetime + ??? */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4377 if (PyDelta_Check(right))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4378 /* datetime + delta */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4379 return add_datetime_timedelta(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4380 (PyDateTime_DateTime *)left,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4381 (PyDateTime_Delta *)right,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4382 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4383 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4384 else if (PyDelta_Check(left)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4385 /* delta + datetime */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4386 return add_datetime_timedelta((PyDateTime_DateTime *) right,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4387 (PyDateTime_Delta *) left,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4388 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4389 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4390 Py_INCREF(Py_NotImplemented);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4391 return Py_NotImplemented;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4392 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4393
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4394 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4395 datetime_subtract(PyObject *left, PyObject *right)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4396 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4397 PyObject *result = Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4398
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4399 if (PyDateTime_Check(left)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4400 /* datetime - ??? */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4401 if (PyDateTime_Check(right)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4402 /* datetime - datetime */
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4403 PyObject *offset1, *offset2, *offdiff = NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4404 int delta_d, delta_s, delta_us;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4405
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4406 if (GET_DT_TZINFO(left) == GET_DT_TZINFO(right)) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4407 offset2 = offset1 = Py_None;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4408 Py_INCREF(offset1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4409 Py_INCREF(offset2);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4410 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4411 else {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4412 offset1 = datetime_utcoffset(left, NULL);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4413 if (offset1 == NULL)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4414 return NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4415 offset2 = datetime_utcoffset(right, NULL);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4416 if (offset2 == NULL) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4417 Py_DECREF(offset1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4418 return NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4419 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4420 if ((offset1 != Py_None) != (offset2 != Py_None)) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4421 PyErr_SetString(PyExc_TypeError,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4422 "can't subtract offset-naive and "
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4423 "offset-aware datetimes");
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4424 Py_DECREF(offset1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4425 Py_DECREF(offset2);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4426 return NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4427 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4428 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4429 if ((offset1 != offset2) &&
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4430 delta_cmp(offset1, offset2) != 0) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4431 offdiff = delta_subtract(offset1, offset2);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4432 if (offdiff == NULL) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4433 Py_DECREF(offset1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4434 Py_DECREF(offset2);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4435 return NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4436 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4437 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4438 Py_DECREF(offset1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4439 Py_DECREF(offset2);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4440 delta_d = ymd_to_ord(GET_YEAR(left),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4441 GET_MONTH(left),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4442 GET_DAY(left)) -
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4443 ymd_to_ord(GET_YEAR(right),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4444 GET_MONTH(right),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4445 GET_DAY(right));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4446 /* These can't overflow, since the values are
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4447 * normalized. At most this gives the number of
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4448 * seconds in one day.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4449 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4450 delta_s = (DATE_GET_HOUR(left) -
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4451 DATE_GET_HOUR(right)) * 3600 +
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4452 (DATE_GET_MINUTE(left) -
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4453 DATE_GET_MINUTE(right)) * 60 +
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4454 (DATE_GET_SECOND(left) -
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4455 DATE_GET_SECOND(right));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4456 delta_us = DATE_GET_MICROSECOND(left) -
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4457 DATE_GET_MICROSECOND(right);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4458 result = new_delta(delta_d, delta_s, delta_us, 1);
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4459 if (offdiff != NULL) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4460 PyObject *temp = result;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4461 result = delta_subtract(result, offdiff);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4462 Py_DECREF(temp);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4463 Py_DECREF(offdiff);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4464 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4465 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4466 else if (PyDelta_Check(right)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4467 /* datetime - delta */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4468 result = add_datetime_timedelta(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4469 (PyDateTime_DateTime *)left,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4470 (PyDateTime_Delta *)right,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4471 -1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4472 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4473 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4474
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4475 if (result == Py_NotImplemented)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4476 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4477 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4478 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4479
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4480 /* Various ways to turn a datetime into a string. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4481
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4482 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4483 datetime_repr(PyDateTime_DateTime *self)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4484 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4485 const char *type_name = Py_TYPE(self)->tp_name;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4486 PyObject *baserepr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4487
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4488 if (DATE_GET_MICROSECOND(self)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4489 baserepr = PyUnicode_FromFormat(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4490 "%s(%d, %d, %d, %d, %d, %d, %d)",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4491 type_name,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4492 GET_YEAR(self), GET_MONTH(self), GET_DAY(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4493 DATE_GET_HOUR(self), DATE_GET_MINUTE(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4494 DATE_GET_SECOND(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4495 DATE_GET_MICROSECOND(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4496 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4497 else if (DATE_GET_SECOND(self)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4498 baserepr = PyUnicode_FromFormat(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4499 "%s(%d, %d, %d, %d, %d, %d)",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4500 type_name,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4501 GET_YEAR(self), GET_MONTH(self), GET_DAY(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4502 DATE_GET_HOUR(self), DATE_GET_MINUTE(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4503 DATE_GET_SECOND(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4504 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4505 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4506 baserepr = PyUnicode_FromFormat(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4507 "%s(%d, %d, %d, %d, %d)",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4508 type_name,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4509 GET_YEAR(self), GET_MONTH(self), GET_DAY(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4510 DATE_GET_HOUR(self), DATE_GET_MINUTE(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4511 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4512 if (baserepr == NULL || ! HASTZINFO(self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4513 return baserepr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4514 return append_keyword_tzinfo(baserepr, self->tzinfo);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4515 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4516
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4517 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4518 datetime_str(PyDateTime_DateTime *self)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4519 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4520 return PyObject_CallMethod((PyObject *)self, "isoformat", "(s)", " ");
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4521 }
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4522
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4523 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4524 datetime_isoformat(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4525 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4526 int sep = 'T';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4527 static char *keywords[] = {"sep", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4528 char buffer[100];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4529 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4530 int us = DATE_GET_MICROSECOND(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4531
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4532 if (!PyArg_ParseTupleAndKeywords(args, kw, "|C:isoformat", keywords, &sep))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4533 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4534 if (us)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4535 result = PyUnicode_FromFormat("%04d-%02d-%02d%c%02d:%02d:%02d.%06d",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4536 GET_YEAR(self), GET_MONTH(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4537 GET_DAY(self), (int)sep,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4538 DATE_GET_HOUR(self), DATE_GET_MINUTE(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4539 DATE_GET_SECOND(self), us);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4540 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4541 result = PyUnicode_FromFormat("%04d-%02d-%02d%c%02d:%02d:%02d",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4542 GET_YEAR(self), GET_MONTH(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4543 GET_DAY(self), (int)sep,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4544 DATE_GET_HOUR(self), DATE_GET_MINUTE(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4545 DATE_GET_SECOND(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4546
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4547 if (!result || !HASTZINFO(self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4548 return result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4549
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4550 /* We need to append the UTC offset. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4551 if (format_utcoffset(buffer, sizeof(buffer), ":", self->tzinfo,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4552 (PyObject *)self) < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4553 Py_DECREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4554 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4555 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4556 PyUnicode_AppendAndDel(&result, PyUnicode_FromString(buffer));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4557 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4558 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4559
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4560 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4561 datetime_ctime(PyDateTime_DateTime *self)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4562 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4563 return format_ctime((PyDateTime_Date *)self,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4564 DATE_GET_HOUR(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4565 DATE_GET_MINUTE(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4566 DATE_GET_SECOND(self));
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4567 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4568
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4569 /* Miscellaneous methods. */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4570
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4571 static PyObject *
39651
1cf5285c8ab9 Fix the datetime comparison conundrum.
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
4572 datetime_richcompare(PyObject *self, PyObject *other, int op)
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4573 {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4574 PyObject *result = NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4575 PyObject *offset1, *offset2;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4576 int diff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4577
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4578 if (! PyDateTime_Check(other)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4579 if (PyDate_Check(other)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4580 /* Prevent invocation of date_richcompare. We want to
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4581 return NotImplemented here to give the other object
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4582 a chance. But since DateTime is a subclass of
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4583 Date, if the other object is a Date, it would
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4584 compute an ordering based on the date part alone,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4585 and we don't want that. So force unequal or
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4586 uncomparable here in that case. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4587 if (op == Py_EQ)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4588 Py_RETURN_FALSE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4589 if (op == Py_NE)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4590 Py_RETURN_TRUE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4591 return cmperror(self, other);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4592 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4593 Py_INCREF(Py_NotImplemented);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4594 return Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4595 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4596
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4597 if (GET_DT_TZINFO(self) == GET_DT_TZINFO(other)) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4598 diff = memcmp(((PyDateTime_DateTime *)self)->data,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4599 ((PyDateTime_DateTime *)other)->data,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4600 _PyDateTime_DATETIME_DATASIZE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4601 return diff_to_bool(diff, op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4602 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4603 offset1 = datetime_utcoffset(self, NULL);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4604 if (offset1 == NULL)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4605 return NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4606 offset2 = datetime_utcoffset(other, NULL);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4607 if (offset2 == NULL)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4608 goto done;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4609 /* If they're both naive, or both aware and have the same offsets,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4610 * we get off cheap. Note that if they're both naive, offset1 ==
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4611 * offset2 == Py_None at this point.
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4612 */
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4613 if ((offset1 == offset2) ||
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4614 (PyDelta_Check(offset1) && PyDelta_Check(offset2) &&
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4615 delta_cmp(offset1, offset2) == 0)) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4616 diff = memcmp(((PyDateTime_DateTime *)self)->data,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4617 ((PyDateTime_DateTime *)other)->data,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4618 _PyDateTime_DATETIME_DATASIZE);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4619 result = diff_to_bool(diff, op);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4620 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4621 else if (offset1 != Py_None && offset2 != Py_None) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4622 PyDateTime_Delta *delta;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4623
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4624 assert(offset1 != offset2); /* else last "if" handled it */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4625 delta = (PyDateTime_Delta *)datetime_subtract((PyObject *)self,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4626 other);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4627 if (delta == NULL)
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4628 goto done;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4629 diff = GET_TD_DAYS(delta);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4630 if (diff == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4631 diff = GET_TD_SECONDS(delta) |
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4632 GET_TD_MICROSECONDS(delta);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4633 Py_DECREF(delta);
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4634 result = diff_to_bool(diff, op);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4635 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4636 else {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4637 PyErr_SetString(PyExc_TypeError,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4638 "can't compare offset-naive and "
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4639 "offset-aware datetimes");
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4640 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4641 done:
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4642 Py_DECREF(offset1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4643 Py_XDECREF(offset2);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4644 return result;
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4645 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4646
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65319
diff changeset
4647 static Py_hash_t
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4648 datetime_hash(PyDateTime_DateTime *self)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4649 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4650 if (self->hashcode == -1) {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4651 PyObject *offset;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4652
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4653 offset = datetime_utcoffset((PyObject *)self, NULL);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4654
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4655 if (offset == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4656 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4657
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4658 /* Reduce this to a hash of another object. */
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4659 if (offset == Py_None)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4660 self->hashcode = generic_hash(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4661 (unsigned char *)self->data, _PyDateTime_DATETIME_DATASIZE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4662 else {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4663 PyObject *temp1, *temp2;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4664 int days, seconds;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4665
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4666 assert(HASTZINFO(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4667 days = ymd_to_ord(GET_YEAR(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4668 GET_MONTH(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4669 GET_DAY(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4670 seconds = DATE_GET_HOUR(self) * 3600 +
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4671 DATE_GET_MINUTE(self) * 60 +
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4672 DATE_GET_SECOND(self);
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4673 temp1 = new_delta(days, seconds,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4674 DATE_GET_MICROSECOND(self),
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4675 1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4676 if (temp1 == NULL) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4677 Py_DECREF(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4678 return -1;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4679 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4680 temp2 = delta_subtract(temp1, offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4681 Py_DECREF(temp1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4682 if (temp2 == NULL) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4683 Py_DECREF(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4684 return -1;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4685 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4686 self->hashcode = PyObject_Hash(temp2);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4687 Py_DECREF(temp2);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4688 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4689 Py_DECREF(offset);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4690 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4691 return self->hashcode;
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4692 }
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4693
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4694 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4695 datetime_replace(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
26773
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
4696 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4697 PyObject *clone;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4698 PyObject *tuple;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4699 int y = GET_YEAR(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4700 int m = GET_MONTH(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4701 int d = GET_DAY(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4702 int hh = DATE_GET_HOUR(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4703 int mm = DATE_GET_MINUTE(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4704 int ss = DATE_GET_SECOND(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4705 int us = DATE_GET_MICROSECOND(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4706 PyObject *tzinfo = HASTZINFO(self) ? self->tzinfo : Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4707
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4708 if (! PyArg_ParseTupleAndKeywords(args, kw, "|iiiiiiiO:replace",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4709 datetime_kws,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4710 &y, &m, &d, &hh, &mm, &ss, &us,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4711 &tzinfo))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4712 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4713 tuple = Py_BuildValue("iiiiiiiO", y, m, d, hh, mm, ss, us, tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4714 if (tuple == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4715 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4716 clone = datetime_new(Py_TYPE(self), tuple, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4717 Py_DECREF(tuple);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4718 return clone;
26773
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
4719 }
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
4720
0f1405ace437 Implemented .replace() methods for date, datetime, datetimetz, time and
Tim Peters <tim.peters@gmail.com>
parents: 26751
diff changeset
4721 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4722 datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
26792
816b8ddccfe1 Implemented datetime.astimezone() and datetimetz.astimezone().
Tim Peters <tim.peters@gmail.com>
parents: 26773
diff changeset
4723 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4724 PyObject *result;
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4725 PyObject *offset;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4726 PyObject *temp;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4727 PyObject *tzinfo;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4728 static char *keywords[] = {"tz", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4729
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4730 if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:astimezone", keywords,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4731 &PyDateTime_TZInfoType, &tzinfo))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4732 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4733
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4734 if (!HASTZINFO(self) || self->tzinfo == Py_None)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4735 goto NeedAware;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4736
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4737 /* Conversion to self's own time zone is a NOP. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4738 if (self->tzinfo == tzinfo) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4739 Py_INCREF(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4740 return (PyObject *)self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4741 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4742
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4743 /* Convert self to UTC. */
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4744 offset = datetime_utcoffset((PyObject *)self, NULL);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4745 if (offset == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4746 return NULL;
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4747 if (offset == Py_None) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4748 Py_DECREF(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4749 NeedAware:
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4750 PyErr_SetString(PyExc_ValueError, "astimezone() cannot be applied to "
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4751 "a naive datetime");
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4752 return NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4753 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4754
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4755 /* result = self - offset */
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4756 result = add_datetime_timedelta(self,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4757 (PyDateTime_Delta *)offset, -1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4758 Py_DECREF(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4759 if (result == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4760 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4761
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4762 /* Attach new tzinfo and let fromutc() do the rest. */
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4763 temp = ((PyDateTime_DateTime *)result)->tzinfo;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4764 ((PyDateTime_DateTime *)result)->tzinfo = tzinfo;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4765 Py_INCREF(tzinfo);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4766 Py_DECREF(temp);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4767
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4768 temp = result;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4769 result = PyObject_CallMethod(tzinfo, "fromutc", "O", temp);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4770 Py_DECREF(temp);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4771
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4772 return result;
26792
816b8ddccfe1 Implemented datetime.astimezone() and datetimetz.astimezone().
Tim Peters <tim.peters@gmail.com>
parents: 26773
diff changeset
4773 }
816b8ddccfe1 Implemented datetime.astimezone() and datetimetz.astimezone().
Tim Peters <tim.peters@gmail.com>
parents: 26773
diff changeset
4774
816b8ddccfe1 Implemented datetime.astimezone() and datetimetz.astimezone().
Tim Peters <tim.peters@gmail.com>
parents: 26773
diff changeset
4775 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4776 datetime_timetuple(PyDateTime_DateTime *self)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4777 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4778 int dstflag = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4779
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4780 if (HASTZINFO(self) && self->tzinfo != Py_None) {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4781 PyObject * dst;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4782
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4783 dst = call_dst(self->tzinfo, (PyObject *)self);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4784 if (dst == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4785 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4786
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4787 if (dst != Py_None)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4788 dstflag = delta_bool((PyDateTime_Delta *)dst);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4789 Py_DECREF(dst);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4790 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4791 return build_struct_time(GET_YEAR(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4792 GET_MONTH(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4793 GET_DAY(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4794 DATE_GET_HOUR(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4795 DATE_GET_MINUTE(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4796 DATE_GET_SECOND(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4797 dstflag);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4798 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4799
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4800 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4801 datetime_getdate(PyDateTime_DateTime *self)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4802 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4803 return new_date(GET_YEAR(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4804 GET_MONTH(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4805 GET_DAY(self));
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4806 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4807
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4808 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4809 datetime_gettime(PyDateTime_DateTime *self)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4810 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4811 return new_time(DATE_GET_HOUR(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4812 DATE_GET_MINUTE(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4813 DATE_GET_SECOND(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4814 DATE_GET_MICROSECOND(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4815 Py_None);
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4816 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4817
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4818 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4819 datetime_gettimetz(PyDateTime_DateTime *self)
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4820 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4821 return new_time(DATE_GET_HOUR(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4822 DATE_GET_MINUTE(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4823 DATE_GET_SECOND(self),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4824 DATE_GET_MICROSECOND(self),
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4825 GET_DT_TZINFO(self));
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4826 }
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4827
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4828 static PyObject *
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4829 datetime_utctimetuple(PyDateTime_DateTime *self)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4830 {
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4831 int y, m, d, hh, mm, ss;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4832 PyObject *tzinfo;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4833 PyDateTime_DateTime *utcself;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4834
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4835 tzinfo = GET_DT_TZINFO(self);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4836 if (tzinfo == Py_None) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4837 utcself = self;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4838 Py_INCREF(utcself);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4839 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4840 else {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4841 PyObject *offset;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4842 offset = call_utcoffset(tzinfo, (PyObject *)self);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4843 if (offset == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4844 return NULL;
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4845 if (offset == Py_None) {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4846 Py_DECREF(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4847 utcself = self;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4848 Py_INCREF(utcself);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4849 }
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4850 else {
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4851 utcself = (PyDateTime_DateTime *)add_datetime_timedelta(self,
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4852 (PyDateTime_Delta *)offset, -1);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4853 Py_DECREF(offset);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4854 if (utcself == NULL)
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4855 return NULL;
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4856 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4857 }
62858
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4858 y = GET_YEAR(utcself);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4859 m = GET_MONTH(utcself);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4860 d = GET_DAY(utcself);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4861 hh = DATE_GET_HOUR(utcself);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4862 mm = DATE_GET_MINUTE(utcself);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4863 ss = DATE_GET_SECOND(utcself);
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4864
040679087d03 Issue #5288: Eliminated round-trips between timdelta and int offsets
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62837
diff changeset
4865 Py_DECREF(utcself);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4866 return build_struct_time(y, m, d, hh, mm, ss, 0);
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4867 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4868
27572
f235f135f3f8 All over: changed comments to reflect pickling is straightforward now,
Tim Peters <tim.peters@gmail.com>
parents: 27571
diff changeset
4869 /* Pickle support, a simple use of __reduce__. */
27193
934732787419 Removed more now-pointless pickle code.
Tim Peters <tim.peters@gmail.com>
parents: 27172
diff changeset
4870
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4871 /* Let basestate be the non-tzinfo data string.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4872 * If tzinfo is None, this returns (basestate,), else (basestate, tzinfo).
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4873 * So it's a tuple in any (non-error) case.
27575
3b9fb57fac34 There's no good reason for datetime objects to expose __getstate__()
Tim Peters <tim.peters@gmail.com>
parents: 27573
diff changeset
4874 * __getstate__ isn't exposed.
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4875 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4876 static PyObject *
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4877 datetime_getstate(PyDateTime_DateTime *self)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4878 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4879 PyObject *basestate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4880 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4881
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4882 basestate = PyBytes_FromStringAndSize((char *)self->data,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4883 _PyDateTime_DATETIME_DATASIZE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4884 if (basestate != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4885 if (! HASTZINFO(self) || self->tzinfo == Py_None)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4886 result = PyTuple_Pack(1, basestate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4887 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4888 result = PyTuple_Pack(2, basestate, self->tzinfo);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4889 Py_DECREF(basestate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4890 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4891 return result;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4892 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4893
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4894 static PyObject *
27538
87943faf4fd2 Change the approach to pickling to use __reduce__ everywhere. Most
Guido van Rossum <guido@python.org>
parents: 27365
diff changeset
4895 datetime_reduce(PyDateTime_DateTime *self, PyObject *arg)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4896 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4897 return Py_BuildValue("(ON)", Py_TYPE(self), datetime_getstate(self));
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4898 }
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4899
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4900 static PyMethodDef datetime_methods[] = {
27538
87943faf4fd2 Change the approach to pickling to use __reduce__ everywhere. Most
Guido van Rossum <guido@python.org>
parents: 27365
diff changeset
4901
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4902 /* Class methods: */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4903
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4904 {"now", (PyCFunction)datetime_now,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4905 METH_VARARGS | METH_KEYWORDS | METH_CLASS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4906 PyDoc_STR("[tz] -> new datetime with tz's local day and time.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4907
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4908 {"utcnow", (PyCFunction)datetime_utcnow,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4909 METH_NOARGS | METH_CLASS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4910 PyDoc_STR("Return a new datetime representing UTC day and time.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4911
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4912 {"fromtimestamp", (PyCFunction)datetime_fromtimestamp,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4913 METH_VARARGS | METH_KEYWORDS | METH_CLASS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4914 PyDoc_STR("timestamp[, tz] -> tz's local time from POSIX timestamp.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4915
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4916 {"utcfromtimestamp", (PyCFunction)datetime_utcfromtimestamp,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4917 METH_VARARGS | METH_CLASS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4918 PyDoc_STR("timestamp -> UTC datetime from a POSIX timestamp "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4919 "(like time.time()).")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4920
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4921 {"strptime", (PyCFunction)datetime_strptime,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4922 METH_VARARGS | METH_CLASS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4923 PyDoc_STR("string, format -> new datetime parsed from a string "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4924 "(like time.strptime()).")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4925
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4926 {"combine", (PyCFunction)datetime_combine,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4927 METH_VARARGS | METH_KEYWORDS | METH_CLASS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4928 PyDoc_STR("date, time -> datetime with same date and time fields")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4929
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4930 /* Instance methods: */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4931
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4932 {"date", (PyCFunction)datetime_getdate, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4933 PyDoc_STR("Return date object with same year, month and day.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4934
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4935 {"time", (PyCFunction)datetime_gettime, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4936 PyDoc_STR("Return time object with same time but with tzinfo=None.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4937
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4938 {"timetz", (PyCFunction)datetime_gettimetz, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4939 PyDoc_STR("Return time object with same time and tzinfo.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4940
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4941 {"ctime", (PyCFunction)datetime_ctime, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4942 PyDoc_STR("Return ctime() style string.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4943
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4944 {"timetuple", (PyCFunction)datetime_timetuple, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4945 PyDoc_STR("Return time tuple, compatible with time.localtime().")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4946
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4947 {"utctimetuple", (PyCFunction)datetime_utctimetuple, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4948 PyDoc_STR("Return UTC time tuple, compatible with time.localtime().")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4949
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4950 {"isoformat", (PyCFunction)datetime_isoformat, METH_VARARGS | METH_KEYWORDS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4951 PyDoc_STR("[sep] -> string in ISO 8601 format, "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4952 "YYYY-MM-DDTHH:MM:SS[.mmmmmm][+HH:MM].\n\n"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4953 "sep is used to separate the year from the time, and "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4954 "defaults to 'T'.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4955
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4956 {"utcoffset", (PyCFunction)datetime_utcoffset, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4957 PyDoc_STR("Return self.tzinfo.utcoffset(self).")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4958
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4959 {"tzname", (PyCFunction)datetime_tzname, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4960 PyDoc_STR("Return self.tzinfo.tzname(self).")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4961
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4962 {"dst", (PyCFunction)datetime_dst, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4963 PyDoc_STR("Return self.tzinfo.dst(self).")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4964
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4965 {"replace", (PyCFunction)datetime_replace, METH_VARARGS | METH_KEYWORDS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4966 PyDoc_STR("Return datetime with new specified fields.")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4967
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4968 {"astimezone", (PyCFunction)datetime_astimezone, METH_VARARGS | METH_KEYWORDS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4969 PyDoc_STR("tz -> convert to local time in new timezone tz\n")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4970
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4971 {"__reduce__", (PyCFunction)datetime_reduce, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4972 PyDoc_STR("__reduce__() -> (cls, state)")},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4973
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4974 {NULL, NULL}
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4975 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4976
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4977 static char datetime_doc[] =
34191
cd4dd6dd9721 Bug #1087216: datetime module documentation missing critical detail
Raymond Hettinger <python@rcn.com>
parents: 33498
diff changeset
4978 PyDoc_STR("datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\n\
cd4dd6dd9721 Bug #1087216: datetime module documentation missing critical detail
Raymond Hettinger <python@rcn.com>
parents: 33498
diff changeset
4979 \n\
cd4dd6dd9721 Bug #1087216: datetime module documentation missing critical detail
Raymond Hettinger <python@rcn.com>
parents: 33498
diff changeset
4980 The year, month and day arguments are required. tzinfo may be None, or an\n\
cd4dd6dd9721 Bug #1087216: datetime module documentation missing critical detail
Raymond Hettinger <python@rcn.com>
parents: 33498
diff changeset
4981 instance of a tzinfo subclass. The remaining arguments may be ints or longs.\n");
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4982
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
4983 static PyNumberMethods datetime_as_number = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4984 datetime_add, /* nb_add */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4985 datetime_subtract, /* nb_subtract */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4986 0, /* nb_multiply */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4987 0, /* nb_remainder */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4988 0, /* nb_divmod */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4989 0, /* nb_power */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4990 0, /* nb_negative */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4991 0, /* nb_positive */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4992 0, /* nb_absolute */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4993 0, /* nb_bool */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4994 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4995
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36684
diff changeset
4996 static PyTypeObject PyDateTime_DateTimeType = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4997 PyVarObject_HEAD_INIT(NULL, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4998 "datetime.datetime", /* tp_name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
4999 sizeof(PyDateTime_DateTime), /* tp_basicsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5000 0, /* tp_itemsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5001 (destructor)datetime_dealloc, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5002 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5003 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5004 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5005 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5006 (reprfunc)datetime_repr, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5007 &datetime_as_number, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5008 0, /* tp_as_sequence */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5009 0, /* tp_as_mapping */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5010 (hashfunc)datetime_hash, /* tp_hash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5011 0, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5012 (reprfunc)datetime_str, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5013 PyObject_GenericGetAttr, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5014 0, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5015 0, /* tp_as_buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5016 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5017 datetime_doc, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5018 0, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5019 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5020 datetime_richcompare, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5021 0, /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5022 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5023 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5024 datetime_methods, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5025 0, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5026 datetime_getset, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5027 &PyDateTime_DateType, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5028 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5029 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5030 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5031 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5032 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5033 datetime_alloc, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5034 datetime_new, /* tp_new */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5035 0, /* tp_free */
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5036 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5037
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5038 /* ---------------------------------------------------------------------------
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5039 * Module methods and initialization.
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5040 */
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5041
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5042 static PyMethodDef module_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5043 {NULL, NULL}
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5044 };
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5045
32393
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
5046 /* C API. Clients get at this via PyDateTime_IMPORT, defined in
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
5047 * datetime.h.
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
5048 */
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
5049 static PyDateTime_CAPI CAPI = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5050 &PyDateTime_DateType,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5051 &PyDateTime_DateTimeType,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5052 &PyDateTime_TimeType,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5053 &PyDateTime_DeltaType,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5054 &PyDateTime_TZInfoType,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5055 new_date_ex,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5056 new_datetime_ex,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5057 new_time_ex,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5058 new_delta_ex,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5059 datetime_fromtimestamp,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5060 date_fromtimestamp
32393
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
5061 };
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
5062
e5df8c8faa09 SF patch 876130: add C API to datetime module, from Anthony Tuininga.
Tim Peters <tim.peters@gmail.com>
parents: 32388
diff changeset
5063
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47559
diff changeset
5064
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47559
diff changeset
5065 static struct PyModuleDef datetimemodule = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5066 PyModuleDef_HEAD_INIT,
63184
afdb53323065 Issue #7989: Added pure python implementation of the datetime module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62858
diff changeset
5067 "_datetime",
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5068 "Fast implementation of the datetime type.",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5069 -1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5070 module_methods,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5071 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5072 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5073 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5074 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47559
diff changeset
5075 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47559
diff changeset
5076
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5077 PyMODINIT_FUNC
63184
afdb53323065 Issue #7989: Added pure python implementation of the datetime module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62858
diff changeset
5078 PyInit__datetime(void)
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5079 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5080 PyObject *m; /* a module object */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5081 PyObject *d; /* its dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5082 PyObject *x;
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5083 PyObject *delta;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5084
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5085 m = PyModule_Create(&datetimemodule);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5086 if (m == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5087 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5088
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5089 if (PyType_Ready(&PyDateTime_DateType) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5090 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5091 if (PyType_Ready(&PyDateTime_DateTimeType) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5092 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5093 if (PyType_Ready(&PyDateTime_DeltaType) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5094 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5095 if (PyType_Ready(&PyDateTime_TimeType) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5096 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5097 if (PyType_Ready(&PyDateTime_TZInfoType) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5098 return NULL;
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5099 if (PyType_Ready(&PyDateTime_TimeZoneType) < 0)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5100 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5101
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5102 /* timedelta values */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5103 d = PyDateTime_DeltaType.tp_dict;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5104
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5105 x = new_delta(0, 0, 1, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5106 if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5107 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5108 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5109
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5110 x = new_delta(-MAX_DELTA_DAYS, 0, 0, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5111 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5112 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5113 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5114
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5115 x = new_delta(MAX_DELTA_DAYS, 24*3600-1, 1000000-1, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5116 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5117 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5118 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5119
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5120 /* date values */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5121 d = PyDateTime_DateType.tp_dict;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5122
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5123 x = new_date(1, 1, 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5124 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5125 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5126 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5127
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5128 x = new_date(MAXYEAR, 12, 31);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5129 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5130 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5131 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5132
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5133 x = new_delta(1, 0, 0, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5134 if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5135 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5136 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5137
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5138 /* time values */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5139 d = PyDateTime_TimeType.tp_dict;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5140
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5141 x = new_time(0, 0, 0, 0, Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5142 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5143 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5144 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5145
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5146 x = new_time(23, 59, 59, 999999, Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5147 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5148 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5149 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5150
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5151 x = new_delta(0, 0, 1, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5152 if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5153 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5154 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5155
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5156 /* datetime values */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5157 d = PyDateTime_DateTimeType.tp_dict;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5158
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5159 x = new_datetime(1, 1, 1, 0, 0, 0, 0, Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5160 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5161 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5162 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5163
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5164 x = new_datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5165 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5166 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5167 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5168
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5169 x = new_delta(0, 0, 1, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5170 if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5171 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5172 Py_DECREF(x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5173
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5174 /* timezone values */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5175 d = PyDateTime_TimeZoneType.tp_dict;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5176
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5177 delta = new_delta(0, 0, 0, 0);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5178 if (delta == NULL)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5179 return NULL;
65319
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
5180 x = create_timezone(delta, NULL);
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5181 Py_DECREF(delta);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5182 if (x == NULL || PyDict_SetItemString(d, "utc", x) < 0)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5183 return NULL;
62837
5812dd44807a Issue #9000: datetime.timezone objects now have eval-friendly repr.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62768
diff changeset
5184 PyDateTime_TimeZone_UTC = x;
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5185
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5186 delta = new_delta(-1, 60, 0, 1); /* -23:59 */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5187 if (delta == NULL)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5188 return NULL;
65319
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
5189 x = create_timezone(delta, NULL);
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5190 Py_DECREF(delta);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5191 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5192 return NULL;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5193 Py_DECREF(x);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5194
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5195 delta = new_delta(0, (23 * 60 + 59) * 60, 0, 0); /* +23:59 */
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5196 if (delta == NULL)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5197 return NULL;
65319
078e2e47e52b Issue 9183: Intern UTC timezone.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 65276
diff changeset
5198 x = create_timezone(delta, NULL);
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5199 Py_DECREF(delta);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5200 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5201 return NULL;
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5202 Py_DECREF(x);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5203
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5204 /* module initialization */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5205 PyModule_AddIntConstant(m, "MINYEAR", MINYEAR);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5206 PyModule_AddIntConstant(m, "MAXYEAR", MAXYEAR);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5207
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5208 Py_INCREF(&PyDateTime_DateType);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5209 PyModule_AddObject(m, "date", (PyObject *) &PyDateTime_DateType);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5210
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5211 Py_INCREF(&PyDateTime_DateTimeType);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5212 PyModule_AddObject(m, "datetime",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5213 (PyObject *)&PyDateTime_DateTimeType);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5214
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5215 Py_INCREF(&PyDateTime_TimeType);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5216 PyModule_AddObject(m, "time", (PyObject *) &PyDateTime_TimeType);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5217
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5218 Py_INCREF(&PyDateTime_DeltaType);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5219 PyModule_AddObject(m, "timedelta", (PyObject *) &PyDateTime_DeltaType);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5220
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5221 Py_INCREF(&PyDateTime_TZInfoType);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5222 PyModule_AddObject(m, "tzinfo", (PyObject *) &PyDateTime_TZInfoType);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5223
62325
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5224 Py_INCREF(&PyDateTime_TimeZoneType);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5225 PyModule_AddObject(m, "timezone", (PyObject *) &PyDateTime_TimeZoneType);
b78a918b7a0e Issue #5094: The ``datetime`` module now has a simple concrete class
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62154
diff changeset
5226
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5227 x = PyCapsule_New(&CAPI, PyDateTime_CAPSULE_NAME, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5228 if (x == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5229 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5230 PyModule_AddObject(m, "datetime_CAPI", x);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5231
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5232 /* A 4-year cycle has an extra leap day over what we'd get from
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5233 * pasting together 4 single years.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5234 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5235 assert(DI4Y == 4 * 365 + 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5236 assert(DI4Y == days_before_year(4+1));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5237
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5238 /* Similarly, a 400-year cycle has an extra leap day over what we'd
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5239 * get from pasting together 4 100-year cycles.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5240 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5241 assert(DI400Y == 4 * DI100Y + 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5242 assert(DI400Y == days_before_year(400+1));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5243
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5244 /* OTOH, a 100-year cycle has one fewer leap day than we'd get from
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5245 * pasting together 25 4-year cycles.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5246 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5247 assert(DI100Y == 25 * DI4Y - 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5248 assert(DI100Y == days_before_year(100+1));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5249
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5250 us_per_us = PyLong_FromLong(1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5251 us_per_ms = PyLong_FromLong(1000);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5252 us_per_second = PyLong_FromLong(1000000);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5253 us_per_minute = PyLong_FromLong(60000000);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5254 seconds_per_day = PyLong_FromLong(24 * 3600);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5255 if (us_per_us == NULL || us_per_ms == NULL || us_per_second == NULL ||
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5256 us_per_minute == NULL || seconds_per_day == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5257 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5258
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5259 /* The rest are too big for 32-bit ints, but even
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5260 * us_per_week fits in 40 bits, so doubles should be exact.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5261 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5262 us_per_hour = PyLong_FromDouble(3600000000.0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5263 us_per_day = PyLong_FromDouble(86400000000.0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5264 us_per_week = PyLong_FromDouble(604800000000.0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5265 if (us_per_hour == NULL || us_per_day == NULL || us_per_week == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5266 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5267 return m;
26673
5b715cad34d0 datetime escapes the sandbox. The Windows build is all set. I leave it
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5268 }
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5269
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5270 /* ---------------------------------------------------------------------------
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
5271 Some time zone algebra. For a datetime x, let
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5272 x.n = x stripped of its timezone -- its naive time.
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5273 x.o = x.utcoffset(), and assuming that doesn't raise an exception or
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5274 return None
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5275 x.d = x.dst(), and assuming that doesn't raise an exception or
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5276 return None
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5277 x.s = x's standard offset, x.o - x.d
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5278
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5279 Now some derived rules, where k is a duration (timedelta).
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5280
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5281 1. x.o = x.s + x.d
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5282 This follows from the definition of x.s.
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5283
27032
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5284 2. If x and y have the same tzinfo member, x.s = y.s.
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5285 This is actually a requirement, an assumption we need to make about
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5286 sane tzinfo classes.
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5287
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5288 3. The naive UTC time corresponding to x is x.n - x.o.
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5289 This is again a requirement for a sane tzinfo class.
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5290
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5291 4. (x+k).s = x.s
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5292 This follows from #2, and that datimetimetz+timedelta preserves tzinfo.
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5293
27032
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5294 5. (x+k).n = x.n + k
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5295 Again follows from how arithmetic is defined.
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5296
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5297 Now we can explain tz.fromutc(x). Let's assume it's an interesting case
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5298 (meaning that the various tzinfo methods exist, and don't blow up or return
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5299 None when called).
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5300
27218
38d2238c795e Got rid of the internal datetimetz type.
Tim Peters <tim.peters@gmail.com>
parents: 27217
diff changeset
5301 The function wants to return a datetime y with timezone tz, equivalent to x.
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5302 x is already in UTC.
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5303
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5304 By #3, we want
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5305
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5306 y.n - y.o = x.n [1]
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5307
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5308 The algorithm starts by attaching tz to x.n, and calling that y. So
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5309 x.n = y.n at the start. Then it wants to add a duration k to y, so that [1]
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5310 becomes true; in effect, we want to solve [2] for k:
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5311
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5312 (y+k).n - (y+k).o = x.n [2]
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5313
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5314 By #1, this is the same as
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5315
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5316 (y+k).n - ((y+k).s + (y+k).d) = x.n [3]
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5317
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5318 By #5, (y+k).n = y.n + k, which equals x.n + k because x.n=y.n at the start.
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5319 Substituting that into [3],
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5320
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5321 x.n + k - (y+k).s - (y+k).d = x.n; the x.n terms cancel, leaving
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5322 k - (y+k).s - (y+k).d = 0; rearranging,
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5323 k = (y+k).s - (y+k).d; by #4, (y+k).s == y.s, so
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5324 k = y.s - (y+k).d
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5325
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5326 On the RHS, (y+k).d can't be computed directly, but y.s can be, and we
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5327 approximate k by ignoring the (y+k).d term at first. Note that k can't be
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5328 very large, since all offset-returning methods return a duration of magnitude
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5329 less than 24 hours. For that reason, if y is firmly in std time, (y+k).d must
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5330 be 0, so ignoring it has no consequence then.
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5331
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5332 In any case, the new value is
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5333
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5334 z = y + y.s [4]
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5335
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5336 It's helpful to step back at look at [4] from a higher level: it's simply
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5337 mapping from UTC to tz's standard time.
27032
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5338
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5339 At this point, if
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5340
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5341 z.n - z.o = x.n [5]
27032
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5342
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5343 we have an equivalent time, and are almost done. The insecurity here is
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5344 at the start of daylight time. Picture US Eastern for concreteness. The wall
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5345 time jumps from 1:59 to 3:00, and wall hours of the form 2:MM don't make good
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5346 sense then. The docs ask that an Eastern tzinfo class consider such a time to
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5347 be EDT (because it's "after 2"), which is a redundant spelling of 1:MM EST
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5348 on the day DST starts. We want to return the 1:MM EST spelling because that's
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5349 the only spelling that makes sense on the local wall clock.
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5350
27032
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5351 In fact, if [5] holds at this point, we do have the standard-time spelling,
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5352 but that takes a bit of proof. We first prove a stronger result. What's the
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5353 difference between the LHS and RHS of [5]? Let
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5354
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5355 diff = x.n - (z.n - z.o) [6]
27032
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5356
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5357 Now
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5358 z.n = by [4]
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5359 (y + y.s).n = by #5
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5360 y.n + y.s = since y.n = x.n
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5361 x.n + y.s = since z and y are have the same tzinfo member,
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5362 y.s = z.s by #2
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5363 x.n + z.s
27032
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5364
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5365 Plugging that back into [6] gives
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5366
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5367 diff =
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5368 x.n - ((x.n + z.s) - z.o) = expanding
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5369 x.n - x.n - z.s + z.o = cancelling
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5370 - z.s + z.o = by #2
27032
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5371 z.d
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5372
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5373 So diff = z.d.
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5374
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5375 If [5] is true now, diff = 0, so z.d = 0 too, and we have the standard-time
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5376 spelling we wanted in the endcase described above. We're done. Contrarily,
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5377 if z.d = 0, then we have a UTC equivalent, and are also done.
27032
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5378
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5379 If [5] is not true now, diff = z.d != 0, and z.d is the offset we need to
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5380 add to z (in effect, z is in tz's standard time, and we need to shift the
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5381 local clock into tz's daylight time).
27032
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5382
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5383 Let
b61a66022d5a The astimezone() correctness proof endured much pain to prove what
Tim Peters <tim.peters@gmail.com>
parents: 27029
diff changeset
5384
27070
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5385 z' = z + z.d = z + diff [7]
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5386
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5387 and we can again ask whether
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5388
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5389 z'.n - z'.o = x.n [8]
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5390
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5391 If so, we're done. If not, the tzinfo class is insane, according to the
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5392 assumptions we've made. This also requires a bit of proof. As before, let's
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5393 compute the difference between the LHS and RHS of [8] (and skipping some of
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5394 the justifications for the kinds of substitutions we've done several times
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5395 already):
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5396
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5397 diff' = x.n - (z'.n - z'.o) = replacing z'.n via [7]
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5398 x.n - (z.n + diff - z'.o) = replacing diff via [6]
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5399 x.n - (z.n + x.n - (z.n - z.o) - z'.o) =
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5400 x.n - z.n - x.n + z.n - z.o + z'.o = cancel x.n
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5401 - z.n + z.n - z.o + z'.o = cancel z.n
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5402 - z.o + z'.o = #1 twice
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5403 -z.s - z.d + z'.s + z'.d = z and z' have same tzinfo
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61413
diff changeset
5404 z'.d - z.d
27070
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5405
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5406 So z' is UTC-equivalent to x iff z'.d = z.d at this point. If they are equal,
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5407 we've found the UTC-equivalent so are done. In fact, we stop with [7] and
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5408 return z', not bothering to compute z'.d.
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5409
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5410 How could z.d and z'd differ? z' = z + z.d [7], so merely moving z' by
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5411 a dst() offset, and starting *from* a time already in DST (we know z.d != 0),
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5412 would have to change the result dst() returns: we start in DST, and moving
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5413 a little further into it takes us out of DST.
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5414
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5415 There isn't a sane case where this can happen. The closest it gets is at
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5416 the end of DST, where there's an hour in UTC with no spelling in a hybrid
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5417 tzinfo class. In US Eastern, that's 5:MM UTC = 0:MM EST = 1:MM EDT. During
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5418 that hour, on an Eastern clock 1:MM is taken as being in standard time (6:MM
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5419 UTC) because the docs insist on that, but 0:MM is taken as being in daylight
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5420 time (4:MM UTC). There is no local time mapping to 5:MM UTC. The local
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5421 clock jumps from 1:59 back to 1:00 again, and repeats the 1:MM hour in
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5422 standard time. Since that's what the local clock *does*, we want to map both
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5423 UTC hours 5:MM and 6:MM to 1:MM Eastern. The result is ambiguous
27070
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5424 in local time, but so it goes -- it's the way the local clock works.
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5425
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5426 When x = 5:MM UTC is the input to this algorithm, x.o=0, y.o=-5 and y.d=0,
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5427 so z=0:MM. z.d=60 (minutes) then, so [5] doesn't hold and we keep going.
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5428 z' = z + z.d = 1:MM then, and z'.d=0, and z'.d - z.d = -60 != 0 so [8]
27070
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5429 (correctly) concludes that z' is not UTC-equivalent to x.
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5430
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5431 Because we know z.d said z was in daylight time (else [5] would have held and
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5432 we would have stopped then), and we know z.d != z'.d (else [8] would have held
30722
651fc8d98d99 Fix a bunch of typos in documentation, docstrings and comments.
Walter Dörwald <walter@livinglogic.de>
parents: 30683
diff changeset
5433 and we would have stopped then), and there are only 2 possible values dst() can
27070
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5434 return in Eastern, it follows that z'.d must be 0 (which it is in the example,
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5435 but the reasoning doesn't depend on the example -- it depends on there being
e92044c0b8ec Completed astimezone()'s correctness proof. This also proves we can get
Tim Peters <tim.peters@gmail.com>
parents: 27037
diff changeset
5436 two possible dst() outcomes, one zero and the other non-zero). Therefore
27353
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5437 z' must be in standard time, and is the spelling we want in this case.
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5438
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5439 Note again that z' is not UTC-equivalent as far as the hybrid tzinfo class is
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5440 concerned (because it takes z' as being in standard time rather than the
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5441 daylight time we intend here), but returning it gives the real-life "local
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5442 clock repeats an hour" behavior when mapping the "unspellable" UTC hour into
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5443 tz.
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5444
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5445 When the input is 6:MM, z=1:MM and z.d=0, and we stop at once, again with
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5446 the 1:MM standard time spelling we want.
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5447
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5448 So how can this break? One of the assumptions must be violated. Two
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5449 possibilities:
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5450
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5451 1) [2] effectively says that y.s is invariant across all y belong to a given
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5452 time zone. This isn't true if, for political reasons or continental drift,
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5453 a region decides to change its base offset from UTC.
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5454
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5455 2) There may be versions of "double daylight" time where the tail end of
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5456 the analysis gives up a step too early. I haven't thought about that
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5457 enough to say.
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5458
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5459 In any case, it's clear that the default fromutc() is strong enough to handle
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5460 "almost all" time zones: so long as the standard offset is invariant, it
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5461 doesn't matter if daylight time transition points change from year to year, or
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5462 if daylight time is skipped in some years; it doesn't matter how large or
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5463 small dst() may get within its bounds; and it doesn't even matter if some
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5464 perverse time zone returns a negative dst()). So a breaking case must be
27aedcf46bcc Updated the astimezone() proof to recover from all the last week's
Tim Peters <tim.peters@gmail.com>
parents: 27352
diff changeset
5465 pretty bizarre, and a tzinfo subclass can override fromutc() if it is.
27008
4579e83c663b A quicker astimezone() implementation, rehabilitating an earlier
Tim Peters <tim.peters@gmail.com>
parents: 26996
diff changeset
5466 --------------------------------------------------------------------------- */