self.assertEqual(fromord.second, 0)
self.assertEqual(fromord.microsecond, 0)
- # Check first and last days of year spottily across the whole
- # range of years supported.
- for year in xrange(MINYEAR, MAXYEAR+1, 7):
+ # Check first and last days of year across the whole range of years
+ # supported.
+ ordinal = 1
+ for year in xrange(MINYEAR, MAXYEAR+1):
# Verify (year, 1, 1) -> ordinal -> y, m, d is identity.
d = self.theclass(year, 1, 1)
n = d.toordinal()
+ self.assertEqual(ordinal, n)
d2 = self.theclass.fromordinal(n)
self.assertEqual(d, d2)
- # Verify that moving back a day gets to the end of year-1.
- if year > 1:
- d = self.theclass.fromordinal(n-1)
- d2 = self.theclass(year-1, 12, 31)
- self.assertEqual(d, d2)
- self.assertEqual(d2.toordinal(), n-1)
+ self.assertEqual(d.timetuple().tm_yday, 1)
+ # Same for (year, 12, 31).
+ isleap = year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
+ days_in_year = 365 + isleap
+ d = self.theclass(year, 12, 31)
+ n = d.toordinal()
+ self.assertEqual(n, ordinal + days_in_year - 1)
+ self.assertEqual(d.timetuple().tm_yday, days_in_year)
+ d2 = self.theclass.fromordinal(n)
+ self.assertEqual(d, d2)
+ ordinal += days_in_year
# Test every day in a leap-year and a non-leap year.
dim = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
* bogus, an appropriate exception is set and -1 is returned.
*/
static int
-format_utcoffset(char *buf, int buflen, const char *sep,
+format_utcoffset(char *buf, size_t buflen, const char *sep,
PyObject *tzinfo, PyObject *tzinfoarg)
{
int offset;
char *ptoappend; /* pointer to string to append to output buffer */
int ntoappend; /* # of bytes to append to output buffer */
- char buf[100]; /* scratch buffer */
-
assert(object && format && timetuple);
assert(PyString_Check(format));
/* Scan the input format, looking for %z and %Z escapes, building
- * a new format.
+ * a new format. Since computing the replacements for those codes
+ * is expensive, don't unless they're actually used.
*/
totalnew = PyString_Size(format); /* realistic if no %z/%Z */
newfmt = PyString_FromStringAndSize(NULL, totalnew);
pin = PyString_AsString(format);
while ((ch = *pin++) != '\0') {
if (ch != '%') {
- buf[0] = ch;
- ptoappend = buf;
+ ptoappend = pin - 1;
ntoappend = 1;
}
else if ((ch = *pin++) == '\0') {
else if (ch == 'z') {
if (zreplacement == NULL) {
/* format utcoffset */
+ char buf[100];
PyObject *tzinfo = get_tzinfo_member(object);
zreplacement = PyString_FromString("");
if (zreplacement == NULL) goto Done;
if (tzinfo != Py_None && tzinfo != NULL) {
if (format_utcoffset(buf,
- (int)sizeof(buf),
+ sizeof(buf),
"",
tzinfo,
object) < 0)
ntoappend = PyString_Size(Zreplacement);
}
else {
- buf[0] = '%';
- buf[1] = ch;
- ptoappend = buf;
+ /* percent followed by neither z nor Z */
+ ptoappend = pin - 2;
ntoappend = 2;
}