]> granicus.if.org Git - python/commitdiff
format_utcoffset(): The natural type of the buflen arg is size_t, so
authorTim Peters <tim.peters@gmail.com>
Fri, 20 Dec 2002 01:31:27 +0000 (01:31 +0000)
committerTim Peters <tim.peters@gmail.com>
Fri, 20 Dec 2002 01:31:27 +0000 (01:31 +0000)
used that.

wrap_strftime():  Removed the most irritating uses of buf.

TestDate.test_ordinal_conversions():  The C implementation is fast enough
that we can afford to check the endpoints of every year.  Also added
tm_yday tests at the endpoints.

Lib/test/test_datetime.py
Modules/datetimemodule.c

index cf6bd920eddc6a0d53ff09a7388b80fed5d268df..2d7922faaf0c37591be0181444b67ed1fa8a55ff 100644 (file)
@@ -469,20 +469,27 @@ class TestDate(unittest.TestCase):
                 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]
index 3aab3adf1152a73b84438d2c3db2938225799b88..6dff6594b7a3561760057c09174671a83952214e 100644 (file)
@@ -812,7 +812,7 @@ format_ctime(PyDateTime_Date *date,
  * 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;
@@ -863,13 +863,12 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple)
        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);
@@ -880,8 +879,7 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple)
        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') {
@@ -894,12 +892,13 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple)
                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)
@@ -948,9 +947,8 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple)
                        ntoappend = PyString_Size(Zreplacement);
                }
                else {
-                       buf[0] = '%';
-                       buf[1] = ch;
-                       ptoappend = buf;
+                       /* percent followed by neither z nor Z */
+                       ptoappend = pin - 2;
                        ntoappend = 2;
                }