1 /* C implementation for the date/time type documented at 2 * http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage 3 */ 4 5 #define PY_SSIZE_T_CLEAN 6 7 #include "Python.h" 8 #include "modsupport.h" 9 #include "structmember.h" 10 11 #include <time.h> 12 13 #include "timefuncs.h" 14 15 /* Differentiate between building the core module and building extension 16 * modules. 17 */ 18 #ifndef Py_BUILD_CORE 19 #define Py_BUILD_CORE 20 #endif 21 #include "datetime.h" 22 #undef Py_BUILD_CORE 23 24 /* We require that C int be at least 32 bits, and use int virtually 25 * everywhere. In just a few cases we use a temp long, where a Python 26 * API returns a C long. In such cases, we have to ensure that the 27 * final result fits in a C int (this can be an issue on 64-bit boxes). 28 */ 29 #if SIZEOF_INT < 4 30 # error "datetime.c requires that C int have at least 32 bits" 31 #endif 32 33 #define MINYEAR 1 34 #define MAXYEAR 9999 35 #define MAXORDINAL 3652059 /* date(9999,12,31).toordinal() */ 36 37 /* Nine decimal digits is easy to communicate, and leaves enough room 38 * so that two delta days can be added w/o fear of overflowing a signed 39 * 32-bit int, and with plenty of room left over to absorb any possible 40 * carries from adding seconds. 41 */ 42 #define MAX_DELTA_DAYS 999999999 43 44 /* Rename the long macros in datetime.h to more reasonable short names. */ 45 #define GET_YEAR PyDateTime_GET_YEAR 46 #define GET_MONTH PyDateTime_GET_MONTH 47 #define GET_DAY PyDateTime_GET_DAY 48 #define DATE_GET_HOUR PyDateTime_DATE_GET_HOUR 49 #define DATE_GET_MINUTE PyDateTime_DATE_GET_MINUTE 50 #define DATE_GET_SECOND PyDateTime_DATE_GET_SECOND 51 #define DATE_GET_MICROSECOND PyDateTime_DATE_GET_MICROSECOND 52 53 /* Date accessors for date and datetime. */ 54 #define SET_YEAR(o, v) (((o)->data[0] = ((v) & 0xff00) >> 8), \ 55 ((o)->data[1] = ((v) & 0x00ff))) 56 #define SET_MONTH(o, v) (PyDateTime_GET_MONTH(o) = (v)) 57 #define SET_DAY(o, v) (PyDateTime_GET_DAY(o) = (v)) 58 59 /* Date/Time accessors for datetime. */ 60 #define DATE_SET_HOUR(o, v) (PyDateTime_DATE_GET_HOUR(o) = (v)) 61 #define DATE_SET_MINUTE(o, v) (PyDateTime_DATE_GET_MINUTE(o) = (v)) 62 #define DATE_SET_SECOND(o, v) (PyDateTime_DATE_GET_SECOND(o) = (v)) 63 #define DATE_SET_MICROSECOND(o, v) \ 64 (((o)->data[7] = ((v) & 0xff0000) >> 16), \ 65 ((o)->data[8] = ((v) & 0x00ff00) >> 8), \ 66 ((o)->data[9] = ((v) & 0x0000ff))) 67 68 /* Time accessors for time. */ 69 #define TIME_GET_HOUR PyDateTime_TIME_GET_HOUR 70 #define TIME_GET_MINUTE PyDateTime_TIME_GET_MINUTE 71 #define TIME_GET_SECOND PyDateTime_TIME_GET_SECOND 72 #define TIME_GET_MICROSECOND PyDateTime_TIME_GET_MICROSECOND 73 #define TIME_SET_HOUR(o, v) (PyDateTime_TIME_GET_HOUR(o) = (v)) 74 #define TIME_SET_MINUTE(o, v) (PyDateTime_TIME_GET_MINUTE(o) = (v)) 75 #define TIME_SET_SECOND(o, v) (PyDateTime_TIME_GET_SECOND(o) = (v)) 76 #define TIME_SET_MICROSECOND(o, v) \ 77 (((o)->data[3] = ((v) & 0xff0000) >> 16), \ 78 ((o)->data[4] = ((v) & 0x00ff00) >> 8), \ 79 ((o)->data[5] = ((v) & 0x0000ff))) 80 81 /* Delta accessors for timedelta. */ 82 #define GET_TD_DAYS(o) (((PyDateTime_Delta *)(o))->days) 83 #define GET_TD_SECONDS(o) (((PyDateTime_Delta *)(o))->seconds) 84 #define GET_TD_MICROSECONDS(o) (((PyDateTime_Delta *)(o))->microseconds) 85 86 #define SET_TD_DAYS(o, v) ((o)->days = (v)) 87 #define SET_TD_SECONDS(o, v) ((o)->seconds = (v)) 88 #define SET_TD_MICROSECONDS(o, v) ((o)->microseconds = (v)) 89 90 /* p is a pointer to a time or a datetime object; HASTZINFO(p) returns 91 * p->hastzinfo. 92 */ 93 #define HASTZINFO(p) (((_PyDateTime_BaseTZInfo *)(p))->hastzinfo) 94 95 /* M is a char or int claiming to be a valid month. The macro is equivalent 96 * to the two-sided Python test 97 * 1 <= M <= 12 98 */ 99 #define MONTH_IS_SANE(M) ((unsigned int)(M) - 1 < 12) 100 101 /* Forward declarations. */ 102 static PyTypeObject PyDateTime_DateType; 103 static PyTypeObject PyDateTime_DateTimeType; 104 static PyTypeObject PyDateTime_DeltaType; 105 static PyTypeObject PyDateTime_TimeType; 106 static PyTypeObject PyDateTime_TZInfoType; 107 108 /* --------------------------------------------------------------------------- 109 * Math utilities. 110 */ 111 112 /* k = i+j overflows iff k differs in sign from both inputs, 113 * iff k^i has sign bit set and k^j has sign bit set, 114 * iff (k^i)&(k^j) has sign bit set. 115 */ 116 #define SIGNED_ADD_OVERFLOWED(RESULT, I, J) \ 117 ((((RESULT) ^ (I)) & ((RESULT) ^ (J))) < 0) 118 119 /* Compute Python divmod(x, y), returning the quotient and storing the 120 * remainder into *r. The quotient is the floor of x/y, and that's 121 * the real point of this. C will probably truncate instead (C99 122 * requires truncation; C89 left it implementation-defined). 123 * Simplification: we *require* that y > 0 here. That's appropriate 124 * for all the uses made of it. This simplifies the code and makes 125 * the overflow case impossible (divmod(LONG_MIN, -1) is the only 126 * overflow case). 127 */ 128 static int 129 divmod(int x, int y, int *r) 130 { 131 int quo; 132 133 assert(y > 0); 134 quo = x / y; 135 *r = x - quo * y; 136 if (*r < 0) { 137 --quo; 138 *r += y; 139 } 140 assert(0 <= *r && *r < y); 141 return quo; 142 } 143 144 /* Round a double to the nearest long. |x| must be small enough to fit 145 * in a C long; this is not checked. 146 */ 147 static long 148 round_to_long(double x) 149 { 150 if (x >= 0.0) 151 x = floor(x + 0.5); 152 else 153 x = ceil(x - 0.5); 154 return (long)x; 155 } 156 157 /* --------------------------------------------------------------------------- 158 * General calendrical helper functions 159 */ 160 161 /* For each month ordinal in 1..12, the number of days in that month, 162 * and the number of days before that month in the same year. These 163 * are correct for non-leap years only. 164 */ 165 static int _days_in_month[] = { 166 0, /* unused; this vector uses 1-based indexing */ 167 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 168 }; 169 170 static int _days_before_month[] = { 171 0, /* unused; this vector uses 1-based indexing */ 172 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 173 }; 174 175 /* year -> 1 if leap year, else 0. */ 176 static int 177 is_leap(int year) 178 { 179 /* Cast year to unsigned. The result is the same either way, but 180 * C can generate faster code for unsigned mod than for signed 181 * mod (especially for % 4 -- a good compiler should just grab 182 * the last 2 bits when the LHS is unsigned). 183 */ 184 const unsigned int ayear = (unsigned int)year; 185 return ayear % 4 == 0 && (ayear % 100 != 0 || ayear % 400 == 0); 186 } 187 188 /* year, month -> number of days in that month in that year */ 189 static int 190 days_in_month(int year, int month) 191 { 192 assert(month >= 1); 193 assert(month <= 12); 194 if (month == 2 && is_leap(year)) 195 return 29; 196 else 197 return _days_in_month[month]; 198 } 199 200 /* year, month -> number of days in year preceding first day of month */ 201 static int 202 days_before_month(int year, int month) 203 { 204 int days; 205 206 assert(month >= 1); 207 assert(month <= 12); 208 days = _days_before_month[month]; 209 if (month > 2 && is_leap(year)) 210 ++days; 211 return days; 212 } 213 214 /* year -> number of days before January 1st of year. Remember that we 215 * start with year 1, so days_before_year(1) == 0. 216 */ 217 static int 218 days_before_year(int year) 219 { 220 int y = year - 1; 221 /* This is incorrect if year <= 0; we really want the floor 222 * here. But so long as MINYEAR is 1, the smallest year this 223 * can see is 0 (this can happen in some normalization endcases), 224 * so we'll just special-case that. 225 */ 226 assert (year >= 0); 227 if (y >= 0) 228 return y*365 + y/4 - y/100 + y/400; 229 else { 230 assert(y == -1); 231 return -366; 232 } 233 } 234 235 /* Number of days in 4, 100, and 400 year cycles. That these have 236 * the correct values is asserted in the module init function. 237 */ 238 #define DI4Y 1461 /* days_before_year(5); days in 4 years */ 239 #define DI100Y 36524 /* days_before_year(101); days in 100 years */ 240 #define DI400Y 146097 /* days_before_year(401); days in 400 years */ 241 242 /* ordinal -> year, month, day, considering 01-Jan-0001 as day 1. */ 243 static void 244 ord_to_ymd(int ordinal, int *year, int *month, int *day) 245 { 246 int n, n1, n4, n100, n400, leapyear, preceding; 247 248 /* ordinal is a 1-based index, starting at 1-Jan-1. The pattern of 249 * leap years repeats exactly every 400 years. The basic strategy is 250 * to find the closest 400-year boundary at or before ordinal, then 251 * work with the offset from that boundary to ordinal. Life is much 252 * clearer if we subtract 1 from ordinal first -- then the values 253 * of ordinal at 400-year boundaries are exactly those divisible 254 * by DI400Y: 255 * 256 * D M Y n n-1 257 * -- --- ---- ---------- ---------------- 258 * 31 Dec -400 -DI400Y -DI400Y -1 259 * 1 Jan -399 -DI400Y +1 -DI400Y 400-year boundary 260 * ... 261 * 30 Dec 000 -1 -2 262 * 31 Dec 000 0 -1 263 * 1 Jan 001 1 0 400-year boundary 264 * 2 Jan 001 2 1 265 * 3 Jan 001 3 2 266 * ... 267 * 31 Dec 400 DI400Y DI400Y -1 268 * 1 Jan 401 DI400Y +1 DI400Y 400-year boundary 269 */ 270 assert(ordinal >= 1); 271 --ordinal; 272 n400 = ordinal / DI400Y; 273 n = ordinal % DI400Y; 274 *year = n400 * 400 + 1; 275 276 /* Now n is the (non-negative) offset, in days, from January 1 of 277 * year, to the desired date. Now compute how many 100-year cycles 278 * precede n. 279 * Note that it's possible for n100 to equal 4! In that case 4 full 280 * 100-year cycles precede the desired day, which implies the 281 * desired day is December 31 at the end of a 400-year cycle. 282 */ 283 n100 = n / DI100Y; 284 n = n % DI100Y; 285 286 /* Now compute how many 4-year cycles precede it. */ 287 n4 = n / DI4Y; 288 n = n % DI4Y; 289 290 /* And now how many single years. Again n1 can be 4, and again 291 * meaning that the desired day is December 31 at the end of the 292 * 4-year cycle. 293 */ 294 n1 = n / 365; 295 n = n % 365; 296 297 *year += n100 * 100 + n4 * 4 + n1; 298 if (n1 == 4 || n100 == 4) { 299 assert(n == 0); 300 *year -= 1; 301 *month = 12; 302 *day = 31; 303 return; 304 } 305 306 /* Now the year is correct, and n is the offset from January 1. We 307 * find the month via an estimate that's either exact or one too 308 * large. 309 */ 310 leapyear = n1 == 3 && (n4 != 24 || n100 == 3); 311 assert(leapyear == is_leap(*year)); 312 *month = (n + 50) >> 5; 313 preceding = (_days_before_month[*month] + (*month > 2 && leapyear)); 314 if (preceding > n) { 315 /* estimate is too large */ 316 *month -= 1; 317 preceding -= days_in_month(*year, *month); 318 } 319 n -= preceding; 320 assert(0 <= n); 321 assert(n < days_in_month(*year, *month)); 322 323 *day = n + 1; 324 } 325 326 /* year, month, day -> ordinal, considering 01-Jan-0001 as day 1. */ 327 static int 328 ymd_to_ord(int year, int month, int day) 329 { 330 return days_before_year(year) + days_before_month(year, month) + day; 331 } 332 333 /* Day of week, where Monday==0, ..., Sunday==6. 1/1/1 was a Monday. */ 334 static int 335 weekday(int year, int month, int day) 336 { 337 return (ymd_to_ord(year, month, day) + 6) % 7; 338 } 339 340 /* Ordinal of the Monday starting week 1 of the ISO year. Week 1 is the 341 * first calendar week containing a Thursday. 342 */ 343 static int 344 iso_week1_monday(int year) 345 { 346 int first_day = ymd_to_ord(year, 1, 1); /* ord of 1/1 */ 347 /* 0 if 1/1 is a Monday, 1 if a Tue, etc. */ 348 int first_weekday = (first_day + 6) % 7; 349 /* ordinal of closest Monday at or before 1/1 */ 350 int week1_monday = first_day - first_weekday; 351 352 if (first_weekday > 3) /* if 1/1 was Fri, Sat, Sun */ 353 week1_monday += 7; 354 return week1_monday; 355 } 356 357 /* --------------------------------------------------------------------------- 358 * Range checkers. 359 */ 360 361 /* Check that -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS. If so, return 0. 362 * If not, raise OverflowError and return -1. 363 */ 364 static int 365 check_delta_day_range(int days) 366 { 367 if (-MAX_DELTA_DAYS <= days && days <= MAX_DELTA_DAYS) 368 return 0; 369 PyErr_Format(PyExc_OverflowError, 370 "days=%d; must have magnitude <= %d", 371 days, MAX_DELTA_DAYS); 372 return -1; 373 } 374 375 /* Check that date arguments are in range. Return 0 if they are. If they 376 * aren't, raise ValueError and return -1. 377 */ 378 static int 379 check_date_args(int year, int month, int day) 380 { 381 382 if (year < MINYEAR || year > MAXYEAR) { 383 PyErr_SetString(PyExc_ValueError, 384 "year is out of range"); 385 return -1; 386 } 387 if (month < 1 || month > 12) { 388 PyErr_SetString(PyExc_ValueError, 389 "month must be in 1..12"); 390 return -1; 391 } 392 if (day < 1 || day > days_in_month(year, month)) { 393 PyErr_SetString(PyExc_ValueError, 394 "day is out of range for month"); 395 return -1; 396 } 397 return 0; 398 } 399 400 /* Check that time arguments are in range. Return 0 if they are. If they 401 * aren't, raise ValueError and return -1. 402 */ 403 static int 404 check_time_args(int h, int m, int s, int us) 405 { 406 if (h < 0 || h > 23) { 407 PyErr_SetString(PyExc_ValueError, 408 "hour must be in 0..23"); 409 return -1; 410 } 411 if (m < 0 || m > 59) { 412 PyErr_SetString(PyExc_ValueError, 413 "minute must be in 0..59"); 414 return -1; 415 } 416 if (s < 0 || s > 59) { 417 PyErr_SetString(PyExc_ValueError, 418 "second must be in 0..59"); 419 return -1; 420 } 421 if (us < 0 || us > 999999) { 422 PyErr_SetString(PyExc_ValueError, 423 "microsecond must be in 0..999999"); 424 return -1; 425 } 426 return 0; 427 } 428 429 /* --------------------------------------------------------------------------- 430 * Normalization utilities. 431 */ 432 433 /* One step of a mixed-radix conversion. A "hi" unit is equivalent to 434 * factor "lo" units. factor must be > 0. If *lo is less than 0, or 435 * at least factor, enough of *lo is converted into "hi" units so that 436 * 0 <= *lo < factor. The input values must be such that int overflow 437 * is impossible. 438 */ 439 static void 440 normalize_pair(int *hi, int *lo, int factor) 441 { 442 assert(factor > 0); 443 assert(lo != hi); 444 if (*lo < 0 || *lo >= factor) { 445 const int num_hi = divmod(*lo, factor, lo); 446 const int new_hi = *hi + num_hi; 447 assert(! SIGNED_ADD_OVERFLOWED(new_hi, *hi, num_hi)); 448 *hi = new_hi; 449 } 450 assert(0 <= *lo && *lo < factor); 451 } 452 453 /* Fiddle days (d), seconds (s), and microseconds (us) so that 454 * 0 <= *s < 24*3600 455 * 0 <= *us < 1000000 456 * The input values must be such that the internals don't overflow. 457 * The way this routine is used, we don't get close. 458 */ 459 static void 460 normalize_d_s_us(int *d, int *s, int *us) 461 { 462 if (*us < 0 || *us >= 1000000) { 463 normalize_pair(s, us, 1000000); 464 /* |s| can't be bigger than about 465 * |original s| + |original us|/1000000 now. 466 */ 467 468 } 469 if (*s < 0 || *s >= 24*3600) { 470 normalize_pair(d, s, 24*3600); 471 /* |d| can't be bigger than about 472 * |original d| + 473 * (|original s| + |original us|/1000000) / (24*3600) now. 474 */ 475 } 476 assert(0 <= *s && *s < 24*3600); 477 assert(0 <= *us && *us < 1000000); 478 } 479 480 /* Fiddle years (y), months (m), and days (d) so that 481 * 1 <= *m <= 12 482 * 1 <= *d <= days_in_month(*y, *m) 483 * The input values must be such that the internals don't overflow. 484 * The way this routine is used, we don't get close. 485 */ 486 static int 487 normalize_y_m_d(int *y, int *m, int *d) 488 { 489 int dim; /* # of days in month */ 490 491 /* This gets muddy: the proper range for day can't be determined 492 * without knowing the correct month and year, but if day is, e.g., 493 * plus or minus a million, the current month and year values make 494 * no sense (and may also be out of bounds themselves). 495 * Saying 12 months == 1 year should be non-controversial. 496 */ 497 if (*m < 1 || *m > 12) { 498 --*m; 499 normalize_pair(y, m, 12); 500 ++*m; 501 /* |y| can't be bigger than about 502 * |original y| + |original m|/12 now. 503 */ 504 } 505 assert(1 <= *m && *m <= 12); 506 507 /* Now only day can be out of bounds (year may also be out of bounds 508 * for a datetime object, but we don't care about that here). 509 * If day is out of bounds, what to do is arguable, but at least the 510 * method here is principled and explainable. 511 */ 512 dim = days_in_month(*y, *m); 513 if (*d < 1 || *d > dim) { 514 /* Move day-1 days from the first of the month. First try to 515 * get off cheap if we're only one day out of range 516 * (adjustments for timezone alone can't be worse than that). 517 */ 518 if (*d == 0) { 519 --*m; 520 if (*m > 0) 521 *d = days_in_month(*y, *m); 522 else { 523 --*y; 524 *m = 12; 525 *d = 31; 526 } 527 } 528 else if (*d == dim + 1) { 529 /* move forward a day */ 530 ++*m; 531 *d = 1; 532 if (*m > 12) { 533 *m = 1; 534 ++*y; 535 } 536 } 537 else { 538 int ordinal = ymd_to_ord(*y, *m, 1) + 539 *d - 1; 540 if (ordinal < 1 || ordinal > MAXORDINAL) { 541 goto error; 542 } else { 543 ord_to_ymd(ordinal, y, m, d); 544 return 0; 545 } 546 } 547 } 548 assert(*m > 0); 549 assert(*d > 0); 550 if (MINYEAR <= *y && *y <= MAXYEAR) 551 return 0; 552 error: 553 PyErr_SetString(PyExc_OverflowError, 554 "date value out of range"); 555 return -1; 556 557 } 558 559 /* Fiddle out-of-bounds months and days so that the result makes some kind 560 * of sense. The parameters are both inputs and outputs. Returns < 0 on 561 * failure, where failure means the adjusted year is out of bounds. 562 */ 563 static int 564 normalize_date(int *year, int *month, int *day) 565 { 566 return normalize_y_m_d(year, month, day); 567 } 568 569 /* Force all the datetime fields into range. The parameters are both 570 * inputs and outputs. Returns < 0 on error. 571 */ 572 static int 573 normalize_datetime(int *year, int *month, int *day, 574 int *hour, int *minute, int *second, 575 int *microsecond) 576 { 577 normalize_pair(second, microsecond, 1000000); 578 normalize_pair(minute, second, 60); 579 normalize_pair(hour, minute, 60); 580 normalize_pair(day, hour, 24); 581 return normalize_date(year, month, day); 582 } 583 584 /* --------------------------------------------------------------------------- 585 * Basic object allocation: tp_alloc implementations. These allocate 586 * Python objects of the right size and type, and do the Python object- 587 * initialization bit. If there's not enough memory, they return NULL after 588 * setting MemoryError. All data members remain uninitialized trash. 589 * 590 * We abuse the tp_alloc "nitems" argument to communicate whether a tzinfo 591 * member is needed. This is ugly, imprecise, and possibly insecure. 592 * tp_basicsize for the time and datetime types is set to the size of the 593 * struct that has room for the tzinfo member, so subclasses in Python will 594 * allocate enough space for a tzinfo member whether or not one is actually 595 * needed. That's the "ugly and imprecise" parts. The "possibly insecure" 596 * part is that PyType_GenericAlloc() (which subclasses in Python end up 597 * using) just happens today to effectively ignore the nitems argument 598 * when tp_itemsize is 0, which it is for these type objects. If that 599 * changes, perhaps the callers of tp_alloc slots in this file should 600 * be changed to force a 0 nitems argument unless the type being allocated 601 * is a base type implemented in this file (so that tp_alloc is time_alloc 602 * or datetime_alloc below, which know about the nitems abuse). 603 */ 604 605 static PyObject * 606 time_alloc(PyTypeObject *type, Py_ssize_t aware) 607 { 608 PyObject *self; 609 610 self = (PyObject *) 611 PyObject_MALLOC(aware ? 612 sizeof(PyDateTime_Time) : 613 sizeof(_PyDateTime_BaseTime)); 614 if (self == NULL) 615 return (PyObject *)PyErr_NoMemory(); 616 (void)PyObject_INIT(self, type); 617 return self; 618 } 619 620 static PyObject * 621 datetime_alloc(PyTypeObject *type, Py_ssize_t aware) 622 { 623 PyObject *self; 624 625 self = (PyObject *) 626 PyObject_MALLOC(aware ? 627 sizeof(PyDateTime_DateTime) : 628 sizeof(_PyDateTime_BaseDateTime)); 629 if (self == NULL) 630 return (PyObject *)PyErr_NoMemory(); 631 (void)PyObject_INIT(self, type); 632 return self; 633 } 634 635 /* --------------------------------------------------------------------------- 636 * Helpers for setting object fields. These work on pointers to the 637 * appropriate base class. 638 */ 639 640 /* For date and datetime. */ 641 static void 642 set_date_fields(PyDateTime_Date *self, int y, int m, int d) 643 { 644 self->hashcode = -1; 645 SET_YEAR(self, y); 646 SET_MONTH(self, m); 647 SET_DAY(self, d); 648 } 649 650 /* --------------------------------------------------------------------------- 651 * Create various objects, mostly without range checking. 652 */ 653 654 /* Create a date instance with no range checking. */ 655 static PyObject * 656 new_date_ex(int year, int month, int day, PyTypeObject *type) 657 { 658 PyDateTime_Date *self; 659 660 self = (PyDateTime_Date *) (type->tp_alloc(type, 0)); 661 if (self != NULL) 662 set_date_fields(self, year, month, day); 663 return (PyObject *) self; 664 } 665 666 #define new_date(year, month, day) \ 667 new_date_ex(year, month, day, &PyDateTime_DateType) 668 669 /* Create a datetime instance with no range checking. */ 670 static PyObject * 671 new_datetime_ex(int year, int month, int day, int hour, int minute, 672 int second, int usecond, PyObject *tzinfo, PyTypeObject *type) 673 { 674 PyDateTime_DateTime *self; 675 char aware = tzinfo != Py_None; 676 677 self = (PyDateTime_DateTime *) (type->tp_alloc(type, aware)); 678 if (self != NULL) { 679 self->hastzinfo = aware; 680 set_date_fields((PyDateTime_Date *)self, year, month, day); 681 DATE_SET_HOUR(self, hour); 682 DATE_SET_MINUTE(self, minute); 683 DATE_SET_SECOND(self, second); 684 DATE_SET_MICROSECOND(self, usecond); 685 if (aware) { 686 Py_INCREF(tzinfo); 687 self->tzinfo = tzinfo; 688 } 689 } 690 return (PyObject *)self; 691 } 692 693 #define new_datetime(y, m, d, hh, mm, ss, us, tzinfo) \ 694 new_datetime_ex(y, m, d, hh, mm, ss, us, tzinfo, \ 695 &PyDateTime_DateTimeType) 696 697 /* Create a time instance with no range checking. */ 698 static PyObject * 699 new_time_ex(int hour, int minute, int second, int usecond, 700 PyObject *tzinfo, PyTypeObject *type) 701 { 702 PyDateTime_Time *self; 703 char aware = tzinfo != Py_None; 704 705 self = (PyDateTime_Time *) (type->tp_alloc(type, aware)); 706 if (self != NULL) { 707 self->hastzinfo = aware; 708 self->hashcode = -1; 709 TIME_SET_HOUR(self, hour); 710 TIME_SET_MINUTE(self, minute); 711 TIME_SET_SECOND(self, second); 712 TIME_SET_MICROSECOND(self, usecond); 713 if (aware) { 714 Py_INCREF(tzinfo); 715 self->tzinfo = tzinfo; 716 } 717 } 718 return (PyObject *)self; 719 } 720 721 #define new_time(hh, mm, ss, us, tzinfo) \ 722 new_time_ex(hh, mm, ss, us, tzinfo, &PyDateTime_TimeType) 723 724 /* Create a timedelta instance. Normalize the members iff normalize is 725 * true. Passing false is a speed optimization, if you know for sure 726 * that seconds and microseconds are already in their proper ranges. In any 727 * case, raises OverflowError and returns NULL if the normalized days is out 728 * of range). 729 */ 730 static PyObject * 731 new_delta_ex(int days, int seconds, int microseconds, int normalize, 732 PyTypeObject *type) 733 { 734 PyDateTime_Delta *self; 735 736 if (normalize) 737 normalize_d_s_us(&days, &seconds, µseconds); 738 assert(0 <= seconds && seconds < 24*3600); 739 assert(0 <= microseconds && microseconds < 1000000); 740 741 if (check_delta_day_range(days) < 0) 742 return NULL; 743 744 self = (PyDateTime_Delta *) (type->tp_alloc(type, 0)); 745 if (self != NULL) { 746 self->hashcode = -1; 747 SET_TD_DAYS(self, days); 748 SET_TD_SECONDS(self, seconds); 749 SET_TD_MICROSECONDS(self, microseconds); 750 } 751 return (PyObject *) self; 752 } 753 754 #define new_delta(d, s, us, normalize) \ 755 new_delta_ex(d, s, us, normalize, &PyDateTime_DeltaType) 756 757 /* --------------------------------------------------------------------------- 758 * tzinfo helpers. 759 */ 760 761 /* Ensure that p is None or of a tzinfo subclass. Return 0 if OK; if not 762 * raise TypeError and return -1. 763 */ 764 static int 765 check_tzinfo_subclass(PyObject *p) 766 { 767 if (p == Py_None || PyTZInfo_Check(p)) 768 return 0; 769 PyErr_Format(PyExc_TypeError, 770 "tzinfo argument must be None or of a tzinfo subclass, " 771 "not type '%s'", 772 Py_TYPE(p)->tp_name); 773 return -1; 774 } 775 776 /* Return tzinfo.methname(tzinfoarg), without any checking of results. 777 * If tzinfo is None, returns None. 778 */ 779 static PyObject * 780 call_tzinfo_method(PyObject *tzinfo, char *methname, PyObject *tzinfoarg) 781 { 782 PyObject *result; 783 784 assert(tzinfo && methname && tzinfoarg); 785 assert(check_tzinfo_subclass(tzinfo) >= 0); 786 if (tzinfo == Py_None) { 787 result = Py_None; 788 Py_INCREF(result); 789 } 790 else 791 result = PyObject_CallMethod(tzinfo, methname, "O", tzinfoarg); 792 return result; 793 } 794 795 /* If self has a tzinfo member, return a BORROWED reference to it. Else 796 * return NULL, which is NOT AN ERROR. There are no error returns here, 797 * and the caller must not decref the result. 798 */ 799 static PyObject * 800 get_tzinfo_member(PyObject *self) 801 { 802 PyObject *tzinfo = NULL; 803 804 if (PyDateTime_Check(self) && HASTZINFO(self)) 805 tzinfo = ((PyDateTime_DateTime *)self)->tzinfo; 806 else if (PyTime_Check(self) && HASTZINFO(self)) 807 tzinfo = ((PyDateTime_Time *)self)->tzinfo; 808 809 return tzinfo; 810 } 811 812 /* Call getattr(tzinfo, name)(tzinfoarg), and extract an int from the 813 * result. tzinfo must be an instance of the tzinfo class. If the method 814 * returns None, this returns 0 and sets *none to 1. If the method doesn't 815 * return None or timedelta, TypeError is raised and this returns -1. If it 816 * returnsa timedelta and the value is out of range or isn't a whole number 817 * of minutes, ValueError is raised and this returns -1. 818 * Else *none is set to 0 and the integer method result is returned. 819 */ 820 static int 821 call_utc_tzinfo_method(PyObject *tzinfo, char *name, PyObject *tzinfoarg, 822 int *none) 823 { 824 PyObject *u; 825 int result = -1; 826 827 assert(tzinfo != NULL); 828 assert(PyTZInfo_Check(tzinfo)); 829 assert(tzinfoarg != NULL); 830 831 *none = 0; 832 u = call_tzinfo_method(tzinfo, name, tzinfoarg); 833 if (u == NULL) 834 return -1; 835 836 else if (u == Py_None) { 837 result = 0; 838 *none = 1; 839 } 840 else if (PyDelta_Check(u)) { 841 const int days = GET_TD_DAYS(u); 842 if (days < -1 || days > 0) 843 result = 24*60; /* trigger ValueError below */ 844 else { 845 /* next line can't overflow because we know days 846 * is -1 or 0 now 847 */ 848 int ss = days * 24 * 3600 + GET_TD_SECONDS(u); 849 result = divmod(ss, 60, &ss); 850 if (ss || GET_TD_MICROSECONDS(u)) { 851 PyErr_Format(PyExc_ValueError, 852 "tzinfo.%s() must return a " 853 "whole number of minutes", 854 name); 855 result = -1; 856 } 857 } 858 } 859 else { 860 PyErr_Format(PyExc_TypeError, 861 "tzinfo.%s() must return None or " 862 "timedelta, not '%s'", 863 name, Py_TYPE(u)->tp_name); 864 } 865 866 Py_DECREF(u); 867 if (result < -1439 || result > 1439) { 868 PyErr_Format(PyExc_ValueError, 869 "tzinfo.%s() returned %d; must be in " 870 "-1439 .. 1439", 871 name, result); 872 result = -1; 873 } 874 return result; 875 } 876 877 /* Call tzinfo.utcoffset(tzinfoarg), and extract an integer from the 878 * result. tzinfo must be an instance of the tzinfo class. If utcoffset() 879 * returns None, call_utcoffset returns 0 and sets *none to 1. If uctoffset() 880 * doesn't return None or timedelta, TypeError is raised and this returns -1. 881 * If utcoffset() returns an invalid timedelta (out of range, or not a whole 882 * # of minutes), ValueError is raised and this returns -1. Else *none is 883 * set to 0 and the offset is returned (as int # of minutes east of UTC). 884 */ 885 static int 886 call_utcoffset(PyObject *tzinfo, PyObject *tzinfoarg, int *none) 887 { 888 return call_utc_tzinfo_method(tzinfo, "utcoffset", tzinfoarg, none); 889 } 890 891 /* Call tzinfo.name(tzinfoarg), and return the offset as a timedelta or None. 892 */ 893 static PyObject * 894 offset_as_timedelta(PyObject *tzinfo, char *name, PyObject *tzinfoarg) { 895 PyObject *result; 896 897 assert(tzinfo && name && tzinfoarg); 898 if (tzinfo == Py_None) { 899 result = Py_None; 900 Py_INCREF(result); 901 } 902 else { 903 int none; 904 int offset = call_utc_tzinfo_method(tzinfo, name, tzinfoarg, 905 &none); 906 if (offset < 0 && PyErr_Occurred()) 907 return NULL; 908 if (none) { 909 result = Py_None; 910 Py_INCREF(result); 911 } 912 else 913 result = new_delta(0, offset * 60, 0, 1); 914 } 915 return result; 916 } 917 918 /* Call tzinfo.dst(tzinfoarg), and extract an integer from the 919 * result. tzinfo must be an instance of the tzinfo class. If dst() 920 * returns None, call_dst returns 0 and sets *none to 1. If dst() 921 & doesn't return None or timedelta, TypeError is raised and this 922 * returns -1. If dst() returns an invalid timedelta for a UTC offset, 923 * ValueError is raised and this returns -1. Else *none is set to 0 and 924 * the offset is returned (as an int # of minutes east of UTC). 925 */ 926 static int 927 call_dst(PyObject *tzinfo, PyObject *tzinfoarg, int *none) 928 { 929 return call_utc_tzinfo_method(tzinfo, "dst", tzinfoarg, none); 930 } 931 932 /* Call tzinfo.tzname(tzinfoarg), and return the result. tzinfo must be 933 * an instance of the tzinfo class or None. If tzinfo isn't None, and 934 * tzname() doesn't return None or a string, TypeError is raised and this 935 * returns NULL. 936 */ 937 static PyObject * 938 call_tzname(PyObject *tzinfo, PyObject *tzinfoarg) 939 { 940 PyObject *result; 941 942 assert(tzinfo != NULL); 943 assert(check_tzinfo_subclass(tzinfo) >= 0); 944 assert(tzinfoarg != NULL); 945 946 if (tzinfo == Py_None) { 947 result = Py_None; 948 Py_INCREF(result); 949 } 950 else 951 result = PyObject_CallMethod(tzinfo, "tzname", "O", tzinfoarg); 952 953 if (result != NULL && result != Py_None && ! PyString_Check(result)) { 954 PyErr_Format(PyExc_TypeError, "tzinfo.tzname() must " 955 "return None or a string, not '%s'", 956 Py_TYPE(result)->tp_name); 957 Py_DECREF(result); 958 result = NULL; 959 } 960 return result; 961 } 962 963 typedef enum { 964 /* an exception has been set; the caller should pass it on */ 965 OFFSET_ERROR, 966 967 /* type isn't date, datetime, or time subclass */ 968 OFFSET_UNKNOWN, 969 970 /* date, 971 * datetime with !hastzinfo 972 * datetime with None tzinfo, 973 * datetime where utcoffset() returns None 974 * time with !hastzinfo 975 * time with None tzinfo, 976 * time where utcoffset() returns None 977 */ 978 OFFSET_NAIVE, 979 980 /* time or datetime where utcoffset() doesn't return None */ 981 OFFSET_AWARE 982 } naivety; 983 984 /* Classify an object as to whether it's naive or offset-aware. See 985 * the "naivety" typedef for details. If the type is aware, *offset is set 986 * to minutes east of UTC (as returned by the tzinfo.utcoffset() method). 987 * If the type is offset-naive (or unknown, or error), *offset is set to 0. 988 * tzinfoarg is the argument to pass to the tzinfo.utcoffset() method. 989 */ 990 static naivety 991 classify_utcoffset(PyObject *op, PyObject *tzinfoarg, int *offset) 992 { 993 int none; 994 PyObject *tzinfo; 995 996 assert(tzinfoarg != NULL); 997 *offset = 0; 998 tzinfo = get_tzinfo_member(op); /* NULL means no tzinfo, not error */ 999 if (tzinfo == Py_None) 1000 return OFFSET_NAIVE; 1001 if (tzinfo == NULL) { 1002 /* note that a datetime passes the PyDate_Check test */ 1003 return (PyTime_Check(op) || PyDate_Check(op)) ? 1004 OFFSET_NAIVE : OFFSET_UNKNOWN; 1005 } 1006 *offset = call_utcoffset(tzinfo, tzinfoarg, &none); 1007 if (*offset == -1 && PyErr_Occurred()) 1008 return OFFSET_ERROR; 1009 return none ? OFFSET_NAIVE : OFFSET_AWARE; 1010 } 1011 1012 /* Classify two objects as to whether they're naive or offset-aware. 1013 * This isn't quite the same as calling classify_utcoffset() twice: for 1014 * binary operations (comparison and subtraction), we generally want to 1015 * ignore the tzinfo members if they're identical. This is by design, 1016 * so that results match "naive" expectations when mixing objects from a 1017 * single timezone. So in that case, this sets both offsets to 0 and 1018 * both naiveties to OFFSET_NAIVE. 1019 * The function returns 0 if everything's OK, and -1 on error. 1020 */ 1021 static int 1022 classify_two_utcoffsets(PyObject *o1, int *offset1, naivety *n1, 1023 PyObject *tzinfoarg1, 1024 PyObject *o2, int *offset2, naivety *n2, 1025 PyObject *tzinfoarg2) 1026 { 1027 if (get_tzinfo_member(o1) == get_tzinfo_member(o2)) { 1028 *offset1 = *offset2 = 0; 1029 *n1 = *n2 = OFFSET_NAIVE; 1030 } 1031 else { 1032 *n1 = classify_utcoffset(o1, tzinfoarg1, offset1); 1033 if (*n1 == OFFSET_ERROR) 1034 return -1; 1035 *n2 = classify_utcoffset(o2, tzinfoarg2, offset2); 1036 if (*n2 == OFFSET_ERROR) 1037 return -1; 1038 } 1039 return 0; 1040 } 1041 1042 /* repr is like "someclass(arg1, arg2)". If tzinfo isn't None, 1043 * stuff 1044 * ", tzinfo=" + repr(tzinfo) 1045 * before the closing ")". 1046 */ 1047 static PyObject * 1048 append_keyword_tzinfo(PyObject *repr, PyObject *tzinfo) 1049 { 1050 PyObject *temp; 1051 1052 assert(PyString_Check(repr)); 1053 assert(tzinfo); 1054 if (tzinfo == Py_None) 1055 return repr; 1056 /* Get rid of the trailing ')'. */ 1057 assert(PyString_AsString(repr)[PyString_Size(repr)-1] == ')'); 1058 temp = PyString_FromStringAndSize(PyString_AsString(repr), 1059 PyString_Size(repr) - 1); 1060 Py_DECREF(repr); 1061 if (temp == NULL) 1062 return NULL; 1063 repr = temp; 1064 1065 /* Append ", tzinfo=". */ 1066 PyString_ConcatAndDel(&repr, PyString_FromString(", tzinfo=")); 1067 1068 /* Append repr(tzinfo). */ 1069 PyString_ConcatAndDel(&repr, PyObject_Repr(tzinfo)); 1070 1071 /* Add a closing paren. */ 1072 PyString_ConcatAndDel(&repr, PyString_FromString(")")); 1073 return repr; 1074 } 1075 1076 /* --------------------------------------------------------------------------- 1077 * String format helpers. 1078 */ 1079 1080 static PyObject * 1081 format_ctime(PyDateTime_Date *date, int hours, int minutes, int seconds) 1082 { 1083 static const char *DayNames[] = { 1084 "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" 1085 }; 1086 static const char *MonthNames[] = { 1087 "Jan", "Feb", "Mar", "Apr", "May", "Jun", 1088 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 1089 }; 1090 1091 char buffer[128]; 1092 int wday = weekday(GET_YEAR(date), GET_MONTH(date), GET_DAY(date)); 1093 1094 PyOS_snprintf(buffer, sizeof(buffer), "%s %s %2d %02d:%02d:%02d %04d", 1095 DayNames[wday], MonthNames[GET_MONTH(date) - 1], 1096 GET_DAY(date), hours, minutes, seconds, 1097 GET_YEAR(date)); 1098 return PyString_FromString(buffer); 1099 } 1100 1101 /* Add an hours & minutes UTC offset string to buf. buf has no more than 1102 * buflen bytes remaining. The UTC offset is gotten by calling 1103 * tzinfo.uctoffset(tzinfoarg). If that returns None, \0 is stored into 1104 * *buf, and that's all. Else the returned value is checked for sanity (an 1105 * integer in range), and if that's OK it's converted to an hours & minutes 1106 * string of the form 1107 * sign HH sep MM 1108 * Returns 0 if everything is OK. If the return value from utcoffset() is 1109 * bogus, an appropriate exception is set and -1 is returned. 1110 */ 1111 static int 1112 format_utcoffset(char *buf, size_t buflen, const char *sep, 1113 PyObject *tzinfo, PyObject *tzinfoarg) 1114 { 1115 int offset; 1116 int hours; 1117 int minutes; 1118 char sign; 1119 int none; 1120 1121 assert(buflen >= 1); 1122 1123 offset = call_utcoffset(tzinfo, tzinfoarg, &none); 1124 if (offset == -1 && PyErr_Occurred()) 1125 return -1; 1126 if (none) { 1127 *buf = '\0'; 1128 return 0; 1129 } 1130 sign = '+'; 1131 if (offset < 0) { 1132 sign = '-'; 1133 offset = - offset; 1134 } 1135 hours = divmod(offset, 60, &minutes); 1136 PyOS_snprintf(buf, buflen, "%c%02d%s%02d", sign, hours, sep, minutes); 1137 return 0; 1138 } 1139 1140 static PyObject * 1141 make_freplacement(PyObject *object) 1142 { 1143 char freplacement[64]; 1144 if (PyTime_Check(object)) 1145 sprintf(freplacement, "%06d", TIME_GET_MICROSECOND(object)); 1146 else if (PyDateTime_Check(object)) 1147 sprintf(freplacement, "%06d", DATE_GET_MICROSECOND(object)); 1148 else 1149 sprintf(freplacement, "%06d", 0); 1150 1151 return PyString_FromStringAndSize(freplacement, strlen(freplacement)); 1152 } 1153 1154 /* I sure don't want to reproduce the strftime code from the time module, 1155 * so this imports the module and calls it. All the hair is due to 1156 * giving special meanings to the %z, %Z and %f format codes via a 1157 * preprocessing step on the format string. 1158 * tzinfoarg is the argument to pass to the object's tzinfo method, if 1159 * needed. 1160 */ 1161 static PyObject * 1162 wrap_strftime(PyObject *object, const char *format, size_t format_len, 1163 PyObject *timetuple, PyObject *tzinfoarg) 1164 { 1165 PyObject *result = NULL; /* guilty until proved innocent */ 1166 1167 PyObject *zreplacement = NULL; /* py string, replacement for %z */ 1168 PyObject *Zreplacement = NULL; /* py string, replacement for %Z */ 1169 PyObject *freplacement = NULL; /* py string, replacement for %f */ 1170 1171 const char *pin; /* pointer to next char in input format */ 1172 char ch; /* next char in input format */ 1173 1174 PyObject *newfmt = NULL; /* py string, the output format */ 1175 char *pnew; /* pointer to available byte in output format */ 1176 size_t totalnew; /* number bytes total in output format buffer, 1177 exclusive of trailing \0 */ 1178 size_t usednew; /* number bytes used so far in output format buffer */ 1179 1180 const char *ptoappend; /* ptr to string to append to output buffer */ 1181 size_t ntoappend; /* # of bytes to append to output buffer */ 1182 1183 assert(object && format && timetuple); 1184 1185 /* Give up if the year is before 1900. 1186 * Python strftime() plays games with the year, and different 1187 * games depending on whether envar PYTHON2K is set. This makes 1188 * years before 1900 a nightmare, even if the platform strftime 1189 * supports them (and not all do). 1190 * We could get a lot farther here by avoiding Python's strftime 1191 * wrapper and calling the C strftime() directly, but that isn't 1192 * an option in the Python implementation of this module. 1193 */ 1194 { 1195 long year; 1196 PyObject *pyyear = PySequence_GetItem(timetuple, 0); 1197 if (pyyear == NULL) return NULL; 1198 assert(PyInt_Check(pyyear)); 1199 year = PyInt_AsLong(pyyear); 1200 Py_DECREF(pyyear); 1201 if (year < 1900) { 1202 PyErr_Format(PyExc_ValueError, "year=%ld is before " 1203 "1900; the datetime strftime() " 1204 "methods require year >= 1900", 1205 year); 1206 return NULL; 1207 } 1208 } 1209 1210 /* Scan the input format, looking for %z/%Z/%f escapes, building 1211 * a new format. Since computing the replacements for those codes 1212 * is expensive, don't unless they're actually used. 1213 */ 1214 if (format_len > INT_MAX - 1) { 1215 PyErr_NoMemory(); 1216 goto Done; 1217 } 1218 1219 totalnew = format_len + 1; /* realistic if no %z/%Z/%f */ 1220 newfmt = PyString_FromStringAndSize(NULL, totalnew); 1221 if (newfmt == NULL) goto Done; 1222 pnew = PyString_AsString(newfmt); 1223 usednew = 0; 1224 1225 pin = format; 1226 while ((ch = *pin++) != '\0') { 1227 if (ch != '%') { 1228 ptoappend = pin - 1; 1229 ntoappend = 1; 1230 } 1231 else if ((ch = *pin++) == '\0') { 1232 /* There's a lone trailing %; doesn't make sense. */ 1233 PyErr_SetString(PyExc_ValueError, "strftime format " 1234 "ends with raw %"); 1235 goto Done; 1236 } 1237 /* A % has been seen and ch is the character after it. */ 1238 else if (ch == 'z') { 1239 if (zreplacement == NULL) { 1240 /* format utcoffset */ 1241 char buf[100]; 1242 PyObject *tzinfo = get_tzinfo_member(object); 1243 zreplacement = PyString_FromString(""); 1244 if (zreplacement == NULL) goto Done; 1245 if (tzinfo != Py_None && tzinfo != NULL) { 1246 assert(tzinfoarg != NULL); 1247 if (format_utcoffset(buf, 1248 sizeof(buf), 1249 "", 1250 tzinfo, 1251 tzinfoarg) < 0) 1252 goto Done; 1253 Py_DECREF(zreplacement); 1254 zreplacement = PyString_FromString(buf); 1255 if (zreplacement == NULL) goto Done; 1256 } 1257 } 1258 assert(zreplacement != NULL); 1259 ptoappend = PyString_AS_STRING(zreplacement); 1260 ntoappend = PyString_GET_SIZE(zreplacement); 1261 } 1262 else if (ch == 'Z') { 1263 /* format tzname */ 1264 if (Zreplacement == NULL) { 1265 PyObject *tzinfo = get_tzinfo_member(object); 1266 Zreplacement = PyString_FromString(""); 1267 if (Zreplacement == NULL) goto Done; 1268 if (tzinfo != Py_None && tzinfo != NULL) { 1269 PyObject *temp; 1270 assert(tzinfoarg != NULL); 1271 temp = call_tzname(tzinfo, tzinfoarg); 1272 if (temp == NULL) goto Done; 1273 if (temp != Py_None) { 1274 assert(PyString_Check(temp)); 1275 /* Since the tzname is getting 1276 * stuffed into the format, we 1277 * have to double any % signs 1278 * so that strftime doesn't 1279 * treat them as format codes. 1280 */ 1281 Py_DECREF(Zreplacement); 1282 Zreplacement = PyObject_CallMethod( 1283 temp, "replace", 1284 "ss", "%", "%%"); 1285 Py_DECREF(temp); 1286 if (Zreplacement == NULL) 1287 goto Done; 1288 if (!PyString_Check(Zreplacement)) { 1289 PyErr_SetString(PyExc_TypeError, "tzname.replace() did not return a string"); 1290 goto Done; 1291 } 1292 } 1293 else 1294 Py_DECREF(temp); 1295 } 1296 } 1297 assert(Zreplacement != NULL); 1298 ptoappend = PyString_AS_STRING(Zreplacement); 1299 ntoappend = PyString_GET_SIZE(Zreplacement); 1300 } 1301 else if (ch == 'f') { 1302 /* format microseconds */ 1303 if (freplacement == NULL) { 1304 freplacement = make_freplacement(object); 1305 if (freplacement == NULL) 1306 goto Done; 1307 } 1308 assert(freplacement != NULL); 1309 assert(PyString_Check(freplacement)); 1310 ptoappend = PyString_AS_STRING(freplacement); 1311 ntoappend = PyString_GET_SIZE(freplacement); 1312 } 1313 else { 1314 /* percent followed by neither z nor Z */ 1315 ptoappend = pin - 2; 1316 ntoappend = 2; 1317 } 1318 1319 /* Append the ntoappend chars starting at ptoappend to 1320 * the new format. 1321 */ 1322 assert(ptoappend != NULL); 1323 assert(ntoappend >= 0); 1324 if (ntoappend == 0) 1325 continue; 1326 while (usednew + ntoappend > totalnew) { 1327 size_t bigger = totalnew << 1; 1328 if ((bigger >> 1) != totalnew) { /* overflow */ 1329 PyErr_NoMemory(); 1330 goto Done; 1331 } 1332 if (_PyString_Resize(&newfmt, bigger) < 0) 1333 goto Done; 1334 totalnew = bigger; 1335 pnew = PyString_AsString(newfmt) + usednew; 1336 } 1337 memcpy(pnew, ptoappend, ntoappend); 1338 pnew += ntoappend; 1339 usednew += ntoappend; 1340 assert(usednew <= totalnew); 1341 } /* end while() */ 1342 1343 if (_PyString_Resize(&newfmt, usednew) < 0) 1344 goto Done; 1345 { 1346 PyObject *time = PyImport_ImportModuleNoBlock("time"); 1347 if (time == NULL) 1348 goto Done; 1349 result = PyObject_CallMethod(time, "strftime", "OO", 1350 newfmt, timetuple); 1351 Py_DECREF(time); 1352 } 1353 Done: 1354 Py_XDECREF(freplacement); 1355 Py_XDECREF(zreplacement); 1356 Py_XDECREF(Zreplacement); 1357 Py_XDECREF(newfmt); 1358 return result; 1359 } 1360 1361 static char * 1362 isoformat_date(PyDateTime_Date *dt, char buffer[], int bufflen) 1363 { 1364 int x; 1365 x = PyOS_snprintf(buffer, bufflen, 1366 "%04d-%02d-%02d", 1367 GET_YEAR(dt), GET_MONTH(dt), GET_DAY(dt)); 1368 assert(bufflen >= x); 1369 return buffer + x; 1370 } 1371 1372 static char * 1373 isoformat_time(PyDateTime_DateTime *dt, char buffer[], int bufflen) 1374 { 1375 int x; 1376 int us = DATE_GET_MICROSECOND(dt); 1377 1378 x = PyOS_snprintf(buffer, bufflen, 1379 "%02d:%02d:%02d", 1380 DATE_GET_HOUR(dt), 1381 DATE_GET_MINUTE(dt), 1382 DATE_GET_SECOND(dt)); 1383 assert(bufflen >= x); 1384 if (us) 1385 x += PyOS_snprintf(buffer + x, bufflen - x, ".%06d", us); 1386 assert(bufflen >= x); 1387 return buffer + x; 1388 } 1389 1390 /* --------------------------------------------------------------------------- 1391 * Wrap functions from the time module. These aren't directly available 1392 * from C. Perhaps they should be. 1393 */ 1394 1395 /* Call time.time() and return its result (a Python float). */ 1396 static PyObject * 1397 time_time(void) 1398 { 1399 PyObject *result = NULL; 1400 PyObject *time = PyImport_ImportModuleNoBlock("time"); 1401 1402 if (time != NULL) { 1403 result = PyObject_CallMethod(time, "time", "()"); 1404 Py_DECREF(time); 1405 } 1406 return result; 1407 } 1408 1409 /* Build a time.struct_time. The weekday and day number are automatically 1410 * computed from the y,m,d args. 1411 */ 1412 static PyObject * 1413 build_struct_time(int y, int m, int d, int hh, int mm, int ss, int dstflag) 1414 { 1415 PyObject *time; 1416 PyObject *result = NULL; 1417 1418 time = PyImport_ImportModuleNoBlock("time"); 1419 if (time != NULL) { 1420 result = PyObject_CallMethod(time, "struct_time", 1421 "((iiiiiiiii))", 1422 y, m, d, 1423 hh, mm, ss, 1424 weekday(y, m, d), 1425 days_before_month(y, m) + d, 1426 dstflag); 1427 Py_DECREF(time); 1428 } 1429 return result; 1430 } 1431 1432 /* --------------------------------------------------------------------------- 1433 * Miscellaneous helpers. 1434 */ 1435 1436 /* For obscure reasons, we need to use tp_richcompare instead of tp_compare. 1437 * The comparisons here all most naturally compute a cmp()-like result. 1438 * This little helper turns that into a bool result for rich comparisons. 1439 */ 1440 static PyObject * 1441 diff_to_bool(int diff, int op) 1442 { 1443 PyObject *result; 1444 int istrue; 1445 1446 switch (op) { 1447 case Py_EQ: istrue = diff == 0; break; 1448 case Py_NE: istrue = diff != 0; break; 1449 case Py_LE: istrue = diff <= 0; break; 1450 case Py_GE: istrue = diff >= 0; break; 1451 case Py_LT: istrue = diff < 0; break; 1452 case Py_GT: istrue = diff > 0; break; 1453 default: 1454 assert(! "op unknown"); 1455 istrue = 0; /* To shut up compiler */ 1456 } 1457 result = istrue ? Py_True : Py_False; 1458 Py_INCREF(result); 1459 return result; 1460 } 1461 1462 /* Raises a "can't compare" TypeError and returns NULL. */ 1463 static PyObject * 1464 cmperror(PyObject *a, PyObject *b) 1465 { 1466 PyErr_Format(PyExc_TypeError, 1467 "can't compare %s to %s", 1468 Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name); 1469 return NULL; 1470 } 1471 1472 /* --------------------------------------------------------------------------- 1473 * Cached Python objects; these are set by the module init function. 1474 */ 1475 1476 /* Conversion factors. */ 1477 static PyObject *us_per_us = NULL; /* 1 */ 1478 static PyObject *us_per_ms = NULL; /* 1000 */ 1479 static PyObject *us_per_second = NULL; /* 1000000 */ 1480 static PyObject *us_per_minute = NULL; /* 1e6 * 60 as Python int */ 1481 static PyObject *us_per_hour = NULL; /* 1e6 * 3600 as Python long */ 1482 static PyObject *us_per_day = NULL; /* 1e6 * 3600 * 24 as Python long */ 1483 static PyObject *us_per_week = NULL; /* 1e6*3600*24*7 as Python long */ 1484 static PyObject *seconds_per_day = NULL; /* 3600*24 as Python int */ 1485 1486 /* --------------------------------------------------------------------------- 1487 * Class implementations. 1488 */ 1489 1490 /* 1491 * PyDateTime_Delta implementation. 1492 */ 1493 1494 /* Convert a timedelta to a number of us, 1495 * (24*3600*self.days + self.seconds)*1000000 + self.microseconds 1496 * as a Python int or long. 1497 * Doing mixed-radix arithmetic by hand instead is excruciating in C, 1498 * due to ubiquitous overflow possibilities. 1499 */ 1500 static PyObject * 1501 delta_to_microseconds(PyDateTime_Delta *self) 1502 { 1503 PyObject *x1 = NULL; 1504 PyObject *x2 = NULL; 1505 PyObject *x3 = NULL; 1506 PyObject *result = NULL; 1507 1508 x1 = PyInt_FromLong(GET_TD_DAYS(self)); 1509 if (x1 == NULL) 1510 goto Done; 1511 x2 = PyNumber_Multiply(x1, seconds_per_day); /* days in seconds */ 1512 if (x2 == NULL) 1513 goto Done; 1514 Py_DECREF(x1); 1515 x1 = NULL; 1516 1517 /* x2 has days in seconds */ 1518 x1 = PyInt_FromLong(GET_TD_SECONDS(self)); /* seconds */ 1519 if (x1 == NULL) 1520 goto Done; 1521 x3 = PyNumber_Add(x1, x2); /* days and seconds in seconds */ 1522 if (x3 == NULL) 1523 goto Done; 1524 Py_DECREF(x1); 1525 Py_DECREF(x2); 1526 x2 = NULL; 1527 1528 /* x3 has days+seconds in seconds */ 1529 x1 = PyNumber_Multiply(x3, us_per_second); /* us */ 1530 if (x1 == NULL) 1531 goto Done; 1532 Py_DECREF(x3); 1533 x3 = NULL; 1534 1535 /* x1 has days+seconds in us */ 1536 x2 = PyInt_FromLong(GET_TD_MICROSECONDS(self)); 1537 if (x2 == NULL) 1538 goto Done; 1539 result = PyNumber_Add(x1, x2); 1540 assert(result == NULL || _PyAnyInt_CheckExact(result)); 1541 1542 Done: 1543 Py_XDECREF(x1); 1544 Py_XDECREF(x2); 1545 Py_XDECREF(x3); 1546 return result; 1547 } 1548 1549 /* Convert a number of us (as a Python int or long) to a timedelta. 1550 */ 1551 static PyObject * 1552 microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type) 1553 { 1554 int us; 1555 int s; 1556 int d; 1557 long temp; 1558 1559 PyObject *tuple = NULL; 1560 PyObject *num = NULL; 1561 PyObject *result = NULL; 1562 1563 assert(_PyAnyInt_CheckExact(pyus)); 1564 tuple = PyNumber_Divmod(pyus, us_per_second); 1565 if (tuple == NULL) 1566 goto Done; 1567 1568 num = PyTuple_GetItem(tuple, 1); /* us */ 1569 if (num == NULL) 1570 goto Done; 1571 temp = PyLong_AsLong(num); 1572 num = NULL; 1573 if (temp == -1 && PyErr_Occurred()) 1574 goto Done; 1575 assert(0 <= temp && temp < 1000000); 1576 us = (int)temp; 1577 if (us < 0) { 1578 /* The divisor was positive, so this must be an error. */ 1579 assert(PyErr_Occurred()); 1580 goto Done; 1581 } 1582 1583 num = PyTuple_GetItem(tuple, 0); /* leftover seconds */ 1584 if (num == NULL) 1585 goto Done; 1586 Py_INCREF(num); 1587 Py_DECREF(tuple); 1588 1589 tuple = PyNumber_Divmod(num, seconds_per_day); 1590 if (tuple == NULL) 1591 goto Done; 1592 Py_DECREF(num); 1593 1594 num = PyTuple_GetItem(tuple, 1); /* seconds */ 1595 if (num == NULL) 1596 goto Done; 1597 temp = PyLong_AsLong(num); 1598 num = NULL; 1599 if (temp == -1 && PyErr_Occurred()) 1600 goto Done; 1601 assert(0 <= temp && temp < 24*3600); 1602 s = (int)temp; 1603 1604 if (s < 0) { 1605 /* The divisor was positive, so this must be an error. */ 1606 assert(PyErr_Occurred()); 1607 goto Done; 1608 } 1609 1610 num = PyTuple_GetItem(tuple, 0); /* leftover days */ 1611 if (num == NULL) 1612 goto Done; 1613 Py_INCREF(num); 1614 temp = PyLong_AsLong(num); 1615 if (temp == -1 && PyErr_Occurred()) 1616 goto Done; 1617 d = (int)temp; 1618 if ((long)d != temp) { 1619 PyErr_SetString(PyExc_OverflowError, "normalized days too " 1620 "large to fit in a C int"); 1621 goto Done; 1622 } 1623 result = new_delta_ex(d, s, us, 0, type); 1624 1625 Done: 1626 Py_XDECREF(tuple); 1627 Py_XDECREF(num); 1628 return result; 1629 } 1630 1631 #define microseconds_to_delta(pymicros) \ 1632 microseconds_to_delta_ex(pymicros, &PyDateTime_DeltaType) 1633 1634 static PyObject * 1635 multiply_int_timedelta(PyObject *intobj, PyDateTime_Delta *delta) 1636 { 1637 PyObject *pyus_in; 1638 PyObject *pyus_out; 1639 PyObject *result; 1640 1641 pyus_in = delta_to_microseconds(delta); 1642 if (pyus_in == NULL) 1643 return NULL; 1644 1645 pyus_out = PyNumber_Multiply(pyus_in, intobj); 1646 Py_DECREF(pyus_in); 1647 if (pyus_out == NULL) 1648 return NULL; 1649 1650 result = microseconds_to_delta(pyus_out); 1651 Py_DECREF(pyus_out); 1652 return result; 1653 } 1654 1655 static PyObject * 1656 divide_timedelta_int(PyDateTime_Delta *delta, PyObject *intobj) 1657 { 1658 PyObject *pyus_in; 1659 PyObject *pyus_out; 1660 PyObject *result; 1661 1662 pyus_in = delta_to_microseconds(delta); 1663 if (pyus_in == NULL) 1664 return NULL; 1665 1666 pyus_out = PyNumber_FloorDivide(pyus_in, intobj); 1667 Py_DECREF(pyus_in); 1668 if (pyus_out == NULL) 1669 return NULL; 1670 1671 result = microseconds_to_delta(pyus_out); 1672 Py_DECREF(pyus_out); 1673 return result; 1674 } 1675 1676 static PyObject * 1677 delta_add(PyObject *left, PyObject *right) 1678 { 1679 PyObject *result = Py_NotImplemented; 1680 1681 if (PyDelta_Check(left) && PyDelta_Check(right)) { 1682 /* delta + delta */ 1683 /* The C-level additions can't overflow because of the 1684 * invariant bounds. 1685 */ 1686 int days = GET_TD_DAYS(left) + GET_TD_DAYS(right); 1687 int seconds = GET_TD_SECONDS(left) + GET_TD_SECONDS(right); 1688 int microseconds = GET_TD_MICROSECONDS(left) + 1689 GET_TD_MICROSECONDS(right); 1690 result = new_delta(days, seconds, microseconds, 1); 1691 } 1692 1693 if (result == Py_NotImplemented) 1694 Py_INCREF(result); 1695 return result; 1696 } 1697 1698 static PyObject * 1699 delta_negative(PyDateTime_Delta *self) 1700 { 1701 return new_delta(-GET_TD_DAYS(self), 1702 -GET_TD_SECONDS(self), 1703 -GET_TD_MICROSECONDS(self), 1704 1); 1705 } 1706 1707 static PyObject * 1708 delta_positive(PyDateTime_Delta *self) 1709 { 1710 /* Could optimize this (by returning self) if this isn't a 1711 * subclass -- but who uses unary + ? Approximately nobody. 1712 */ 1713 return new_delta(GET_TD_DAYS(self), 1714 GET_TD_SECONDS(self), 1715 GET_TD_MICROSECONDS(self), 1716 0); 1717 } 1718 1719 static PyObject * 1720 delta_abs(PyDateTime_Delta *self) 1721 { 1722 PyObject *result; 1723 1724 assert(GET_TD_MICROSECONDS(self) >= 0); 1725 assert(GET_TD_SECONDS(self) >= 0); 1726 1727 if (GET_TD_DAYS(self) < 0) 1728 result = delta_negative(self); 1729 else 1730 result = delta_positive(self); 1731 1732 return result; 1733 } 1734 1735 static PyObject * 1736 delta_subtract(PyObject *left, PyObject *right) 1737 { 1738 PyObject *result = Py_NotImplemented; 1739 1740 if (PyDelta_Check(left) && PyDelta_Check(right)) { 1741 /* delta - delta */ 1742 /* The C-level additions can't overflow because of the 1743 * invariant bounds. 1744 */ 1745 int days = GET_TD_DAYS(left) - GET_TD_DAYS(right); 1746 int seconds = GET_TD_SECONDS(left) - GET_TD_SECONDS(right); 1747 int microseconds = GET_TD_MICROSECONDS(left) - 1748 GET_TD_MICROSECONDS(right); 1749 result = new_delta(days, seconds, microseconds, 1); 1750 } 1751 1752 if (result == Py_NotImplemented) 1753 Py_INCREF(result); 1754 return result; 1755 } 1756 1757 /* This is more natural as a tp_compare, but doesn't work then: for whatever 1758 * reason, Python's try_3way_compare ignores tp_compare unless 1759 * PyInstance_Check returns true, but these aren't old-style classes. 1760 */ 1761 static PyObject * 1762 delta_richcompare(PyDateTime_Delta *self, PyObject *other, int op) 1763 { 1764 int diff = 42; /* nonsense */ 1765 1766 if (PyDelta_Check(other)) { 1767 diff = GET_TD_DAYS(self) - GET_TD_DAYS(other); 1768 if (diff == 0) { 1769 diff = GET_TD_SECONDS(self) - GET_TD_SECONDS(other); 1770 if (diff == 0) 1771 diff = GET_TD_MICROSECONDS(self) - 1772 GET_TD_MICROSECONDS(other); 1773 } 1774 } 1775 else if (op == Py_EQ || op == Py_NE) 1776 diff = 1; /* any non-zero value will do */ 1777 1778 else /* stop this from falling back to address comparison */ 1779 return cmperror((PyObject *)self, other); 1780 1781 return diff_to_bool(diff, op); 1782 } 1783 1784 static PyObject *delta_getstate(PyDateTime_Delta *self); 1785 1786 static long 1787 delta_hash(PyDateTime_Delta *self) 1788 { 1789 if (self->hashcode == -1) { 1790 PyObject *temp = delta_getstate(self); 1791 if (temp != NULL) { 1792 self->hashcode = PyObject_Hash(temp); 1793 Py_DECREF(temp); 1794 } 1795 } 1796 return self->hashcode; 1797 } 1798 1799 static PyObject * 1800 delta_multiply(PyObject *left, PyObject *right) 1801 { 1802 PyObject *result = Py_NotImplemented; 1803 1804 if (PyDelta_Check(left)) { 1805 /* delta * ??? */ 1806 if (_PyAnyInt_Check(right)) 1807 result = multiply_int_timedelta(right, 1808 (PyDateTime_Delta *) left); 1809 } 1810 else if (_PyAnyInt_Check(left)) 1811 result = multiply_int_timedelta(left, 1812 (PyDateTime_Delta *) right); 1813 1814 if (result == Py_NotImplemented) 1815 Py_INCREF(result); 1816 return result; 1817 } 1818 1819 static PyObject * 1820 delta_divide(PyObject *left, PyObject *right) 1821 { 1822 PyObject *result = Py_NotImplemented; 1823 1824 if (PyDelta_Check(left)) { 1825 /* delta * ??? */ 1826 if (_PyAnyInt_Check(right)) 1827 result = divide_timedelta_int( 1828 (PyDateTime_Delta *)left, 1829 right); 1830 } 1831 1832 if (result == Py_NotImplemented) 1833 Py_INCREF(result); 1834 return result; 1835 } 1836 1837 /* Fold in the value of the tag ("seconds", "weeks", etc) component of a 1838 * timedelta constructor. sofar is the # of microseconds accounted for 1839 * so far, and there are factor microseconds per current unit, the number 1840 * of which is given by num. num * factor is added to sofar in a 1841 * numerically careful way, and that's the result. Any fractional 1842 * microseconds left over (this can happen if num is a float type) are 1843 * added into *leftover. 1844 * Note that there are many ways this can give an error (NULL) return. 1845 */ 1846 static PyObject * 1847 accum(const char* tag, PyObject *sofar, PyObject *num, PyObject *factor, 1848 double *leftover) 1849 { 1850 PyObject *prod; 1851 PyObject *sum; 1852 1853 assert(num != NULL); 1854 1855 if (_PyAnyInt_Check(num)) { 1856 prod = PyNumber_Multiply(factor, num); 1857 if (prod == NULL) 1858 return NULL; 1859 assert(_PyAnyInt_CheckExact(prod)); 1860 sum = PyNumber_Add(sofar, prod); 1861 Py_DECREF(prod); 1862 assert(sum == NULL || _PyAnyInt_CheckExact(sum)); 1863 return sum; 1864 } 1865 1866 if (PyFloat_Check(num)) { 1867 double dnum; 1868 double fracpart; 1869 double intpart; 1870 PyObject *x; 1871 PyObject *y; 1872 1873 /* The Plan: decompose num into an integer part and a 1874 * fractional part, num = intpart + fracpart. 1875 * Then num * factor == 1876 * intpart * factor + fracpart * factor 1877 * and the LHS can be computed exactly in long arithmetic. 1878 * The RHS is again broken into an int part and frac part. 1879 * and the frac part is added into *leftover. 1880 */ 1881 dnum = PyFloat_AsDouble(num); 1882 if (dnum == -1.0 && PyErr_Occurred()) 1883 return NULL; 1884 fracpart = modf(dnum, &intpart); 1885 x = PyLong_FromDouble(intpart); 1886 if (x == NULL) 1887 return NULL; 1888 1889 prod = PyNumber_Multiply(x, factor); 1890 Py_DECREF(x); 1891 if (prod == NULL) 1892 return NULL; 1893 1894 sum = PyNumber_Add(sofar, prod); 1895 Py_DECREF(prod); 1896 if (sum == NULL) 1897 return NULL; 1898 1899 if (fracpart == 0.0) 1900 return sum; 1901 /* So far we've lost no information. Dealing with the 1902 * fractional part requires float arithmetic, and may 1903 * lose a little info. 1904 */ 1905 assert(_PyAnyInt_CheckExact(factor)); 1906 if (PyInt_Check(factor)) 1907 dnum = (double)PyInt_AsLong(factor); 1908 else 1909 dnum = PyLong_AsDouble(factor); 1910 1911 dnum *= fracpart; 1912 fracpart = modf(dnum, &intpart); 1913 x = PyLong_FromDouble(intpart); 1914 if (x == NULL) { 1915 Py_DECREF(sum); 1916 return NULL; 1917 } 1918 1919 y = PyNumber_Add(sum, x); 1920 Py_DECREF(sum); 1921 Py_DECREF(x); 1922 *leftover += fracpart; 1923 assert(y == NULL || _PyAnyInt_CheckExact(y)); 1924 return y; 1925 } 1926 1927 PyErr_Format(PyExc_TypeError, 1928 "unsupported type for timedelta %s component: %s", 1929 tag, Py_TYPE(num)->tp_name); 1930 return NULL; 1931 } 1932 1933 static PyObject * 1934 delta_new(PyTypeObject *type, PyObject *args, PyObject *kw) 1935 { 1936 PyObject *self = NULL; 1937 1938 /* Argument objects. */ 1939 PyObject *day = NULL; 1940 PyObject *second = NULL; 1941 PyObject *us = NULL; 1942 PyObject *ms = NULL; 1943 PyObject *minute = NULL; 1944 PyObject *hour = NULL; 1945 PyObject *week = NULL; 1946 1947 PyObject *x = NULL; /* running sum of microseconds */ 1948 PyObject *y = NULL; /* temp sum of microseconds */ 1949 double leftover_us = 0.0; 1950 1951 static char *keywords[] = { 1952 "days", "seconds", "microseconds", "milliseconds", 1953 "minutes", "hours", "weeks", NULL 1954 }; 1955 1956 if (PyArg_ParseTupleAndKeywords(args, kw, "|OOOOOOO:__new__", 1957 keywords, 1958 &day, &second, &us, 1959 &ms, &minute, &hour, &week) == 0) 1960 goto Done; 1961 1962 x = PyInt_FromLong(0); 1963 if (x == NULL) 1964 goto Done; 1965 1966 #define CLEANUP \ 1967 Py_DECREF(x); \ 1968 x = y; \ 1969 if (x == NULL) \ 1970 goto Done 1971 1972 if (us) { 1973 y = accum("microseconds", x, us, us_per_us, &leftover_us); 1974 CLEANUP; 1975 } 1976 if (ms) { 1977 y = accum("milliseconds", x, ms, us_per_ms, &leftover_us); 1978 CLEANUP; 1979 } 1980 if (second) { 1981 y = accum("seconds", x, second, us_per_second, &leftover_us); 1982 CLEANUP; 1983 } 1984 if (minute) { 1985 y = accum("minutes", x, minute, us_per_minute, &leftover_us); 1986 CLEANUP; 1987 } 1988 if (hour) { 1989 y = accum("hours", x, hour, us_per_hour, &leftover_us); 1990 CLEANUP; 1991 } 1992 if (day) { 1993 y = accum("days", x, day, us_per_day, &leftover_us); 1994 CLEANUP; 1995 } 1996 if (week) { 1997 y = accum("weeks", x, week, us_per_week, &leftover_us); 1998 CLEANUP; 1999 } 2000 if (leftover_us) { 2001 /* Round to nearest whole # of us, and add into x. */ 2002 PyObject *temp = PyLong_FromLong(round_to_long(leftover_us)); 2003 if (temp == NULL) { 2004 Py_DECREF(x); 2005 goto Done; 2006 } 2007 y = PyNumber_Add(x, temp); 2008 Py_DECREF(temp); 2009 CLEANUP; 2010 } 2011 2012 self = microseconds_to_delta_ex(x, type); 2013 Py_DECREF(x); 2014 Done: 2015 return self; 2016 2017 #undef CLEANUP 2018 } 2019 2020 static int 2021 delta_nonzero(PyDateTime_Delta *self) 2022 { 2023 return (GET_TD_DAYS(self) != 0 2024 || GET_TD_SECONDS(self) != 0 2025 || GET_TD_MICROSECONDS(self) != 0); 2026 } 2027 2028 static PyObject * 2029 delta_repr(PyDateTime_Delta *self) 2030 { 2031 if (GET_TD_MICROSECONDS(self) != 0) 2032 return PyString_FromFormat("%s(%d, %d, %d)", 2033 Py_TYPE(self)->tp_name, 2034 GET_TD_DAYS(self), 2035 GET_TD_SECONDS(self), 2036 GET_TD_MICROSECONDS(self)); 2037 if (GET_TD_SECONDS(self) != 0) 2038 return PyString_FromFormat("%s(%d, %d)", 2039 Py_TYPE(self)->tp_name, 2040 GET_TD_DAYS(self), 2041 GET_TD_SECONDS(self)); 2042 2043 return PyString_FromFormat("%s(%d)", 2044 Py_TYPE(self)->tp_name, 2045 GET_TD_DAYS(self)); 2046 } 2047 2048 static PyObject * 2049 delta_str(PyDateTime_Delta *self) 2050 { 2051 int days = GET_TD_DAYS(self); 2052 int seconds = GET_TD_SECONDS(self); 2053 int us = GET_TD_MICROSECONDS(self); 2054 int hours; 2055 int minutes; 2056 char buf[100]; 2057 char *pbuf = buf; 2058 size_t buflen = sizeof(buf); 2059 int n; 2060 2061 minutes = divmod(seconds, 60, &seconds); 2062 hours = divmod(minutes, 60, &minutes); 2063 2064 if (days) { 2065 n = PyOS_snprintf(pbuf, buflen, "%d day%s, ", days, 2066 (days == 1 || days == -1) ? "" : "s"); 2067 if (n < 0 || (size_t)n >= buflen) 2068 goto Fail; 2069 pbuf += n; 2070 buflen -= (size_t)n; 2071 } 2072 2073 n = PyOS_snprintf(pbuf, buflen, "%d:%02d:%02d", 2074 hours, minutes, seconds); 2075 if (n < 0 || (size_t)n >= buflen) 2076 goto Fail; 2077 pbuf += n; 2078 buflen -= (size_t)n; 2079 2080 if (us) { 2081 n = PyOS_snprintf(pbuf, buflen, ".%06d", us); 2082 if (n < 0 || (size_t)n >= buflen) 2083 goto Fail; 2084 pbuf += n; 2085 } 2086 2087 return PyString_FromStringAndSize(buf, pbuf - buf); 2088 2089 Fail: 2090 PyErr_SetString(PyExc_SystemError, "goofy result from PyOS_snprintf"); 2091 return NULL; 2092 } 2093 2094 /* Pickle support, a simple use of __reduce__. */ 2095 2096 /* __getstate__ isn't exposed */ 2097 static PyObject * 2098 delta_getstate(PyDateTime_Delta *self) 2099 { 2100 return Py_BuildValue("iii", GET_TD_DAYS(self), 2101 GET_TD_SECONDS(self), 2102 GET_TD_MICROSECONDS(self)); 2103 } 2104 2105 static PyObject * 2106 delta_total_seconds(PyObject *self) 2107 { 2108 PyObject *total_seconds; 2109 PyObject *total_microseconds; 2110 PyObject *one_million; 2111 2112 total_microseconds = delta_to_microseconds((PyDateTime_Delta *)self); 2113 if (total_microseconds == NULL) 2114 return NULL; 2115 2116 one_million = PyLong_FromLong(1000000L); 2117 if (one_million == NULL) { 2118 Py_DECREF(total_microseconds); 2119 return NULL; 2120 } 2121 2122 total_seconds = PyNumber_TrueDivide(total_microseconds, one_million); 2123 2124 Py_DECREF(total_microseconds); 2125 Py_DECREF(one_million); 2126 return total_seconds; 2127 } 2128 2129 static PyObject * 2130 delta_reduce(PyDateTime_Delta* self) 2131 { 2132 return Py_BuildValue("ON", Py_TYPE(self), delta_getstate(self)); 2133 } 2134 2135 #define OFFSET(field) offsetof(PyDateTime_Delta, field) 2136 2137 static PyMemberDef delta_members[] = { 2138 2139 {"days", T_INT, OFFSET(days), READONLY, 2140 PyDoc_STR("Number of days.")}, 2141 2142 {"seconds", T_INT, OFFSET(seconds), READONLY, 2143 PyDoc_STR("Number of seconds (>= 0 and less than 1 day).")}, 2144 2145 {"microseconds", T_INT, OFFSET(microseconds), READONLY, 2146 PyDoc_STR("Number of microseconds (>= 0 and less than 1 second).")}, 2147 {NULL} 2148 }; 2149 2150 static PyMethodDef delta_methods[] = { 2151 {"total_seconds", (PyCFunction)delta_total_seconds, METH_NOARGS, 2152 PyDoc_STR("Total seconds in the duration.")}, 2153 2154 {"__reduce__", (PyCFunction)delta_reduce, METH_NOARGS, 2155 PyDoc_STR("__reduce__() -> (cls, state)")}, 2156 2157 {NULL, NULL}, 2158 }; 2159 2160 static char delta_doc[] = 2161 PyDoc_STR("Difference between two datetime values."); 2162 2163 static PyNumberMethods delta_as_number = { 2164 delta_add, /* nb_add */ 2165 delta_subtract, /* nb_subtract */ 2166 delta_multiply, /* nb_multiply */ 2167 delta_divide, /* nb_divide */ 2168 0, /* nb_remainder */ 2169 0, /* nb_divmod */ 2170 0, /* nb_power */ 2171 (unaryfunc)delta_negative, /* nb_negative */ 2172 (unaryfunc)delta_positive, /* nb_positive */ 2173 (unaryfunc)delta_abs, /* nb_absolute */ 2174 (inquiry)delta_nonzero, /* nb_nonzero */ 2175 0, /*nb_invert*/ 2176 0, /*nb_lshift*/ 2177 0, /*nb_rshift*/ 2178 0, /*nb_and*/ 2179 0, /*nb_xor*/ 2180 0, /*nb_or*/ 2181 0, /*nb_coerce*/ 2182 0, /*nb_int*/ 2183 0, /*nb_long*/ 2184 0, /*nb_float*/ 2185 0, /*nb_oct*/ 2186 0, /*nb_hex*/ 2187 0, /*nb_inplace_add*/ 2188 0, /*nb_inplace_subtract*/ 2189 0, /*nb_inplace_multiply*/ 2190 0, /*nb_inplace_divide*/ 2191 0, /*nb_inplace_remainder*/ 2192 0, /*nb_inplace_power*/ 2193 0, /*nb_inplace_lshift*/ 2194 0, /*nb_inplace_rshift*/ 2195 0, /*nb_inplace_and*/ 2196 0, /*nb_inplace_xor*/ 2197 0, /*nb_inplace_or*/ 2198 delta_divide, /* nb_floor_divide */ 2199 0, /* nb_true_divide */ 2200 0, /* nb_inplace_floor_divide */ 2201 0, /* nb_inplace_true_divide */ 2202 }; 2203 2204 static PyTypeObject PyDateTime_DeltaType = { 2205 PyVarObject_HEAD_INIT(NULL, 0) 2206 "datetime.timedelta", /* tp_name */ 2207 sizeof(PyDateTime_Delta), /* tp_basicsize */ 2208 0, /* tp_itemsize */ 2209 0, /* tp_dealloc */ 2210 0, /* tp_print */ 2211 0, /* tp_getattr */ 2212 0, /* tp_setattr */ 2213 0, /* tp_compare */ 2214 (reprfunc)delta_repr, /* tp_repr */ 2215 &delta_as_number, /* tp_as_number */ 2216 0, /* tp_as_sequence */ 2217 0, /* tp_as_mapping */ 2218 (hashfunc)delta_hash, /* tp_hash */ 2219 0, /* tp_call */ 2220 (reprfunc)delta_str, /* tp_str */ 2221 PyObject_GenericGetAttr, /* tp_getattro */ 2222 0, /* tp_setattro */ 2223 0, /* tp_as_buffer */ 2224 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | 2225 Py_TPFLAGS_BASETYPE, /* tp_flags */ 2226 delta_doc, /* tp_doc */ 2227 0, /* tp_traverse */ 2228 0, /* tp_clear */ 2229 (richcmpfunc)delta_richcompare, /* tp_richcompare */ 2230 0, /* tp_weaklistoffset */ 2231 0, /* tp_iter */ 2232 0, /* tp_iternext */ 2233 delta_methods, /* tp_methods */ 2234 delta_members, /* tp_members */ 2235 0, /* tp_getset */ 2236 0, /* tp_base */ 2237 0, /* tp_dict */ 2238 0, /* tp_descr_get */ 2239 0, /* tp_descr_set */ 2240 0, /* tp_dictoffset */ 2241 0, /* tp_init */ 2242 0, /* tp_alloc */ 2243 delta_new, /* tp_new */ 2244 0, /* tp_free */ 2245 }; 2246 2247 /* 2248 * PyDateTime_Date implementation. 2249 */ 2250 2251 /* Accessor properties. */ 2252 2253 static PyObject * 2254 date_year(PyDateTime_Date *self, void *unused) 2255 { 2256 return PyInt_FromLong(GET_YEAR(self)); 2257 } 2258 2259 static PyObject * 2260 date_month(PyDateTime_Date *self, void *unused) 2261 { 2262 return PyInt_FromLong(GET_MONTH(self)); 2263 } 2264 2265 static PyObject * 2266 date_day(PyDateTime_Date *self, void *unused) 2267 { 2268 return PyInt_FromLong(GET_DAY(self)); 2269 } 2270 2271 static PyGetSetDef date_getset[] = { 2272 {"year", (getter)date_year}, 2273 {"month", (getter)date_month}, 2274 {"day", (getter)date_day}, 2275 {NULL} 2276 }; 2277 2278 /* Constructors. */ 2279 2280 static char *date_kws[] = {"year", "month", "day", NULL}; 2281 2282 static PyObject * 2283 date_new(PyTypeObject *type, PyObject *args, PyObject *kw) 2284 { 2285 PyObject *self = NULL; 2286 PyObject *state; 2287 int year; 2288 int month; 2289 int day; 2290 2291 /* Check for invocation from pickle with __getstate__ state */ 2292 if (PyTuple_GET_SIZE(args) == 1 && 2293 PyString_Check(state = PyTuple_GET_ITEM(args, 0)) && 2294 PyString_GET_SIZE(state) == _PyDateTime_DATE_DATASIZE && 2295 MONTH_IS_SANE(PyString_AS_STRING(state)[2])) 2296 { 2297 PyDateTime_Date *me; 2298 2299 me = (PyDateTime_Date *) (type->tp_alloc(type, 0)); 2300 if (me != NULL) { 2301 char *pdata = PyString_AS_STRING(state); 2302 memcpy(me->data, pdata, _PyDateTime_DATE_DATASIZE); 2303 me->hashcode = -1; 2304 } 2305 return (PyObject *)me; 2306 } 2307 2308 if (PyArg_ParseTupleAndKeywords(args, kw, "iii", date_kws, 2309 &year, &month, &day)) { 2310 if (check_date_args(year, month, day) < 0) 2311 return NULL; 2312 self = new_date_ex(year, month, day, type); 2313 } 2314 return self; 2315 } 2316 2317 /* Return new date from localtime(t). */ 2318 static PyObject * 2319 date_local_from_time_t(PyObject *cls, double ts) 2320 { 2321 struct tm *tm; 2322 time_t t; 2323 PyObject *result = NULL; 2324 2325 t = _PyTime_DoubleToTimet(ts); 2326 if (t == (time_t)-1 && PyErr_Occurred()) 2327 return NULL; 2328 tm = localtime(&t); 2329 if (tm) 2330 result = PyObject_CallFunction(cls, "iii", 2331 tm->tm_year + 1900, 2332 tm->tm_mon + 1, 2333 tm->tm_mday); 2334 else 2335 PyErr_SetString(PyExc_ValueError, 2336 "timestamp out of range for " 2337 "platform localtime() function"); 2338 return result; 2339 } 2340 2341 /* Return new date from current time. 2342 * We say this is equivalent to fromtimestamp(time.time()), and the 2343 * only way to be sure of that is to *call* time.time(). That's not 2344 * generally the same as calling C's time. 2345 */ 2346 static PyObject * 2347 date_today(PyObject *cls, PyObject *dummy) 2348 { 2349 PyObject *time; 2350 PyObject *result; 2351 2352 time = time_time(); 2353 if (time == NULL) 2354 return NULL; 2355 2356 /* Note well: today() is a class method, so this may not call 2357 * date.fromtimestamp. For example, it may call 2358 * datetime.fromtimestamp. That's why we need all the accuracy 2359 * time.time() delivers; if someone were gonzo about optimization, 2360 * date.today() could get away with plain C time(). 2361 */ 2362 result = PyObject_CallMethod(cls, "fromtimestamp", "O", time); 2363 Py_DECREF(time); 2364 return result; 2365 } 2366 2367 /* Return new date from given timestamp (Python timestamp -- a double). */ 2368 static PyObject * 2369 date_fromtimestamp(PyObject *cls, PyObject *args) 2370 { 2371 double timestamp; 2372 PyObject *result = NULL; 2373 2374 if (PyArg_ParseTuple(args, "d:fromtimestamp", ×tamp)) 2375 result = date_local_from_time_t(cls, timestamp); 2376 return result; 2377 } 2378 2379 /* Return new date from proleptic Gregorian ordinal. Raises ValueError if 2380 * the ordinal is out of range. 2381 */ 2382 static PyObject * 2383 date_fromordinal(PyObject *cls, PyObject *args) 2384 { 2385 PyObject *result = NULL; 2386 int ordinal; 2387 2388 if (PyArg_ParseTuple(args, "i:fromordinal", &ordinal)) { 2389 int year; 2390 int month; 2391 int day; 2392 2393 if (ordinal < 1) 2394 PyErr_SetString(PyExc_ValueError, "ordinal must be " 2395 ">= 1"); 2396 else { 2397 ord_to_ymd(ordinal, &year, &month, &day); 2398 result = PyObject_CallFunction(cls, "iii", 2399 year, month, day); 2400 } 2401 } 2402 return result; 2403 } 2404 2405 /* 2406 * Date arithmetic. 2407 */ 2408 2409 /* date + timedelta -> date. If arg negate is true, subtract the timedelta 2410 * instead. 2411 */ 2412 static PyObject * 2413 add_date_timedelta(PyDateTime_Date *date, PyDateTime_Delta *delta, int negate) 2414 { 2415 PyObject *result = NULL; 2416 int year = GET_YEAR(date); 2417 int month = GET_MONTH(date); 2418 int deltadays = GET_TD_DAYS(delta); 2419 /* C-level overflow is impossible because |deltadays| < 1e9. */ 2420 int day = GET_DAY(date) + (negate ? -deltadays : deltadays); 2421 2422 if (normalize_date(&year, &month, &day) >= 0) 2423 result = new_date(year, month, day); 2424 return result; 2425 } 2426 2427 static PyObject * 2428 date_add(PyObject *left, PyObject *right) 2429 { 2430 if (PyDateTime_Check(left) || PyDateTime_Check(right)) { 2431 Py_INCREF(Py_NotImplemented); 2432 return Py_NotImplemented; 2433 } 2434 if (PyDate_Check(left)) { 2435 /* date + ??? */ 2436 if (PyDelta_Check(right)) 2437 /* date + delta */ 2438 return add_date_timedelta((PyDateTime_Date *) left, 2439 (PyDateTime_Delta *) right, 2440 0); 2441 } 2442 else { 2443 /* ??? + date 2444 * 'right' must be one of us, or we wouldn't have been called 2445 */ 2446 if (PyDelta_Check(left)) 2447 /* delta + date */ 2448 return add_date_timedelta((PyDateTime_Date *) right, 2449 (PyDateTime_Delta *) left, 2450 0); 2451 } 2452 Py_INCREF(Py_NotImplemented); 2453 return Py_NotImplemented; 2454 } 2455 2456 static PyObject * 2457 date_subtract(PyObject *left, PyObject *right) 2458 { 2459 if (PyDateTime_Check(left) || PyDateTime_Check(right)) { 2460 Py_INCREF(Py_NotImplemented); 2461 return Py_NotImplemented; 2462 } 2463 if (PyDate_Check(left)) { 2464 if (PyDate_Check(right)) { 2465 /* date - date */ 2466 int left_ord = ymd_to_ord(GET_YEAR(left), 2467 GET_MONTH(left), 2468 GET_DAY(left)); 2469 int right_ord = ymd_to_ord(GET_YEAR(right), 2470 GET_MONTH(right), 2471 GET_DAY(right)); 2472 return new_delta(left_ord - right_ord, 0, 0, 0); 2473 } 2474 if (PyDelta_Check(right)) { 2475 /* date - delta */ 2476 return add_date_timedelta((PyDateTime_Date *) left, 2477 (PyDateTime_Delta *) right, 2478 1); 2479 } 2480 } 2481 Py_INCREF(Py_NotImplemented); 2482 return Py_NotImplemented; 2483 } 2484 2485 2486 /* Various ways to turn a date into a string. */ 2487 2488 static PyObject * 2489 date_repr(PyDateTime_Date *self) 2490 { 2491 char buffer[1028]; 2492 const char *type_name; 2493 2494 type_name = Py_TYPE(self)->tp_name; 2495 PyOS_snprintf(buffer, sizeof(buffer), "%s(%d, %d, %d)", 2496 type_name, 2497 GET_YEAR(self), GET_MONTH(self), GET_DAY(self)); 2498 2499 return PyString_FromString(buffer); 2500 } 2501 2502 static PyObject * 2503 date_isoformat(PyDateTime_Date *self) 2504 { 2505 char buffer[128]; 2506 2507 isoformat_date(self, buffer, sizeof(buffer)); 2508 return PyString_FromString(buffer); 2509 } 2510 2511 /* str() calls the appropriate isoformat() method. */ 2512 static PyObject * 2513 date_str(PyDateTime_Date *self) 2514 { 2515 return PyObject_CallMethod((PyObject *)self, "isoformat", "()"); 2516 } 2517 2518 2519 static PyObject * 2520 date_ctime(PyDateTime_Date *self) 2521 { 2522 return format_ctime(self, 0, 0, 0); 2523 } 2524 2525 static PyObject * 2526 date_strftime(PyDateTime_Date *self, PyObject *args, PyObject *kw) 2527 { 2528 /* This method can be inherited, and needs to call the 2529 * timetuple() method appropriate to self's class. 2530 */ 2531 PyObject *result; 2532 PyObject *tuple; 2533 const char *format; 2534 Py_ssize_t format_len; 2535 static char *keywords[] = {"format", NULL}; 2536 2537 if (! PyArg_ParseTupleAndKeywords(args, kw, "s#:strftime", keywords, 2538 &format, &format_len)) 2539 return NULL; 2540 2541 tuple = PyObject_CallMethod((PyObject *)self, "timetuple", "()"); 2542 if (tuple == NULL) 2543 return NULL; 2544 result = wrap_strftime((PyObject *)self, format, format_len, tuple, 2545 (PyObject *)self); 2546 Py_DECREF(tuple); 2547 return result; 2548 } 2549 2550 static PyObject * 2551 date_format(PyDateTime_Date *self, PyObject *args) 2552 { 2553 PyObject *format; 2554 2555 if (!PyArg_ParseTuple(args, "O:__format__", &format)) 2556 return NULL; 2557 2558 /* Check for str or unicode */ 2559 if (PyString_Check(format)) { 2560 /* If format is zero length, return str(self) */ 2561 if (PyString_GET_SIZE(format) == 0) 2562 return PyObject_Str((PyObject *)self); 2563 } else if (PyUnicode_Check(format)) { 2564 /* If format is zero length, return str(self) */ 2565 if (PyUnicode_GET_SIZE(format) == 0) 2566 return PyObject_Unicode((PyObject *)self); 2567 } else { 2568 PyErr_Format(PyExc_ValueError, 2569 "__format__ expects str or unicode, not %.200s", 2570 Py_TYPE(format)->tp_name); 2571 return NULL; 2572 } 2573 return PyObject_CallMethod((PyObject *)self, "strftime", "O", format); 2574 } 2575 2576 /* ISO methods. */ 2577 2578 static PyObject * 2579 date_isoweekday(PyDateTime_Date *self) 2580 { 2581 int dow = weekday(GET_YEAR(self), GET_MONTH(self), GET_DAY(self)); 2582 2583 return PyInt_FromLong(dow + 1); 2584 } 2585 2586 static PyObject * 2587 date_isocalendar(PyDateTime_Date *self) 2588 { 2589 int year = GET_YEAR(self); 2590 int week1_monday = iso_week1_monday(year); 2591 int today = ymd_to_ord(year, GET_MONTH(self), GET_DAY(self)); 2592 int week; 2593 int day; 2594 2595 week = divmod(today - week1_monday, 7, &day); 2596 if (week < 0) { 2597 --year; 2598 week1_monday = iso_week1_monday(year); 2599 week = divmod(today - week1_monday, 7, &day); 2600 } 2601 else if (week >= 52 && today >= iso_week1_monday(year + 1)) { 2602 ++year; 2603 week = 0; 2604 } 2605 return Py_BuildValue("iii", year, week + 1, day + 1); 2606 } 2607 2608 /* Miscellaneous methods. */ 2609 2610 /* This is more natural as a tp_compare, but doesn't work then: for whatever 2611 * reason, Python's try_3way_compare ignores tp_compare unless 2612 * PyInstance_Check returns true, but these aren't old-style classes. 2613 */ 2614 static PyObject * 2615 date_richcompare(PyDateTime_Date *self, PyObject *other, int op) 2616 { 2617 int diff = 42; /* nonsense */ 2618 2619 if (PyDate_Check(other)) 2620 diff = memcmp(self->data, ((PyDateTime_Date *)other)->data, 2621 _PyDateTime_DATE_DATASIZE); 2622 2623 else if (PyObject_HasAttrString(other, "timetuple")) { 2624 /* A hook for other kinds of date objects. */ 2625 Py_INCREF(Py_NotImplemented); 2626 return Py_NotImplemented; 2627 } 2628 else if (op == Py_EQ || op == Py_NE) 2629 diff = 1; /* any non-zero value will do */ 2630 2631 else /* stop this from falling back to address comparison */ 2632 return cmperror((PyObject *)self, other); 2633 2634 return diff_to_bool(diff, op); 2635 } 2636 2637 static PyObject * 2638 date_timetuple(PyDateTime_Date *self) 2639 { 2640 return build_struct_time(GET_YEAR(self), 2641 GET_MONTH(self), 2642 GET_DAY(self), 2643 0, 0, 0, -1); 2644 } 2645 2646 static PyObject * 2647 date_replace(PyDateTime_Date *self, PyObject *args, PyObject *kw) 2648 { 2649 PyObject *clone; 2650 PyObject *tuple; 2651 int year = GET_YEAR(self); 2652 int month = GET_MONTH(self); 2653 int day = GET_DAY(self); 2654 2655 if (! PyArg_ParseTupleAndKeywords(args, kw, "|iii:replace", date_kws, 2656 &year, &month, &day)) 2657 return NULL; 2658 tuple = Py_BuildValue("iii", year, month, day); 2659 if (tuple == NULL) 2660 return NULL; 2661 clone = date_new(Py_TYPE(self), tuple, NULL); 2662 Py_DECREF(tuple); 2663 return clone; 2664 } 2665 2666 static PyObject *date_getstate(PyDateTime_Date *self); 2667 2668 static long 2669 date_hash(PyDateTime_Date *self) 2670 { 2671 if (self->hashcode == -1) { 2672 PyObject *temp = date_getstate(self); 2673 if (temp != NULL) { 2674 self->hashcode = PyObject_Hash(temp); 2675 Py_DECREF(temp); 2676 } 2677 } 2678 return self->hashcode; 2679 } 2680 2681 static PyObject * 2682 date_toordinal(PyDateTime_Date *self) 2683 { 2684 return PyInt_FromLong(ymd_to_ord(GET_YEAR(self), GET_MONTH(self), 2685 GET_DAY(self))); 2686 } 2687 2688 static PyObject * 2689 date_weekday(PyDateTime_Date *self) 2690 { 2691 int dow = weekday(GET_YEAR(self), GET_MONTH(self), GET_DAY(self)); 2692 2693 return PyInt_FromLong(dow); 2694 } 2695 2696 /* Pickle support, a simple use of __reduce__. */ 2697 2698 /* __getstate__ isn't exposed */ 2699 static PyObject * 2700 date_getstate(PyDateTime_Date *self) 2701 { 2702 return Py_BuildValue( 2703 "(N)", 2704 PyString_FromStringAndSize((char *)self->data, 2705 _PyDateTime_DATE_DATASIZE)); 2706 } 2707 2708 static PyObject * 2709 date_reduce(PyDateTime_Date *self, PyObject *arg) 2710 { 2711 return Py_BuildValue("(ON)", Py_TYPE(self), date_getstate(self)); 2712 } 2713 2714 static PyMethodDef date_methods[] = { 2715 2716 /* Class methods: */ 2717 2718 {"fromtimestamp", (PyCFunction)date_fromtimestamp, METH_VARARGS | 2719 METH_CLASS, 2720 PyDoc_STR("timestamp -> local date from a POSIX timestamp (like " 2721 "time.time()).")}, 2722 2723 {"fromordinal", (PyCFunction)date_fromordinal, METH_VARARGS | 2724 METH_CLASS, 2725 PyDoc_STR("int -> date corresponding to a proleptic Gregorian " 2726 "ordinal.")}, 2727 2728 {"today", (PyCFunction)date_today, METH_NOARGS | METH_CLASS, 2729 PyDoc_STR("Current date or datetime: same as " 2730 "self.__class__.fromtimestamp(time.time()).")}, 2731 2732 /* Instance methods: */ 2733 2734 {"ctime", (PyCFunction)date_ctime, METH_NOARGS, 2735 PyDoc_STR("Return ctime() style string.")}, 2736 2737 {"strftime", (PyCFunction)date_strftime, METH_VARARGS | METH_KEYWORDS, 2738 PyDoc_STR("format -> strftime() style string.")}, 2739 2740 {"__format__", (PyCFunction)date_format, METH_VARARGS, 2741 PyDoc_STR("Formats self with strftime.")}, 2742 2743 {"timetuple", (PyCFunction)date_timetuple, METH_NOARGS, 2744 PyDoc_STR("Return time tuple, compatible with time.localtime().")}, 2745 2746 {"isocalendar", (PyCFunction)date_isocalendar, METH_NOARGS, 2747 PyDoc_STR("Return a 3-tuple containing ISO year, week number, and " 2748 "weekday.")}, 2749 2750 {"isoformat", (PyCFunction)date_isoformat, METH_NOARGS, 2751 PyDoc_STR("Return string in ISO 8601 format, YYYY-MM-DD.")}, 2752 2753 {"isoweekday", (PyCFunction)date_isoweekday, METH_NOARGS, 2754 PyDoc_STR("Return the day of the week represented by the date.\n" 2755 "Monday == 1 ... Sunday == 7")}, 2756 2757 {"toordinal", (PyCFunction)date_toordinal, METH_NOARGS, 2758 PyDoc_STR("Return proleptic Gregorian ordinal. January 1 of year " 2759 "1 is day 1.")}, 2760 2761 {"weekday", (PyCFunction)date_weekday, METH_NOARGS, 2762 PyDoc_STR("Return the day of the week represented by the date.\n" 2763 "Monday == 0 ... Sunday == 6")}, 2764 2765 {"replace", (PyCFunction)date_replace, METH_VARARGS | METH_KEYWORDS, 2766 PyDoc_STR("Return date with new specified fields.")}, 2767 2768 {"__reduce__", (PyCFunction)date_reduce, METH_NOARGS, 2769 PyDoc_STR("__reduce__() -> (cls, state)")}, 2770 2771 {NULL, NULL} 2772 }; 2773 2774 static char date_doc[] = 2775 PyDoc_STR("date(year, month, day) --> date object"); 2776 2777 static PyNumberMethods date_as_number = { 2778 date_add, /* nb_add */ 2779 date_subtract, /* nb_subtract */ 2780 0, /* nb_multiply */ 2781 0, /* nb_divide */ 2782 0, /* nb_remainder */ 2783 0, /* nb_divmod */ 2784 0, /* nb_power */ 2785 0, /* nb_negative */ 2786 0, /* nb_positive */ 2787 0, /* nb_absolute */ 2788 0, /* nb_nonzero */ 2789 }; 2790 2791 static PyTypeObject PyDateTime_DateType = { 2792 PyVarObject_HEAD_INIT(NULL, 0) 2793 "datetime.date", /* tp_name */ 2794 sizeof(PyDateTime_Date), /* tp_basicsize */ 2795 0, /* tp_itemsize */ 2796 0, /* tp_dealloc */ 2797 0, /* tp_print */ 2798 0, /* tp_getattr */ 2799 0, /* tp_setattr */ 2800 0, /* tp_compare */ 2801 (reprfunc)date_repr, /* tp_repr */ 2802 &date_as_number, /* tp_as_number */ 2803 0, /* tp_as_sequence */ 2804 0, /* tp_as_mapping */ 2805 (hashfunc)date_hash, /* tp_hash */ 2806 0, /* tp_call */ 2807 (reprfunc)date_str, /* tp_str */ 2808 PyObject_GenericGetAttr, /* tp_getattro */ 2809 0, /* tp_setattro */ 2810 0, /* tp_as_buffer */ 2811 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | 2812 Py_TPFLAGS_BASETYPE, /* tp_flags */ 2813 date_doc, /* tp_doc */ 2814 0, /* tp_traverse */ 2815 0, /* tp_clear */ 2816 (richcmpfunc)date_richcompare, /* tp_richcompare */ 2817 0, /* tp_weaklistoffset */ 2818 0, /* tp_iter */ 2819 0, /* tp_iternext */ 2820 date_methods, /* tp_methods */ 2821 0, /* tp_members */ 2822 date_getset, /* tp_getset */ 2823 0, /* tp_base */ 2824 0, /* tp_dict */ 2825 0, /* tp_descr_get */ 2826 0, /* tp_descr_set */ 2827 0, /* tp_dictoffset */ 2828 0, /* tp_init */ 2829 0, /* tp_alloc */ 2830 date_new, /* tp_new */ 2831 0, /* tp_free */ 2832 }; 2833 2834 /* 2835 * PyDateTime_TZInfo implementation. 2836 */ 2837 2838 /* This is a pure abstract base class, so doesn't do anything beyond 2839 * raising NotImplemented exceptions. Real tzinfo classes need 2840 * to derive from this. This is mostly for clarity, and for efficiency in 2841 * datetime and time constructors (their tzinfo arguments need to 2842 * be subclasses of this tzinfo class, which is easy and quick to check). 2843 * 2844 * Note: For reasons having to do with pickling of subclasses, we have 2845 * to allow tzinfo objects to be instantiated. This wasn't an issue 2846 * in the Python implementation (__init__() could raise NotImplementedError 2847 * there without ill effect), but doing so in the C implementation hit a 2848 * brick wall. 2849 */ 2850 2851 static PyObject * 2852 tzinfo_nogo(const char* methodname) 2853 { 2854 PyErr_Format(PyExc_NotImplementedError, 2855 "a tzinfo subclass must implement %s()", 2856 methodname); 2857 return NULL; 2858 } 2859 2860 /* Methods. A subclass must implement these. */ 2861 2862 static PyObject * 2863 tzinfo_tzname(PyDateTime_TZInfo *self, PyObject *dt) 2864 { 2865 return tzinfo_nogo("tzname"); 2866 } 2867 2868 static PyObject * 2869 tzinfo_utcoffset(PyDateTime_TZInfo *self, PyObject *dt) 2870 { 2871 return tzinfo_nogo("utcoffset"); 2872 } 2873 2874 static PyObject * 2875 tzinfo_dst(PyDateTime_TZInfo *self, PyObject *dt) 2876 { 2877 return tzinfo_nogo("dst"); 2878 } 2879 2880 static PyObject * 2881 tzinfo_fromutc(PyDateTime_TZInfo *self, PyDateTime_DateTime *dt) 2882 { 2883 int y, m, d, hh, mm, ss, us; 2884 2885 PyObject *result; 2886 int off, dst; 2887 int none; 2888 int delta; 2889 2890 if (! PyDateTime_Check(dt)) { 2891 PyErr_SetString(PyExc_TypeError, 2892 "fromutc: argument must be a datetime"); 2893 return NULL; 2894 } 2895 if (! HASTZINFO(dt) || dt->tzinfo != (PyObject *)self) { 2896 PyErr_SetString(PyExc_ValueError, "fromutc: dt.tzinfo " 2897 "is not self"); 2898 return NULL; 2899 } 2900 2901 off = call_utcoffset(dt->tzinfo, (PyObject *)dt, &none); 2902 if (off == -1 && PyErr_Occurred()) 2903 return NULL; 2904 if (none) { 2905 PyErr_SetString(PyExc_ValueError, "fromutc: non-None " 2906 "utcoffset() result required"); 2907 return NULL; 2908 } 2909 2910 dst = call_dst(dt->tzinfo, (PyObject *)dt, &none); 2911 if (dst == -1 && PyErr_Occurred()) 2912 return NULL; 2913 if (none) { 2914 PyErr_SetString(PyExc_ValueError, "fromutc: non-None " 2915 "dst() result required"); 2916 return NULL; 2917 } 2918 2919 y = GET_YEAR(dt); 2920 m = GET_MONTH(dt); 2921 d = GET_DAY(dt); 2922 hh = DATE_GET_HOUR(dt); 2923 mm = DATE_GET_MINUTE(dt); 2924 ss = DATE_GET_SECOND(dt); 2925 us = DATE_GET_MICROSECOND(dt); 2926 2927 delta = off - dst; 2928 mm += delta; 2929 if ((mm < 0 || mm >= 60) && 2930 normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us) < 0) 2931 return NULL; 2932 result = new_datetime(y, m, d, hh, mm, ss, us, dt->tzinfo); 2933 if (result == NULL) 2934 return result; 2935 2936 dst = call_dst(dt->tzinfo, result, &none); 2937 if (dst == -1 && PyErr_Occurred()) 2938 goto Fail; 2939 if (none) 2940 goto Inconsistent; 2941 if (dst == 0) 2942 return result; 2943 2944 mm += dst; 2945 if ((mm < 0 || mm >= 60) && 2946 normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us) < 0) 2947 goto Fail; 2948 Py_DECREF(result); 2949 result = new_datetime(y, m, d, hh, mm, ss, us, dt->tzinfo); 2950 return result; 2951 2952 Inconsistent: 2953 PyErr_SetString(PyExc_ValueError, "fromutc: tz.dst() gave" 2954 "inconsistent results; cannot convert"); 2955 2956 /* fall thru to failure */ 2957 Fail: 2958 Py_DECREF(result); 2959 return NULL; 2960 } 2961 2962 /* 2963 * Pickle support. This is solely so that tzinfo subclasses can use 2964 * pickling -- tzinfo itself is supposed to be uninstantiable. 2965 */ 2966 2967 static PyObject * 2968 tzinfo_reduce(PyObject *self) 2969 { 2970 PyObject *args, *state, *tmp; 2971 PyObject *getinitargs, *getstate; 2972 2973 tmp = PyTuple_New(0); 2974 if (tmp == NULL) 2975 return NULL; 2976 2977 getinitargs = PyObject_GetAttrString(self, "__getinitargs__"); 2978 if (getinitargs != NULL) { 2979 args = PyObject_CallObject(getinitargs, tmp); 2980 Py_DECREF(getinitargs); 2981 if (args == NULL) { 2982 Py_DECREF(tmp); 2983 return NULL; 2984 } 2985 } 2986 else { 2987 PyErr_Clear(); 2988 args = tmp; 2989 Py_INCREF(args); 2990 } 2991 2992 getstate = PyObject_GetAttrString(self, "__getstate__"); 2993 if (getstate != NULL) { 2994 state = PyObject_CallObject(getstate, tmp); 2995 Py_DECREF(getstate); 2996 if (state == NULL) { 2997 Py_DECREF(args); 2998 Py_DECREF(tmp); 2999 return NULL; 3000 } 3001 } 3002 else { 3003 PyObject **dictptr; 3004 PyErr_Clear(); 3005 state = Py_None; 3006 dictptr = _PyObject_GetDictPtr(self); 3007 if (dictptr && *dictptr && PyDict_Size(*dictptr)) 3008 state = *dictptr; 3009 Py_INCREF(state); 3010 } 3011 3012 Py_DECREF(tmp); 3013 3014 if (state == Py_None) { 3015 Py_DECREF(state); 3016 return Py_BuildValue("(ON)", Py_TYPE(self), args); 3017 } 3018 else 3019 return Py_BuildValue("(ONN)", Py_TYPE(self), args, state); 3020 } 3021 3022 static PyMethodDef tzinfo_methods[] = { 3023 3024 {"tzname", (PyCFunction)tzinfo_tzname, METH_O, 3025 PyDoc_STR("datetime -> string name of time zone.")}, 3026 3027 {"utcoffset", (PyCFunction)tzinfo_utcoffset, METH_O, 3028 PyDoc_STR("datetime -> minutes east of UTC (negative for " 3029 "west of UTC).")}, 3030 3031 {"dst", (PyCFunction)tzinfo_dst, METH_O, 3032 PyDoc_STR("datetime -> DST offset in minutes east of UTC.")}, 3033 3034 {"fromutc", (PyCFunction)tzinfo_fromutc, METH_O, 3035 PyDoc_STR("datetime in UTC -> datetime in local time.")}, 3036 3037 {"__reduce__", (PyCFunction)tzinfo_reduce, METH_NOARGS, 3038 PyDoc_STR("-> (cls, state)")}, 3039 3040 {NULL, NULL} 3041 }; 3042 3043 static char tzinfo_doc[] = 3044 PyDoc_STR("Abstract base class for time zone info objects."); 3045 3046 statichere PyTypeObject PyDateTime_TZInfoType = { 3047 PyVarObject_HEAD_INIT(NULL, 0) 3048 "datetime.tzinfo", /* tp_name */ 3049 sizeof(PyDateTime_TZInfo), /* tp_basicsize */ 3050 0, /* tp_itemsize */ 3051 0, /* tp_dealloc */ 3052 0, /* tp_print */ 3053 0, /* tp_getattr */ 3054 0, /* tp_setattr */ 3055 0, /* tp_compare */ 3056 0, /* tp_repr */ 3057 0, /* tp_as_number */ 3058 0, /* tp_as_sequence */ 3059 0, /* tp_as_mapping */ 3060 0, /* tp_hash */ 3061 0, /* tp_call */ 3062 0, /* tp_str */ 3063 PyObject_GenericGetAttr, /* tp_getattro */ 3064 0, /* tp_setattro */ 3065 0, /* tp_as_buffer */ 3066 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | 3067 Py_TPFLAGS_BASETYPE, /* tp_flags */ 3068 tzinfo_doc, /* tp_doc */ 3069 0, /* tp_traverse */ 3070 0, /* tp_clear */ 3071 0, /* tp_richcompare */ 3072 0, /* tp_weaklistoffset */ 3073 0, /* tp_iter */ 3074 0, /* tp_iternext */ 3075 tzinfo_methods, /* tp_methods */ 3076 0, /* tp_members */ 3077 0, /* tp_getset */ 3078 0, /* tp_base */ 3079 0, /* tp_dict */ 3080 0, /* tp_descr_get */ 3081 0, /* tp_descr_set */ 3082 0, /* tp_dictoffset */ 3083 0, /* tp_init */ 3084 0, /* tp_alloc */ 3085 PyType_GenericNew, /* tp_new */ 3086 0, /* tp_free */ 3087 }; 3088 3089 /* 3090 * PyDateTime_Time implementation. 3091 */ 3092 3093 /* Accessor properties. 3094 */ 3095 3096 static PyObject * 3097 time_hour(PyDateTime_Time *self, void *unused) 3098 { 3099 return PyInt_FromLong(TIME_GET_HOUR(self)); 3100 } 3101 3102 static PyObject * 3103 time_minute(PyDateTime_Time *self, void *unused) 3104 { 3105 return PyInt_FromLong(TIME_GET_MINUTE(self)); 3106 } 3107 3108 /* The name time_second conflicted with some platform header file. */ 3109 static PyObject * 3110 py_time_second(PyDateTime_Time *self, void *unused) 3111 { 3112 return PyInt_FromLong(TIME_GET_SECOND(self)); 3113 } 3114 3115 static PyObject * 3116 time_microsecond(PyDateTime_Time *self, void *unused) 3117 { 3118 return PyInt_FromLong(TIME_GET_MICROSECOND(self)); 3119 } 3120 3121 static PyObject * 3122 time_tzinfo(PyDateTime_Time *self, void *unused) 3123 { 3124 PyObject *result = HASTZINFO(self) ? self->tzinfo : Py_None; 3125 Py_INCREF(result); 3126 return result; 3127 } 3128 3129 static PyGetSetDef time_getset[] = { 3130 {"hour", (getter)time_hour}, 3131 {"minute", (getter)time_minute}, 3132 {"second", (getter)py_time_second}, 3133 {"microsecond", (getter)time_microsecond}, 3134 {"tzinfo", (getter)time_tzinfo}, 3135 {NULL} 3136 }; 3137 3138 /* 3139 * Constructors. 3140 */ 3141 3142 static char *time_kws[] = {"hour", "minute", "second", "microsecond", 3143 "tzinfo", NULL}; 3144 3145 static PyObject * 3146 time_new(PyTypeObject *type, PyObject *args, PyObject *kw) 3147 { 3148 PyObject *self = NULL; 3149 PyObject *state; 3150 int hour = 0; 3151 int minute = 0; 3152 int second = 0; 3153 int usecond = 0; 3154 PyObject *tzinfo = Py_None; 3155 3156 /* Check for invocation from pickle with __getstate__ state */ 3157 if (PyTuple_GET_SIZE(args) >= 1 && 3158 PyTuple_GET_SIZE(args) <= 2 && 3159 PyString_Check(state = PyTuple_GET_ITEM(args, 0)) && 3160 PyString_GET_SIZE(state) == _PyDateTime_TIME_DATASIZE && 3161 ((unsigned char) (PyString_AS_STRING(state)[0])) < 24) 3162 { 3163 PyDateTime_Time *me; 3164 char aware; 3165 3166 if (PyTuple_GET_SIZE(args) == 2) { 3167 tzinfo = PyTuple_GET_ITEM(args, 1); 3168 if (check_tzinfo_subclass(tzinfo) < 0) { 3169 PyErr_SetString(PyExc_TypeError, "bad " 3170 "tzinfo state arg"); 3171 return NULL; 3172 } 3173 } 3174 aware = (char)(tzinfo != Py_None); 3175 me = (PyDateTime_Time *) (type->tp_alloc(type, aware)); 3176 if (me != NULL) { 3177 char *pdata = PyString_AS_STRING(state); 3178 3179 memcpy(me->data, pdata, _PyDateTime_TIME_DATASIZE); 3180 me->hashcode = -1; 3181 me->hastzinfo = aware; 3182 if (aware) { 3183 Py_INCREF(tzinfo); 3184 me->tzinfo = tzinfo; 3185 } 3186 } 3187 return (PyObject *)me; 3188 } 3189 3190 if (PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO", time_kws, 3191 &hour, &minute, &second, &usecond, 3192 &tzinfo)) { 3193 if (check_time_args(hour, minute, second, usecond) < 0) 3194 return NULL; 3195 if (check_tzinfo_subclass(tzinfo) < 0) 3196 return NULL; 3197 self = new_time_ex(hour, minute, second, usecond, tzinfo, 3198 type); 3199 } 3200 return self; 3201 } 3202 3203 /* 3204 * Destructor. 3205 */ 3206 3207 static void 3208 time_dealloc(PyDateTime_Time *self) 3209 { 3210 if (HASTZINFO(self)) { 3211 Py_XDECREF(self->tzinfo); 3212 } 3213 Py_TYPE(self)->tp_free((PyObject *)self); 3214 } 3215 3216 /* 3217 * Indirect access to tzinfo methods. 3218 */ 3219 3220 /* These are all METH_NOARGS, so don't need to check the arglist. */ 3221 static PyObject * 3222 time_utcoffset(PyDateTime_Time *self, PyObject *unused) { 3223 return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None, 3224 "utcoffset", Py_None); 3225 } 3226 3227 static PyObject * 3228 time_dst(PyDateTime_Time *self, PyObject *unused) { 3229 return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None, 3230 "dst", Py_None); 3231 } 3232 3233 static PyObject * 3234 time_tzname(PyDateTime_Time *self, PyObject *unused) { 3235 return call_tzname(HASTZINFO(self) ? self->tzinfo : Py_None, 3236 Py_None); 3237 } 3238 3239 /* 3240 * Various ways to turn a time into a string. 3241 */ 3242 3243 static PyObject * 3244 time_repr(PyDateTime_Time *self) 3245 { 3246 char buffer[100]; 3247 const char *type_name = Py_TYPE(self)->tp_name; 3248 int h = TIME_GET_HOUR(self); 3249 int m = TIME_GET_MINUTE(self); 3250 int s = TIME_GET_SECOND(self); 3251 int us = TIME_GET_MICROSECOND(self); 3252 PyObject *result = NULL; 3253 3254 if (us) 3255 PyOS_snprintf(buffer, sizeof(buffer), 3256 "%s(%d, %d, %d, %d)", type_name, h, m, s, us); 3257 else if (s) 3258 PyOS_snprintf(buffer, sizeof(buffer), 3259 "%s(%d, %d, %d)", type_name, h, m, s); 3260 else 3261 PyOS_snprintf(buffer, sizeof(buffer), 3262 "%s(%d, %d)", type_name, h, m); 3263 result = PyString_FromString(buffer); 3264 if (result != NULL && HASTZINFO(self)) 3265 result = append_keyword_tzinfo(result, self->tzinfo); 3266 return result; 3267 } 3268 3269 static PyObject * 3270 time_str(PyDateTime_Time *self) 3271 { 3272 return PyObject_CallMethod((PyObject *)self, "isoformat", "()"); 3273 } 3274 3275 static PyObject * 3276 time_isoformat(PyDateTime_Time *self, PyObject *unused) 3277 { 3278 char buf[100]; 3279 PyObject *result; 3280 /* Reuse the time format code from the datetime type. */ 3281 PyDateTime_DateTime datetime; 3282 PyDateTime_DateTime *pdatetime = &datetime; 3283 3284 /* Copy over just the time bytes. */ 3285 memcpy(pdatetime->data + _PyDateTime_DATE_DATASIZE, 3286 self->data, 3287 _PyDateTime_TIME_DATASIZE); 3288 3289 isoformat_time(pdatetime, buf, sizeof(buf)); 3290 result = PyString_FromString(buf); 3291 if (result == NULL || ! HASTZINFO(self) || self->tzinfo == Py_None) 3292 return result; 3293 3294 /* We need to append the UTC offset. */ 3295 if (format_utcoffset(buf, sizeof(buf), ":", self->tzinfo, 3296 Py_None) < 0) { 3297 Py_DECREF(result); 3298 return NULL; 3299 } 3300 PyString_ConcatAndDel(&result, PyString_FromString(buf)); 3301 return result; 3302 } 3303 3304 static PyObject * 3305 time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw) 3306 { 3307 PyObject *result; 3308 PyObject *tuple; 3309 const char *format; 3310 Py_ssize_t format_len; 3311 static char *keywords[] = {"format", NULL}; 3312 3313 if (! PyArg_ParseTupleAndKeywords(args, kw, "s#:strftime", keywords, 3314 &format, &format_len)) 3315 return NULL; 3316 3317 /* Python's strftime does insane things with the year part of the 3318 * timetuple. The year is forced to (the otherwise nonsensical) 3319 * 1900 to worm around that. 3320 */ 3321 tuple = Py_BuildValue("iiiiiiiii", 3322 1900, 1, 1, /* year, month, day */ 3323 TIME_GET_HOUR(self), 3324 TIME_GET_MINUTE(self), 3325 TIME_GET_SECOND(self), 3326 0, 1, -1); /* weekday, daynum, dst */ 3327 if (tuple == NULL) 3328 return NULL; 3329 assert(PyTuple_Size(tuple) == 9); 3330 result = wrap_strftime((PyObject *)self, format, format_len, tuple, 3331 Py_None); 3332 Py_DECREF(tuple); 3333 return result; 3334 } 3335 3336 /* 3337 * Miscellaneous methods. 3338 */ 3339 3340 /* This is more natural as a tp_compare, but doesn't work then: for whatever 3341 * reason, Python's try_3way_compare ignores tp_compare unless 3342 * PyInstance_Check returns true, but these aren't old-style classes. 3343 */ 3344 static PyObject * 3345 time_richcompare(PyDateTime_Time *self, PyObject *other, int op) 3346 { 3347 int diff; 3348 naivety n1, n2; 3349 int offset1, offset2; 3350 3351 if (! PyTime_Check(other)) { 3352 if (op == Py_EQ || op == Py_NE) { 3353 PyObject *result = op == Py_EQ ? Py_False : Py_True; 3354 Py_INCREF(result); 3355 return result; 3356 } 3357 /* Stop this from falling back to address comparison. */ 3358 return cmperror((PyObject *)self, other); 3359 } 3360 if (classify_two_utcoffsets((PyObject *)self, &offset1, &n1, Py_None, 3361 other, &offset2, &n2, Py_None) < 0) 3362 return NULL; 3363 assert(n1 != OFFSET_UNKNOWN && n2 != OFFSET_UNKNOWN); 3364 /* If they're both naive, or both aware and have the same offsets, 3365 * we get off cheap. Note that if they're both naive, offset1 == 3366 * offset2 == 0 at this point. 3367 */ 3368 if (n1 == n2 && offset1 == offset2) { 3369 diff = memcmp(self->data, ((PyDateTime_Time *)other)->data, 3370 _PyDateTime_TIME_DATASIZE); 3371 return diff_to_bool(diff, op); 3372 } 3373 3374 if (n1 == OFFSET_AWARE && n2 == OFFSET_AWARE) { 3375 assert(offset1 != offset2); /* else last "if" handled it */ 3376 /* Convert everything except microseconds to seconds. These 3377 * can't overflow (no more than the # of seconds in 2 days). 3378 */ 3379 offset1 = TIME_GET_HOUR(self) * 3600 + 3380 (TIME_GET_MINUTE(self) - offset1) * 60 + 3381 TIME_GET_SECOND(self); 3382 offset2 = TIME_GET_HOUR(other) * 3600 + 3383 (TIME_GET_MINUTE(other) - offset2) * 60 + 3384 TIME_GET_SECOND(other); 3385 diff = offset1 - offset2; 3386 if (diff == 0) 3387 diff = TIME_GET_MICROSECOND(self) - 3388 TIME_GET_MICROSECOND(other); 3389 return diff_to_bool(diff, op); 3390 } 3391 3392 assert(n1 != n2); 3393 PyErr_SetString(PyExc_TypeError, 3394 "can't compare offset-naive and " 3395 "offset-aware times"); 3396 return NULL; 3397 } 3398 3399 static long 3400 time_hash(PyDateTime_Time *self) 3401 { 3402 if (self->hashcode == -1) { 3403 naivety n; 3404 int offset; 3405 PyObject *temp; 3406 3407 n = classify_utcoffset((PyObject *)self, Py_None, &offset); 3408 assert(n != OFFSET_UNKNOWN); 3409 if (n == OFFSET_ERROR) 3410 return -1; 3411 3412 /* Reduce this to a hash of another object. */ 3413 if (offset == 0) 3414 temp = PyString_FromStringAndSize((char *)self->data, 3415 _PyDateTime_TIME_DATASIZE); 3416 else { 3417 int hour; 3418 int minute; 3419 3420 assert(n == OFFSET_AWARE); 3421 assert(HASTZINFO(self)); 3422 hour = divmod(TIME_GET_HOUR(self) * 60 + 3423 TIME_GET_MINUTE(self) - offset, 3424 60, 3425 &minute); 3426 if (0 <= hour && hour < 24) 3427 temp = new_time(hour, minute, 3428 TIME_GET_SECOND(self), 3429 TIME_GET_MICROSECOND(self), 3430 Py_None); 3431 else 3432 temp = Py_BuildValue("iiii", 3433 hour, minute, 3434 TIME_GET_SECOND(self), 3435 TIME_GET_MICROSECOND(self)); 3436 } 3437 if (temp != NULL) { 3438 self->hashcode = PyObject_Hash(temp); 3439 Py_DECREF(temp); 3440 } 3441 } 3442 return self->hashcode; 3443 } 3444 3445 static PyObject * 3446 time_replace(PyDateTime_Time *self, PyObject *args, PyObject *kw) 3447 { 3448 PyObject *clone; 3449 PyObject *tuple; 3450 int hh = TIME_GET_HOUR(self); 3451 int mm = TIME_GET_MINUTE(self); 3452 int ss = TIME_GET_SECOND(self); 3453 int us = TIME_GET_MICROSECOND(self); 3454 PyObject *tzinfo = HASTZINFO(self) ? self->tzinfo : Py_None; 3455 3456 if (! PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO:replace", 3457 time_kws, 3458 &hh, &mm, &ss, &us, &tzinfo)) 3459 return NULL; 3460 tuple = Py_BuildValue("iiiiO", hh, mm, ss, us, tzinfo); 3461 if (tuple == NULL) 3462 return NULL; 3463 clone = time_new(Py_TYPE(self), tuple, NULL); 3464 Py_DECREF(tuple); 3465 return clone; 3466 } 3467 3468 static int 3469 time_nonzero(PyDateTime_Time *self) 3470 { 3471 int offset; 3472 int none; 3473 3474 if (TIME_GET_SECOND(self) || TIME_GET_MICROSECOND(self)) { 3475 /* Since utcoffset is in whole minutes, nothing can 3476 * alter the conclusion that this is nonzero. 3477 */ 3478 return 1; 3479 } 3480 offset = 0; 3481 if (HASTZINFO(self) && self->tzinfo != Py_None) { 3482 offset = call_utcoffset(self->tzinfo, Py_None, &none); 3483 if (offset == -1 && PyErr_Occurred()) 3484 return -1; 3485 } 3486 return (TIME_GET_MINUTE(self) - offset + TIME_GET_HOUR(self)*60) != 0; 3487 } 3488 3489 /* Pickle support, a simple use of __reduce__. */ 3490 3491 /* Let basestate be the non-tzinfo data string. 3492 * If tzinfo is None, this returns (basestate,), else (basestate, tzinfo). 3493 * So it's a tuple in any (non-error) case. 3494 * __getstate__ isn't exposed. 3495 */ 3496 static PyObject * 3497 time_getstate(PyDateTime_Time *self) 3498 { 3499 PyObject *basestate; 3500 PyObject *result = NULL; 3501 3502 basestate = PyString_FromStringAndSize((char *)self->data, 3503 _PyDateTime_TIME_DATASIZE); 3504 if (basestate != NULL) { 3505 if (! HASTZINFO(self) || self->tzinfo == Py_None) 3506 result = PyTuple_Pack(1, basestate); 3507 else 3508 result = PyTuple_Pack(2, basestate, self->tzinfo); 3509 Py_DECREF(basestate); 3510 } 3511 return result; 3512 } 3513 3514 static PyObject * 3515 time_reduce(PyDateTime_Time *self, PyObject *arg) 3516 { 3517 return Py_BuildValue("(ON)", Py_TYPE(self), time_getstate(self)); 3518 } 3519 3520 static PyMethodDef time_methods[] = { 3521 3522 {"isoformat", (PyCFunction)time_isoformat, METH_NOARGS, 3523 PyDoc_STR("Return string in ISO 8601 format, HH:MM:SS[.mmmmmm]" 3524 "[+HH:MM].")}, 3525 3526 {"strftime", (PyCFunction)time_strftime, METH_VARARGS | METH_KEYWORDS, 3527 PyDoc_STR("format -> strftime() style string.")}, 3528 3529 {"__format__", (PyCFunction)date_format, METH_VARARGS, 3530 PyDoc_STR("Formats self with strftime.")}, 3531 3532 {"utcoffset", (PyCFunction)time_utcoffset, METH_NOARGS, 3533 PyDoc_STR("Return self.tzinfo.utcoffset(self).")}, 3534 3535 {"tzname", (PyCFunction)time_tzname, METH_NOARGS, 3536 PyDoc_STR("Return self.tzinfo.tzname(self).")}, 3537 3538 {"dst", (PyCFunction)time_dst, METH_NOARGS, 3539 PyDoc_STR("Return self.tzinfo.dst(self).")}, 3540 3541 {"replace", (PyCFunction)time_replace, METH_VARARGS | METH_KEYWORDS, 3542 PyDoc_STR("Return time with new specified fields.")}, 3543 3544 {"__reduce__", (PyCFunction)time_reduce, METH_NOARGS, 3545 PyDoc_STR("__reduce__() -> (cls, state)")}, 3546 3547 {NULL, NULL} 3548 }; 3549 3550 static char time_doc[] = 3551 PyDoc_STR("time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\n\ 3552 \n\ 3553 All arguments are optional. tzinfo may be None, or an instance of\n\ 3554 a tzinfo subclass. The remaining arguments may be ints or longs.\n"); 3555 3556 static PyNumberMethods time_as_number = { 3557 0, /* nb_add */ 3558 0, /* nb_subtract */ 3559 0, /* nb_multiply */ 3560 0, /* nb_divide */ 3561 0, /* nb_remainder */ 3562 0, /* nb_divmod */ 3563 0, /* nb_power */ 3564 0, /* nb_negative */ 3565 0, /* nb_positive */ 3566 0, /* nb_absolute */ 3567 (inquiry)time_nonzero, /* nb_nonzero */ 3568 }; 3569 3570 statichere PyTypeObject PyDateTime_TimeType = { 3571 PyVarObject_HEAD_INIT(NULL, 0) 3572 "datetime.time", /* tp_name */ 3573 sizeof(PyDateTime_Time), /* tp_basicsize */ 3574 0, /* tp_itemsize */ 3575 (destructor)time_dealloc, /* tp_dealloc */ 3576 0, /* tp_print */ 3577 0, /* tp_getattr */ 3578 0, /* tp_setattr */ 3579 0, /* tp_compare */ 3580 (reprfunc)time_repr, /* tp_repr */ 3581 &time_as_number, /* tp_as_number */ 3582 0, /* tp_as_sequence */ 3583 0, /* tp_as_mapping */ 3584 (hashfunc)time_hash, /* tp_hash */ 3585 0, /* tp_call */ 3586 (reprfunc)time_str, /* tp_str */ 3587 PyObject_GenericGetAttr, /* tp_getattro */ 3588 0, /* tp_setattro */ 3589 0, /* tp_as_buffer */ 3590 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | 3591 Py_TPFLAGS_BASETYPE, /* tp_flags */ 3592 time_doc, /* tp_doc */ 3593 0, /* tp_traverse */ 3594 0, /* tp_clear */ 3595 (richcmpfunc)time_richcompare, /* tp_richcompare */ 3596 0, /* tp_weaklistoffset */ 3597 0, /* tp_iter */ 3598 0, /* tp_iternext */ 3599 time_methods, /* tp_methods */ 3600 0, /* tp_members */ 3601 time_getset, /* tp_getset */ 3602 0, /* tp_base */ 3603 0, /* tp_dict */ 3604 0, /* tp_descr_get */ 3605 0, /* tp_descr_set */ 3606 0, /* tp_dictoffset */ 3607 0, /* tp_init */ 3608 time_alloc, /* tp_alloc */ 3609 time_new, /* tp_new */ 3610 0, /* tp_free */ 3611 }; 3612 3613 /* 3614 * PyDateTime_DateTime implementation. 3615 */ 3616 3617 /* Accessor properties. Properties for day, month, and year are inherited 3618 * from date. 3619 */ 3620 3621 static PyObject * 3622 datetime_hour(PyDateTime_DateTime *self, void *unused) 3623 { 3624 return PyInt_FromLong(DATE_GET_HOUR(self)); 3625 } 3626 3627 static PyObject * 3628 datetime_minute(PyDateTime_DateTime *self, void *unused) 3629 { 3630 return PyInt_FromLong(DATE_GET_MINUTE(self)); 3631 } 3632 3633 static PyObject * 3634 datetime_second(PyDateTime_DateTime *self, void *unused) 3635 { 3636 return PyInt_FromLong(DATE_GET_SECOND(self)); 3637 } 3638 3639 static PyObject * 3640 datetime_microsecond(PyDateTime_DateTime *self, void *unused) 3641 { 3642 return PyInt_FromLong(DATE_GET_MICROSECOND(self)); 3643 } 3644 3645 static PyObject * 3646 datetime_tzinfo(PyDateTime_DateTime *self, void *unused) 3647 { 3648 PyObject *result = HASTZINFO(self) ? self->tzinfo : Py_None; 3649 Py_INCREF(result); 3650 return result; 3651 } 3652 3653 static PyGetSetDef datetime_getset[] = { 3654 {"hour", (getter)datetime_hour}, 3655 {"minute", (getter)datetime_minute}, 3656 {"second", (getter)datetime_second}, 3657 {"microsecond", (getter)datetime_microsecond}, 3658 {"tzinfo", (getter)datetime_tzinfo}, 3659 {NULL} 3660 }; 3661 3662 /* 3663 * Constructors. 3664 */ 3665 3666 static char *datetime_kws[] = { 3667 "year", "month", "day", "hour", "minute", "second", 3668 "microsecond", "tzinfo", NULL 3669 }; 3670 3671 static PyObject * 3672 datetime_new(PyTypeObject *type, PyObject *args, PyObject *kw) 3673 { 3674 PyObject *self = NULL; 3675 PyObject *state; 3676 int year; 3677 int month; 3678 int day; 3679 int hour = 0; 3680 int minute = 0; 3681 int second = 0; 3682 int usecond = 0; 3683 PyObject *tzinfo = Py_None; 3684 3685 /* Check for invocation from pickle with __getstate__ state */ 3686 if (PyTuple_GET_SIZE(args) >= 1 && 3687 PyTuple_GET_SIZE(args) <= 2 && 3688 PyString_Check(state = PyTuple_GET_ITEM(args, 0)) && 3689 PyString_GET_SIZE(state) == _PyDateTime_DATETIME_DATASIZE && 3690 MONTH_IS_SANE(PyString_AS_STRING(state)[2])) 3691 { 3692 PyDateTime_DateTime *me; 3693 char aware; 3694 3695 if (PyTuple_GET_SIZE(args) == 2) { 3696 tzinfo = PyTuple_GET_ITEM(args, 1); 3697 if (check_tzinfo_subclass(tzinfo) < 0) { 3698 PyErr_SetString(PyExc_TypeError, "bad " 3699 "tzinfo state arg"); 3700 return NULL; 3701 } 3702 } 3703 aware = (char)(tzinfo != Py_None); 3704 me = (PyDateTime_DateTime *) (type->tp_alloc(type , aware)); 3705 if (me != NULL) { 3706 char *pdata = PyString_AS_STRING(state); 3707 3708 memcpy(me->data, pdata, _PyDateTime_DATETIME_DATASIZE); 3709 me->hashcode = -1; 3710 me->hastzinfo = aware; 3711 if (aware) { 3712 Py_INCREF(tzinfo); 3713 me->tzinfo = tzinfo; 3714 } 3715 } 3716 return (PyObject *)me; 3717 } 3718 3719 if (PyArg_ParseTupleAndKeywords(args, kw, "iii|iiiiO", datetime_kws, 3720 &year, &month, &day, &hour, &minute, 3721 &second, &usecond, &tzinfo)) { 3722 if (check_date_args(year, month, day) < 0) 3723 return NULL; 3724 if (check_time_args(hour, minute, second, usecond) < 0) 3725 return NULL; 3726 if (check_tzinfo_subclass(tzinfo) < 0) 3727 return NULL; 3728 self = new_datetime_ex(year, month, day, 3729 hour, minute, second, usecond, 3730 tzinfo, type); 3731 } 3732 return self; 3733 } 3734 3735 /* TM_FUNC is the shared type of localtime() and gmtime(). */ 3736 typedef struct tm *(*TM_FUNC)(const time_t *timer); 3737 3738 /* Internal helper. 3739 * Build datetime from a time_t and a distinct count of microseconds. 3740 * Pass localtime or gmtime for f, to control the interpretation of timet. 3741 */ 3742 static PyObject * 3743 datetime_from_timet_and_us(PyObject *cls, TM_FUNC f, time_t timet, int us, 3744 PyObject *tzinfo) 3745 { 3746 struct tm *tm; 3747 PyObject *result = NULL; 3748 3749 tm = f(&timet); 3750 if (tm) { 3751 /* The platform localtime/gmtime may insert leap seconds, 3752 * indicated by tm->tm_sec > 59. We don't care about them, 3753 * except to the extent that passing them on to the datetime 3754 * constructor would raise ValueError for a reason that 3755 * made no sense to the user. 3756 */ 3757 if (tm->tm_sec > 59) 3758 tm->tm_sec = 59; 3759 result = PyObject_CallFunction(cls, "iiiiiiiO", 3760 tm->tm_year + 1900, 3761 tm->tm_mon + 1, 3762 tm->tm_mday, 3763 tm->tm_hour, 3764 tm->tm_min, 3765 tm->tm_sec, 3766 us, 3767 tzinfo); 3768 } 3769 else 3770 PyErr_SetString(PyExc_ValueError, 3771 "timestamp out of range for " 3772 "platform localtime()/gmtime() function"); 3773 return result; 3774 } 3775 3776 /* Internal helper. 3777 * Build datetime from a Python timestamp. Pass localtime or gmtime for f, 3778 * to control the interpretation of the timestamp. Since a double doesn't 3779 * have enough bits to cover a datetime's full range of precision, it's 3780 * better to call datetime_from_timet_and_us provided you have a way 3781 * to get that much precision (e.g., C time() isn't good enough). 3782 */ 3783 static PyObject * 3784 datetime_from_timestamp(PyObject *cls, TM_FUNC f, double timestamp, 3785 PyObject *tzinfo) 3786 { 3787 time_t timet; 3788 double fraction; 3789 int us; 3790 3791 timet = _PyTime_DoubleToTimet(timestamp); 3792 if (timet == (time_t)-1 && PyErr_Occurred()) 3793 return NULL; 3794 fraction = timestamp - (double)timet; 3795 us = (int)round_to_long(fraction * 1e6); 3796 if (us < 0) { 3797 /* Truncation towards zero is not what we wanted 3798 for negative numbers (Python's mod semantics) */ 3799 timet -= 1; 3800 us += 1000000; 3801 } 3802 /* If timestamp is less than one microsecond smaller than a 3803 * full second, round up. Otherwise, ValueErrors are raised 3804 * for some floats. */ 3805 if (us == 1000000) { 3806 timet += 1; 3807 us = 0; 3808 } 3809 return datetime_from_timet_and_us(cls, f, timet, us, tzinfo); 3810 } 3811 3812 /* Internal helper. 3813 * Build most accurate possible datetime for current time. Pass localtime or 3814 * gmtime for f as appropriate. 3815 */ 3816 static PyObject * 3817 datetime_best_possible(PyObject *cls, TM_FUNC f, PyObject *tzinfo) 3818 { 3819 #ifdef HAVE_GETTIMEOFDAY 3820 struct timeval t; 3821 3822 #ifdef GETTIMEOFDAY_NO_TZ 3823 gettimeofday(&t); 3824 #else 3825 gettimeofday(&t, (struct timezone *)NULL); 3826 #endif 3827 return datetime_from_timet_and_us(cls, f, t.tv_sec, (int)t.tv_usec, 3828 tzinfo); 3829 3830 #else /* ! HAVE_GETTIMEOFDAY */ 3831 /* No flavor of gettimeofday exists on this platform. Python's 3832 * time.time() does a lot of other platform tricks to get the 3833 * best time it can on the platform, and we're not going to do 3834 * better than that (if we could, the better code would belong 3835 * in time.time()!) We're limited by the precision of a double, 3836 * though. 3837 */ 3838 PyObject *time; 3839 double dtime; 3840 3841 time = time_time(); 3842 if (time == NULL) 3843 return NULL; 3844 dtime = PyFloat_AsDouble(time); 3845 Py_DECREF(time); 3846 if (dtime == -1.0 && PyErr_Occurred()) 3847 return NULL; 3848 return datetime_from_timestamp(cls, f, dtime, tzinfo); 3849 #endif /* ! HAVE_GETTIMEOFDAY */ 3850 } 3851 3852 /* Return best possible local time -- this isn't constrained by the 3853 * precision of a timestamp. 3854 */ 3855 static PyObject * 3856 datetime_now(PyObject *cls, PyObject *args, PyObject *kw) 3857 { 3858 PyObject *self; 3859 PyObject *tzinfo = Py_None; 3860 static char *keywords[] = {"tz", NULL}; 3861 3862 if (! PyArg_ParseTupleAndKeywords(args, kw, "|O:now", keywords, 3863 &tzinfo)) 3864 return NULL; 3865 if (check_tzinfo_subclass(tzinfo) < 0) 3866 return NULL; 3867 3868 self = datetime_best_possible(cls, 3869 tzinfo == Py_None ? localtime : gmtime, 3870 tzinfo); 3871 if (self != NULL && tzinfo != Py_None) { 3872 /* Convert UTC to tzinfo's zone. */ 3873 PyObject *temp = self; 3874 self = PyObject_CallMethod(tzinfo, "fromutc", "O", self); 3875 Py_DECREF(temp); 3876 } 3877 return self; 3878 } 3879 3880 /* Return best possible UTC time -- this isn't constrained by the 3881 * precision of a timestamp. 3882 */ 3883 static PyObject * 3884 datetime_utcnow(PyObject *cls, PyObject *dummy) 3885 { 3886 return datetime_best_possible(cls, gmtime, Py_None); 3887 } 3888 3889 /* Return new local datetime from timestamp (Python timestamp -- a double). */ 3890 static PyObject * 3891 datetime_fromtimestamp(PyObject *cls, PyObject *args, PyObject *kw) 3892 { 3893 PyObject *self; 3894 double timestamp; 3895 PyObject *tzinfo = Py_None; 3896 static char *keywords[] = {"timestamp", "tz", NULL}; 3897 3898 if (! PyArg_ParseTupleAndKeywords(args, kw, "d|O:fromtimestamp", 3899 keywords, ×tamp, &tzinfo)) 3900 return NULL; 3901 if (check_tzinfo_subclass(tzinfo) < 0) 3902 return NULL; 3903 3904 self = datetime_from_timestamp(cls, 3905 tzinfo == Py_None ? localtime : gmtime, 3906 timestamp, 3907 tzinfo); 3908 if (self != NULL && tzinfo != Py_None) { 3909 /* Convert UTC to tzinfo's zone. */ 3910 PyObject *temp = self; 3911 self = PyObject_CallMethod(tzinfo, "fromutc", "O", self); 3912 Py_DECREF(temp); 3913 } 3914 return self; 3915 } 3916 3917 /* Return new UTC datetime from timestamp (Python timestamp -- a double). */ 3918 static PyObject * 3919 datetime_utcfromtimestamp(PyObject *cls, PyObject *args) 3920 { 3921 double timestamp; 3922 PyObject *result = NULL; 3923 3924 if (PyArg_ParseTuple(args, "d:utcfromtimestamp", ×tamp)) 3925 result = datetime_from_timestamp(cls, gmtime, timestamp, 3926 Py_None); 3927 return result; 3928 } 3929 3930 /* Return new datetime from time.strptime(). */ 3931 static PyObject * 3932 datetime_strptime(PyObject *cls, PyObject *args) 3933 { 3934 static PyObject *module = NULL; 3935 PyObject *result = NULL, *obj, *st = NULL, *frac = NULL; 3936 const char *string, *format; 3937 3938 if (!PyArg_ParseTuple(args, "ss:strptime", &string, &format)) 3939 return NULL; 3940 3941 if (module == NULL && 3942 (module = PyImport_ImportModuleNoBlock("_strptime")) == NULL) 3943 return NULL; 3944 3945 /* _strptime._strptime returns a two-element tuple. The first 3946 element is a time.struct_time object. The second is the 3947 microseconds (which are not defined for time.struct_time). */ 3948 obj = PyObject_CallMethod(module, "_strptime", "ss", string, format); 3949 if (obj != NULL) { 3950 int i, good_timetuple = 1; 3951 long int ia[7]; 3952 if (PySequence_Check(obj) && PySequence_Size(obj) == 2) { 3953 st = PySequence_GetItem(obj, 0); 3954 frac = PySequence_GetItem(obj, 1); 3955 if (st == NULL || frac == NULL) 3956 good_timetuple = 0; 3957 /* copy y/m/d/h/m/s values out of the 3958 time.struct_time */ 3959 if (good_timetuple && 3960 PySequence_Check(st) && 3961 PySequence_Size(st) >= 6) { 3962 for (i=0; i < 6; i++) { 3963 PyObject *p = PySequence_GetItem(st, i); 3964 if (p == NULL) { 3965 good_timetuple = 0; 3966 break; 3967 } 3968 if (PyInt_Check(p)) 3969 ia[i] = PyInt_AsLong(p); 3970 else 3971 good_timetuple = 0; 3972 Py_DECREF(p); 3973 } 3974 } 3975 else 3976 good_timetuple = 0; 3977 /* follow that up with a little dose of microseconds */ 3978 if (good_timetuple && PyInt_Check(frac)) 3979 ia[6] = PyInt_AsLong(frac); 3980 else 3981 good_timetuple = 0; 3982 } 3983 else 3984 good_timetuple = 0; 3985 if (good_timetuple) 3986 result = PyObject_CallFunction(cls, "iiiiiii", 3987 ia[0], ia[1], ia[2], 3988 ia[3], ia[4], ia[5], 3989 ia[6]); 3990 else 3991 PyErr_SetString(PyExc_ValueError, 3992 "unexpected value from _strptime._strptime"); 3993 } 3994 Py_XDECREF(obj); 3995 Py_XDECREF(st); 3996 Py_XDECREF(frac); 3997 return result; 3998 } 3999 4000 /* Return new datetime from date/datetime and time arguments. */ 4001 static PyObject * 4002 datetime_combine(PyObject *cls, PyObject *args, PyObject *kw) 4003 { 4004 static char *keywords[] = {"date", "time", NULL}; 4005 PyObject *date; 4006 PyObject *time; 4007 PyObject *result = NULL; 4008 4009 if (PyArg_ParseTupleAndKeywords(args, kw, "O!O!:combine", keywords, 4010 &PyDateTime_DateType, &date, 4011 &PyDateTime_TimeType, &time)) { 4012 PyObject *tzinfo = Py_None; 4013 4014 if (HASTZINFO(time)) 4015 tzinfo = ((PyDateTime_Time *)time)->tzinfo; 4016 result = PyObject_CallFunction(cls, "iiiiiiiO", 4017 GET_YEAR(date), 4018 GET_MONTH(date), 4019 GET_DAY(date), 4020 TIME_GET_HOUR(time), 4021 TIME_GET_MINUTE(time), 4022 TIME_GET_SECOND(time), 4023 TIME_GET_MICROSECOND(time), 4024 tzinfo); 4025 } 4026 return result; 4027 } 4028 4029 /* 4030 * Destructor. 4031 */ 4032 4033 static void 4034 datetime_dealloc(PyDateTime_DateTime *self) 4035 { 4036 if (HASTZINFO(self)) { 4037 Py_XDECREF(self->tzinfo); 4038 } 4039 Py_TYPE(self)->tp_free((PyObject *)self); 4040 } 4041 4042 /* 4043 * Indirect access to tzinfo methods. 4044 */ 4045 4046 /* These are all METH_NOARGS, so don't need to check the arglist. */ 4047 static PyObject * 4048 datetime_utcoffset(PyDateTime_DateTime *self, PyObject *unused) { 4049 return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None, 4050 "utcoffset", (PyObject *)self); 4051 } 4052 4053 static PyObject * 4054 datetime_dst(PyDateTime_DateTime *self, PyObject *unused) { 4055 return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None, 4056 "dst", (PyObject *)self); 4057 } 4058 4059 static PyObject * 4060 datetime_tzname(PyDateTime_DateTime *self, PyObject *unused) { 4061 return call_tzname(HASTZINFO(self) ? self->tzinfo : Py_None, 4062 (PyObject *)self); 4063 } 4064 4065 /* 4066 * datetime arithmetic. 4067 */ 4068 4069 /* factor must be 1 (to add) or -1 (to subtract). The result inherits 4070 * the tzinfo state of date. 4071 */ 4072 static PyObject * 4073 add_datetime_timedelta(PyDateTime_DateTime *date, PyDateTime_Delta *delta, 4074 int factor) 4075 { 4076 /* Note that the C-level additions can't overflow, because of 4077 * invariant bounds on the member values. 4078 */ 4079 int year = GET_YEAR(date); 4080 int month = GET_MONTH(date); 4081 int day = GET_DAY(date) + GET_TD_DAYS(delta) * factor; 4082 int hour = DATE_GET_HOUR(date); 4083 int minute = DATE_GET_MINUTE(date); 4084 int second = DATE_GET_SECOND(date) + GET_TD_SECONDS(delta) * factor; 4085 int microsecond = DATE_GET_MICROSECOND(date) + 4086 GET_TD_MICROSECONDS(delta) * factor; 4087 4088 assert(factor == 1 || factor == -1); 4089 if (normalize_datetime(&year, &month, &day, 4090 &hour, &minute, &second, µsecond) < 0) 4091 return NULL; 4092 else 4093 return new_datetime(year, month, day, 4094 hour, minute, second, microsecond, 4095 HASTZINFO(date) ? date->tzinfo : Py_None); 4096 } 4097 4098 static PyObject * 4099 datetime_add(PyObject *left, PyObject *right) 4100 { 4101 if (PyDateTime_Check(left)) { 4102 /* datetime + ??? */ 4103 if (PyDelta_Check(right)) 4104 /* datetime + delta */ 4105 return add_datetime_timedelta( 4106 (PyDateTime_DateTime *)left, 4107 (PyDateTime_Delta *)right, 4108 1); 4109 } 4110 else if (PyDelta_Check(left)) { 4111 /* delta + datetime */ 4112 return add_datetime_timedelta((PyDateTime_DateTime *) right, 4113 (PyDateTime_Delta *) left, 4114 1); 4115 } 4116 Py_INCREF(Py_NotImplemented); 4117 return Py_NotImplemented; 4118 } 4119 4120 static PyObject * 4121 datetime_subtract(PyObject *left, PyObject *right) 4122 { 4123 PyObject *result = Py_NotImplemented; 4124 4125 if (PyDateTime_Check(left)) { 4126 /* datetime - ??? */ 4127 if (PyDateTime_Check(right)) { 4128 /* datetime - datetime */ 4129 naivety n1, n2; 4130 int offset1, offset2; 4131 int delta_d, delta_s, delta_us; 4132 4133 if (classify_two_utcoffsets(left, &offset1, &n1, left, 4134 right, &offset2, &n2, 4135 right) < 0) 4136 return NULL; 4137 assert(n1 != OFFSET_UNKNOWN && n2 != OFFSET_UNKNOWN); 4138 if (n1 != n2) { 4139 PyErr_SetString(PyExc_TypeError, 4140 "can't subtract offset-naive and " 4141 "offset-aware datetimes"); 4142 return NULL; 4143 } 4144 delta_d = ymd_to_ord(GET_YEAR(left), 4145 GET_MONTH(left), 4146 GET_DAY(left)) - 4147 ymd_to_ord(GET_YEAR(right), 4148 GET_MONTH(right), 4149 GET_DAY(right)); 4150 /* These can't overflow, since the values are 4151 * normalized. At most this gives the number of 4152 * seconds in one day. 4153 */ 4154 delta_s = (DATE_GET_HOUR(left) - 4155 DATE_GET_HOUR(right)) * 3600 + 4156 (DATE_GET_MINUTE(left) - 4157 DATE_GET_MINUTE(right)) * 60 + 4158 (DATE_GET_SECOND(left) - 4159 DATE_GET_SECOND(right)); 4160 delta_us = DATE_GET_MICROSECOND(left) - 4161 DATE_GET_MICROSECOND(right); 4162 /* (left - offset1) - (right - offset2) = 4163 * (left - right) + (offset2 - offset1) 4164 */ 4165 delta_s += (offset2 - offset1) * 60; 4166 result = new_delta(delta_d, delta_s, delta_us, 1); 4167 } 4168 else if (PyDelta_Check(right)) { 4169 /* datetime - delta */ 4170 result = add_datetime_timedelta( 4171 (PyDateTime_DateTime *)left, 4172 (PyDateTime_Delta *)right, 4173 -1); 4174 } 4175 } 4176 4177 if (result == Py_NotImplemented) 4178 Py_INCREF(result); 4179 return result; 4180 } 4181 4182 /* Various ways to turn a datetime into a string. */ 4183 4184 static PyObject * 4185 datetime_repr(PyDateTime_DateTime *self) 4186 { 4187 char buffer[1000]; 4188 const char *type_name = Py_TYPE(self)->tp_name; 4189 PyObject *baserepr; 4190 4191 if (DATE_GET_MICROSECOND(self)) { 4192 PyOS_snprintf(buffer, sizeof(buffer), 4193 "%s(%d, %d, %d, %d, %d, %d, %d)", 4194 type_name, 4195 GET_YEAR(self), GET_MONTH(self), GET_DAY(self), 4196 DATE_GET_HOUR(self), DATE_GET_MINUTE(self), 4197 DATE_GET_SECOND(self), 4198 DATE_GET_MICROSECOND(self)); 4199 } 4200 else if (DATE_GET_SECOND(self)) { 4201 PyOS_snprintf(buffer, sizeof(buffer), 4202 "%s(%d, %d, %d, %d, %d, %d)", 4203 type_name, 4204 GET_YEAR(self), GET_MONTH(self), GET_DAY(self), 4205 DATE_GET_HOUR(self), DATE_GET_MINUTE(self), 4206 DATE_GET_SECOND(self)); 4207 } 4208 else { 4209 PyOS_snprintf(buffer, sizeof(buffer), 4210 "%s(%d, %d, %d, %d, %d)", 4211 type_name, 4212 GET_YEAR(self), GET_MONTH(self), GET_DAY(self), 4213 DATE_GET_HOUR(self), DATE_GET_MINUTE(self)); 4214 } 4215 baserepr = PyString_FromString(buffer); 4216 if (baserepr == NULL || ! HASTZINFO(self)) 4217 return baserepr; 4218 return append_keyword_tzinfo(baserepr, self->tzinfo); 4219 } 4220 4221 static PyObject * 4222 datetime_str(PyDateTime_DateTime *self) 4223 { 4224 return PyObject_CallMethod((PyObject *)self, "isoformat", "(s)", " "); 4225 } 4226 4227 static PyObject * 4228 datetime_isoformat(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) 4229 { 4230 char sep = 'T'; 4231 static char *keywords[] = {"sep", NULL}; 4232 char buffer[100]; 4233 char *cp; 4234 PyObject *result; 4235 4236 if (!PyArg_ParseTupleAndKeywords(args, kw, "|c:isoformat", keywords, 4237 &sep)) 4238 return NULL; 4239 cp = isoformat_date((PyDateTime_Date *)self, buffer, sizeof(buffer)); 4240 assert(cp != NULL); 4241 *cp++ = sep; 4242 cp = isoformat_time(self, cp, sizeof(buffer) - (cp - buffer)); 4243 result = PyString_FromStringAndSize(buffer, cp - buffer); 4244 if (result == NULL || ! HASTZINFO(self)) 4245 return result; 4246 4247 /* We need to append the UTC offset. */ 4248 if (format_utcoffset(buffer, sizeof(buffer), ":", self->tzinfo, 4249 (PyObject *)self) < 0) { 4250 Py_DECREF(result); 4251 return NULL; 4252 } 4253 PyString_ConcatAndDel(&result, PyString_FromString(buffer)); 4254 return result; 4255 } 4256 4257 static PyObject * 4258 datetime_ctime(PyDateTime_DateTime *self) 4259 { 4260 return format_ctime((PyDateTime_Date *)self, 4261 DATE_GET_HOUR(self), 4262 DATE_GET_MINUTE(self), 4263 DATE_GET_SECOND(self)); 4264 } 4265 4266 /* Miscellaneous methods. */ 4267 4268 /* This is more natural as a tp_compare, but doesn't work then: for whatever 4269 * reason, Python's try_3way_compare ignores tp_compare unless 4270 * PyInstance_Check returns true, but these aren't old-style classes. 4271 */ 4272 static PyObject * 4273 datetime_richcompare(PyDateTime_DateTime *self, PyObject *other, int op) 4274 { 4275 int diff; 4276 naivety n1, n2; 4277 int offset1, offset2; 4278 4279 if (! PyDateTime_Check(other)) { 4280 /* If other has a "timetuple" attr, that's an advertised 4281 * hook for other classes to ask to get comparison control. 4282 * However, date instances have a timetuple attr, and we 4283 * don't want to allow that comparison. Because datetime 4284 * is a subclass of date, when mixing date and datetime 4285 * in a comparison, Python gives datetime the first shot 4286 * (it's the more specific subtype). So we can stop that 4287 * combination here reliably. 4288 */ 4289 if (PyObject_HasAttrString(other, "timetuple") && 4290 ! PyDate_Check(other)) { 4291 /* A hook for other kinds of datetime objects. */ 4292 Py_INCREF(Py_NotImplemented); 4293 return Py_NotImplemented; 4294 } 4295 if (op == Py_EQ || op == Py_NE) { 4296 PyObject *result = op == Py_EQ ? Py_False : Py_True; 4297 Py_INCREF(result); 4298 return result; 4299 } 4300 /* Stop this from falling back to address comparison. */ 4301 return cmperror((PyObject *)self, other); 4302 } 4303 4304 if (classify_two_utcoffsets((PyObject *)self, &offset1, &n1, 4305 (PyObject *)self, 4306 other, &offset2, &n2, 4307 other) < 0) 4308 return NULL; 4309 assert(n1 != OFFSET_UNKNOWN && n2 != OFFSET_UNKNOWN); 4310 /* If they're both naive, or both aware and have the same offsets, 4311 * we get off cheap. Note that if they're both naive, offset1 == 4312 * offset2 == 0 at this point. 4313 */ 4314 if (n1 == n2 && offset1 == offset2) { 4315 diff = memcmp(self->data, ((PyDateTime_DateTime *)other)->data, 4316 _PyDateTime_DATETIME_DATASIZE); 4317 return diff_to_bool(diff, op); 4318 } 4319 4320 if (n1 == OFFSET_AWARE && n2 == OFFSET_AWARE) { 4321 PyDateTime_Delta *delta; 4322 4323 assert(offset1 != offset2); /* else last "if" handled it */ 4324 delta = (PyDateTime_Delta *)datetime_subtract((PyObject *)self, 4325 other); 4326 if (delta == NULL) 4327 return NULL; 4328 diff = GET_TD_DAYS(delta); 4329 if (diff == 0) 4330 diff = GET_TD_SECONDS(delta) | 4331 GET_TD_MICROSECONDS(delta); 4332 Py_DECREF(delta); 4333 return diff_to_bool(diff, op); 4334 } 4335 4336 assert(n1 != n2); 4337 PyErr_SetString(PyExc_TypeError, 4338 "can't compare offset-naive and " 4339 "offset-aware datetimes"); 4340 return NULL; 4341 } 4342 4343 static long 4344 datetime_hash(PyDateTime_DateTime *self) 4345 { 4346 if (self->hashcode == -1) { 4347 naivety n; 4348 int offset; 4349 PyObject *temp; 4350 4351 n = classify_utcoffset((PyObject *)self, (PyObject *)self, 4352 &offset); 4353 assert(n != OFFSET_UNKNOWN); 4354 if (n == OFFSET_ERROR) 4355 return -1; 4356 4357 /* Reduce this to a hash of another object. */ 4358 if (n == OFFSET_NAIVE) 4359 temp = PyString_FromStringAndSize( 4360 (char *)self->data, 4361 _PyDateTime_DATETIME_DATASIZE); 4362 else { 4363 int days; 4364 int seconds; 4365 4366 assert(n == OFFSET_AWARE); 4367 assert(HASTZINFO(self)); 4368 days = ymd_to_ord(GET_YEAR(self), 4369 GET_MONTH(self), 4370 GET_DAY(self)); 4371 seconds = DATE_GET_HOUR(self) * 3600 + 4372 (DATE_GET_MINUTE(self) - offset) * 60 + 4373 DATE_GET_SECOND(self); 4374 temp = new_delta(days, 4375 seconds, 4376 DATE_GET_MICROSECOND(self), 4377 1); 4378 } 4379 if (temp != NULL) { 4380 self->hashcode = PyObject_Hash(temp); 4381 Py_DECREF(temp); 4382 } 4383 } 4384 return self->hashcode; 4385 } 4386 4387 static PyObject * 4388 datetime_replace(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) 4389 { 4390 PyObject *clone; 4391 PyObject *tuple; 4392 int y = GET_YEAR(self); 4393 int m = GET_MONTH(self); 4394 int d = GET_DAY(self); 4395 int hh = DATE_GET_HOUR(self); 4396 int mm = DATE_GET_MINUTE(self); 4397 int ss = DATE_GET_SECOND(self); 4398 int us = DATE_GET_MICROSECOND(self); 4399 PyObject *tzinfo = HASTZINFO(self) ? self->tzinfo : Py_None; 4400 4401 if (! PyArg_ParseTupleAndKeywords(args, kw, "|iiiiiiiO:replace", 4402 datetime_kws, 4403 &y, &m, &d, &hh, &mm, &ss, &us, 4404 &tzinfo)) 4405 return NULL; 4406 tuple = Py_BuildValue("iiiiiiiO", y, m, d, hh, mm, ss, us, tzinfo); 4407 if (tuple == NULL) 4408 return NULL; 4409 clone = datetime_new(Py_TYPE(self), tuple, NULL); 4410 Py_DECREF(tuple); 4411 return clone; 4412 } 4413 4414 static PyObject * 4415 datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) 4416 { 4417 int y, m, d, hh, mm, ss, us; 4418 PyObject *result; 4419 int offset, none; 4420 4421 PyObject *tzinfo; 4422 static char *keywords[] = {"tz", NULL}; 4423 4424 if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:astimezone", keywords, 4425 &PyDateTime_TZInfoType, &tzinfo)) 4426 return NULL; 4427 4428 if (!HASTZINFO(self) || self->tzinfo == Py_None) 4429 goto NeedAware; 4430 4431 /* Conversion to self's own time zone is a NOP. */ 4432 if (self->tzinfo == tzinfo) { 4433 Py_INCREF(self); 4434 return (PyObject *)self; 4435 } 4436 4437 /* Convert self to UTC. */ 4438 offset = call_utcoffset(self->tzinfo, (PyObject *)self, &none); 4439 if (offset == -1 && PyErr_Occurred()) 4440 return NULL; 4441 if (none) 4442 goto NeedAware; 4443 4444 y = GET_YEAR(self); 4445 m = GET_MONTH(self); 4446 d = GET_DAY(self); 4447 hh = DATE_GET_HOUR(self); 4448 mm = DATE_GET_MINUTE(self); 4449 ss = DATE_GET_SECOND(self); 4450 us = DATE_GET_MICROSECOND(self); 4451 4452 mm -= offset; 4453 if ((mm < 0 || mm >= 60) && 4454 normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us) < 0) 4455 return NULL; 4456 4457 /* Attach new tzinfo and let fromutc() do the rest. */ 4458 result = new_datetime(y, m, d, hh, mm, ss, us, tzinfo); 4459 if (result != NULL) { 4460 PyObject *temp = result; 4461 4462 result = PyObject_CallMethod(tzinfo, "fromutc", "O", temp); 4463 Py_DECREF(temp); 4464 } 4465 return result; 4466 4467 NeedAware: 4468 PyErr_SetString(PyExc_ValueError, "astimezone() cannot be applied to " 4469 "a naive datetime"); 4470 return NULL; 4471 } 4472 4473 static PyObject * 4474 datetime_timetuple(PyDateTime_DateTime *self) 4475 { 4476 int dstflag = -1; 4477 4478 if (HASTZINFO(self) && self->tzinfo != Py_None) { 4479 int none; 4480 4481 dstflag = call_dst(self->tzinfo, (PyObject *)self, &none); 4482 if (dstflag == -1 && PyErr_Occurred()) 4483 return NULL; 4484 4485 if (none) 4486 dstflag = -1; 4487 else if (dstflag != 0) 4488 dstflag = 1; 4489 4490 } 4491 return build_struct_time(GET_YEAR(self), 4492 GET_MONTH(self), 4493 GET_DAY(self), 4494 DATE_GET_HOUR(self), 4495 DATE_GET_MINUTE(self), 4496 DATE_GET_SECOND(self), 4497 dstflag); 4498 } 4499 4500 static PyObject * 4501 datetime_getdate(PyDateTime_DateTime *self) 4502 { 4503 return new_date(GET_YEAR(self), 4504 GET_MONTH(self), 4505 GET_DAY(self)); 4506 } 4507 4508 static PyObject * 4509 datetime_gettime(PyDateTime_DateTime *self) 4510 { 4511 return new_time(DATE_GET_HOUR(self), 4512 DATE_GET_MINUTE(self), 4513 DATE_GET_SECOND(self), 4514 DATE_GET_MICROSECOND(self), 4515 Py_None); 4516 } 4517 4518 static PyObject * 4519 datetime_gettimetz(PyDateTime_DateTime *self) 4520 { 4521 return new_time(DATE_GET_HOUR(self), 4522 DATE_GET_MINUTE(self), 4523 DATE_GET_SECOND(self), 4524 DATE_GET_MICROSECOND(self), 4525 HASTZINFO(self) ? self->tzinfo : Py_None); 4526 } 4527 4528 static PyObject * 4529 datetime_utctimetuple(PyDateTime_DateTime *self) 4530 { 4531 int y = GET_YEAR(self); 4532 int m = GET_MONTH(self); 4533 int d = GET_DAY(self); 4534 int hh = DATE_GET_HOUR(self); 4535 int mm = DATE_GET_MINUTE(self); 4536 int ss = DATE_GET_SECOND(self); 4537 int us = 0; /* microseconds are ignored in a timetuple */ 4538 int offset = 0; 4539 4540 if (HASTZINFO(self) && self->tzinfo != Py_None) { 4541 int none; 4542 4543 offset = call_utcoffset(self->tzinfo, (PyObject *)self, &none); 4544 if (offset == -1 && PyErr_Occurred()) 4545 return NULL; 4546 } 4547 /* Even if offset is 0, don't call timetuple() -- tm_isdst should be 4548 * 0 in a UTC timetuple regardless of what dst() says. 4549 */ 4550 if (offset) { 4551 /* Subtract offset minutes & normalize. */ 4552 int stat; 4553 4554 mm -= offset; 4555 stat = normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us); 4556 if (stat < 0) { 4557 /* At the edges, it's possible we overflowed 4558 * beyond MINYEAR or MAXYEAR. 4559 */ 4560 if (PyErr_ExceptionMatches(PyExc_OverflowError)) 4561 PyErr_Clear(); 4562 else 4563 return NULL; 4564 } 4565 } 4566 return build_struct_time(y, m, d, hh, mm, ss, 0); 4567 } 4568 4569 /* Pickle support, a simple use of __reduce__. */ 4570 4571 /* Let basestate be the non-tzinfo data string. 4572 * If tzinfo is None, this returns (basestate,), else (basestate, tzinfo). 4573 * So it's a tuple in any (non-error) case. 4574 * __getstate__ isn't exposed. 4575 */ 4576 static PyObject * 4577 datetime_getstate(PyDateTime_DateTime *self) 4578 { 4579 PyObject *basestate; 4580 PyObject *result = NULL; 4581 4582 basestate = PyString_FromStringAndSize((char *)self->data, 4583 _PyDateTime_DATETIME_DATASIZE); 4584 if (basestate != NULL) { 4585 if (! HASTZINFO(self) || self->tzinfo == Py_None) 4586 result = PyTuple_Pack(1, basestate); 4587 else 4588 result = PyTuple_Pack(2, basestate, self->tzinfo); 4589 Py_DECREF(basestate); 4590 } 4591 return result; 4592 } 4593 4594 static PyObject * 4595 datetime_reduce(PyDateTime_DateTime *self, PyObject *arg) 4596 { 4597 return Py_BuildValue("(ON)", Py_TYPE(self), datetime_getstate(self)); 4598 } 4599 4600 static PyMethodDef datetime_methods[] = { 4601 4602 /* Class methods: */ 4603 4604 {"now", (PyCFunction)datetime_now, 4605 METH_VARARGS | METH_KEYWORDS | METH_CLASS, 4606 PyDoc_STR("[tz] -> new datetime with tz's local day and time.")}, 4607 4608 {"utcnow", (PyCFunction)datetime_utcnow, 4609 METH_NOARGS | METH_CLASS, 4610 PyDoc_STR("Return a new datetime representing UTC day and time.")}, 4611 4612 {"fromtimestamp", (PyCFunction)datetime_fromtimestamp, 4613 METH_VARARGS | METH_KEYWORDS | METH_CLASS, 4614 PyDoc_STR("timestamp[, tz] -> tz's local time from POSIX timestamp.")}, 4615 4616 {"utcfromtimestamp", (PyCFunction)datetime_utcfromtimestamp, 4617 METH_VARARGS | METH_CLASS, 4618 PyDoc_STR("timestamp -> UTC datetime from a POSIX timestamp " 4619 "(like time.time()).")}, 4620 4621 {"strptime", (PyCFunction)datetime_strptime, 4622 METH_VARARGS | METH_CLASS, 4623 PyDoc_STR("string, format -> new datetime parsed from a string " 4624 "(like time.strptime()).")}, 4625 4626 {"combine", (PyCFunction)datetime_combine, 4627 METH_VARARGS | METH_KEYWORDS | METH_CLASS, 4628 PyDoc_STR("date, time -> datetime with same date and time fields")}, 4629 4630 /* Instance methods: */ 4631 4632 {"date", (PyCFunction)datetime_getdate, METH_NOARGS, 4633 PyDoc_STR("Return date object with same year, month and day.")}, 4634 4635 {"time", (PyCFunction)datetime_gettime, METH_NOARGS, 4636 PyDoc_STR("Return time object with same time but with tzinfo=None.")}, 4637 4638 {"timetz", (PyCFunction)datetime_gettimetz, METH_NOARGS, 4639 PyDoc_STR("Return time object with same time and tzinfo.")}, 4640 4641 {"ctime", (PyCFunction)datetime_ctime, METH_NOARGS, 4642 PyDoc_STR("Return ctime() style string.")}, 4643 4644 {"timetuple", (PyCFunction)datetime_timetuple, METH_NOARGS, 4645 PyDoc_STR("Return time tuple, compatible with time.localtime().")}, 4646 4647 {"utctimetuple", (PyCFunction)datetime_utctimetuple, METH_NOARGS, 4648 PyDoc_STR("Return UTC time tuple, compatible with time.localtime().")}, 4649 4650 {"isoformat", (PyCFunction)datetime_isoformat, METH_VARARGS | METH_KEYWORDS, 4651 PyDoc_STR("[sep] -> string in ISO 8601 format, " 4652 "YYYY-MM-DDTHH:MM:SS[.mmmmmm][+HH:MM].\n\n" 4653 "sep is used to separate the year from the time, and " 4654 "defaults to 'T'.")}, 4655 4656 {"utcoffset", (PyCFunction)datetime_utcoffset, METH_NOARGS, 4657 PyDoc_STR("Return self.tzinfo.utcoffset(self).")}, 4658 4659 {"tzname", (PyCFunction)datetime_tzname, METH_NOARGS, 4660 PyDoc_STR("Return self.tzinfo.tzname(self).")}, 4661 4662 {"dst", (PyCFunction)datetime_dst, METH_NOARGS, 4663 PyDoc_STR("Return self.tzinfo.dst(self).")}, 4664 4665 {"replace", (PyCFunction)datetime_replace, METH_VARARGS | METH_KEYWORDS, 4666 PyDoc_STR("Return datetime with new specified fields.")}, 4667 4668 {"astimezone", (PyCFunction)datetime_astimezone, METH_VARARGS | METH_KEYWORDS, 4669 PyDoc_STR("tz -> convert to local time in new timezone tz\n")}, 4670 4671 {"__reduce__", (PyCFunction)datetime_reduce, METH_NOARGS, 4672 PyDoc_STR("__reduce__() -> (cls, state)")}, 4673 4674 {NULL, NULL} 4675 }; 4676 4677 static char datetime_doc[] = 4678 PyDoc_STR("datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\n\ 4679 \n\ 4680 The year, month and day arguments are required. tzinfo may be None, or an\n\ 4681 instance of a tzinfo subclass. The remaining arguments may be ints or longs.\n"); 4682 4683 static PyNumberMethods datetime_as_number = { 4684 datetime_add, /* nb_add */ 4685 datetime_subtract, /* nb_subtract */ 4686 0, /* nb_multiply */ 4687 0, /* nb_divide */ 4688 0, /* nb_remainder */ 4689 0, /* nb_divmod */ 4690 0, /* nb_power */ 4691 0, /* nb_negative */ 4692 0, /* nb_positive */ 4693 0, /* nb_absolute */ 4694 0, /* nb_nonzero */ 4695 }; 4696 4697 statichere PyTypeObject PyDateTime_DateTimeType = { 4698 PyVarObject_HEAD_INIT(NULL, 0) 4699 "datetime.datetime", /* tp_name */ 4700 sizeof(PyDateTime_DateTime), /* tp_basicsize */ 4701 0, /* tp_itemsize */ 4702 (destructor)datetime_dealloc, /* tp_dealloc */ 4703 0, /* tp_print */ 4704 0, /* tp_getattr */ 4705 0, /* tp_setattr */ 4706 0, /* tp_compare */ 4707 (reprfunc)datetime_repr, /* tp_repr */ 4708 &datetime_as_number, /* tp_as_number */ 4709 0, /* tp_as_sequence */ 4710 0, /* tp_as_mapping */ 4711 (hashfunc)datetime_hash, /* tp_hash */ 4712 0, /* tp_call */ 4713 (reprfunc)datetime_str, /* tp_str */ 4714 PyObject_GenericGetAttr, /* tp_getattro */ 4715 0, /* tp_setattro */ 4716 0, /* tp_as_buffer */ 4717 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | 4718 Py_TPFLAGS_BASETYPE, /* tp_flags */ 4719 datetime_doc, /* tp_doc */ 4720 0, /* tp_traverse */ 4721 0, /* tp_clear */ 4722 (richcmpfunc)datetime_richcompare, /* tp_richcompare */ 4723 0, /* tp_weaklistoffset */ 4724 0, /* tp_iter */ 4725 0, /* tp_iternext */ 4726 datetime_methods, /* tp_methods */ 4727 0, /* tp_members */ 4728 datetime_getset, /* tp_getset */ 4729 &PyDateTime_DateType, /* tp_base */ 4730 0, /* tp_dict */ 4731 0, /* tp_descr_get */ 4732 0, /* tp_descr_set */ 4733 0, /* tp_dictoffset */ 4734 0, /* tp_init */ 4735 datetime_alloc, /* tp_alloc */ 4736 datetime_new, /* tp_new */ 4737 0, /* tp_free */ 4738 }; 4739 4740 /* --------------------------------------------------------------------------- 4741 * Module methods and initialization. 4742 */ 4743 4744 static PyMethodDef module_methods[] = { 4745 {NULL, NULL} 4746 }; 4747 4748 /* C API. Clients get at this via PyDateTime_IMPORT, defined in 4749 * datetime.h. 4750 */ 4751 static PyDateTime_CAPI CAPI = { 4752 &PyDateTime_DateType, 4753 &PyDateTime_DateTimeType, 4754 &PyDateTime_TimeType, 4755 &PyDateTime_DeltaType, 4756 &PyDateTime_TZInfoType, 4757 new_date_ex, 4758 new_datetime_ex, 4759 new_time_ex, 4760 new_delta_ex, 4761 datetime_fromtimestamp, 4762 date_fromtimestamp 4763 }; 4764 4765 4766 PyMODINIT_FUNC 4767 initdatetime(void) 4768 { 4769 PyObject *m; /* a module object */ 4770 PyObject *d; /* its dict */ 4771 PyObject *x; 4772 4773 m = Py_InitModule3("datetime", module_methods, 4774 "Fast implementation of the datetime type."); 4775 if (m == NULL) 4776 return; 4777 4778 if (PyType_Ready(&PyDateTime_DateType) < 0) 4779 return; 4780 if (PyType_Ready(&PyDateTime_DateTimeType) < 0) 4781 return; 4782 if (PyType_Ready(&PyDateTime_DeltaType) < 0) 4783 return; 4784 if (PyType_Ready(&PyDateTime_TimeType) < 0) 4785 return; 4786 if (PyType_Ready(&PyDateTime_TZInfoType) < 0) 4787 return; 4788 4789 /* timedelta values */ 4790 d = PyDateTime_DeltaType.tp_dict; 4791 4792 x = new_delta(0, 0, 1, 0); 4793 if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) 4794 return; 4795 Py_DECREF(x); 4796 4797 x = new_delta(-MAX_DELTA_DAYS, 0, 0, 0); 4798 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) 4799 return; 4800 Py_DECREF(x); 4801 4802 x = new_delta(MAX_DELTA_DAYS, 24*3600-1, 1000000-1, 0); 4803 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) 4804 return; 4805 Py_DECREF(x); 4806 4807 /* date values */ 4808 d = PyDateTime_DateType.tp_dict; 4809 4810 x = new_date(1, 1, 1); 4811 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) 4812 return; 4813 Py_DECREF(x); 4814 4815 x = new_date(MAXYEAR, 12, 31); 4816 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) 4817 return; 4818 Py_DECREF(x); 4819 4820 x = new_delta(1, 0, 0, 0); 4821 if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) 4822 return; 4823 Py_DECREF(x); 4824 4825 /* time values */ 4826 d = PyDateTime_TimeType.tp_dict; 4827 4828 x = new_time(0, 0, 0, 0, Py_None); 4829 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) 4830 return; 4831 Py_DECREF(x); 4832 4833 x = new_time(23, 59, 59, 999999, Py_None); 4834 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) 4835 return; 4836 Py_DECREF(x); 4837 4838 x = new_delta(0, 0, 1, 0); 4839 if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) 4840 return; 4841 Py_DECREF(x); 4842 4843 /* datetime values */ 4844 d = PyDateTime_DateTimeType.tp_dict; 4845 4846 x = new_datetime(1, 1, 1, 0, 0, 0, 0, Py_None); 4847 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) 4848 return; 4849 Py_DECREF(x); 4850 4851 x = new_datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, Py_None); 4852 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) 4853 return; 4854 Py_DECREF(x); 4855 4856 x = new_delta(0, 0, 1, 0); 4857 if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) 4858 return; 4859 Py_DECREF(x); 4860 4861 /* module initialization */ 4862 PyModule_AddIntConstant(m, "MINYEAR", MINYEAR); 4863 PyModule_AddIntConstant(m, "MAXYEAR", MAXYEAR); 4864 4865 Py_INCREF(&PyDateTime_DateType); 4866 PyModule_AddObject(m, "date", (PyObject *) &PyDateTime_DateType); 4867 4868 Py_INCREF(&PyDateTime_DateTimeType); 4869 PyModule_AddObject(m, "datetime", 4870 (PyObject *)&PyDateTime_DateTimeType); 4871 4872 Py_INCREF(&PyDateTime_TimeType); 4873 PyModule_AddObject(m, "time", (PyObject *) &PyDateTime_TimeType); 4874 4875 Py_INCREF(&PyDateTime_DeltaType); 4876 PyModule_AddObject(m, "timedelta", (PyObject *) &PyDateTime_DeltaType); 4877 4878 Py_INCREF(&PyDateTime_TZInfoType); 4879 PyModule_AddObject(m, "tzinfo", (PyObject *) &PyDateTime_TZInfoType); 4880 4881 x = PyCapsule_New(&CAPI, PyDateTime_CAPSULE_NAME, NULL); 4882 if (x == NULL) 4883 return; 4884 PyModule_AddObject(m, "datetime_CAPI", x); 4885 4886 /* A 4-year cycle has an extra leap day over what we'd get from 4887 * pasting together 4 single years. 4888 */ 4889 assert(DI4Y == 4 * 365 + 1); 4890 assert(DI4Y == days_before_year(4+1)); 4891 4892 /* Similarly, a 400-year cycle has an extra leap day over what we'd 4893 * get from pasting together 4 100-year cycles. 4894 */ 4895 assert(DI400Y == 4 * DI100Y + 1); 4896 assert(DI400Y == days_before_year(400+1)); 4897 4898 /* OTOH, a 100-year cycle has one fewer leap day than we'd get from 4899 * pasting together 25 4-year cycles. 4900 */ 4901 assert(DI100Y == 25 * DI4Y - 1); 4902 assert(DI100Y == days_before_year(100+1)); 4903 4904 us_per_us = PyInt_FromLong(1); 4905 us_per_ms = PyInt_FromLong(1000); 4906 us_per_second = PyInt_FromLong(1000000); 4907 us_per_minute = PyInt_FromLong(60000000); 4908 seconds_per_day = PyInt_FromLong(24 * 3600); 4909 if (us_per_us == NULL || us_per_ms == NULL || us_per_second == NULL || 4910 us_per_minute == NULL || seconds_per_day == NULL) 4911 return; 4912 4913 /* The rest are too big for 32-bit ints, but even 4914 * us_per_week fits in 40 bits, so doubles should be exact. 4915 */ 4916 us_per_hour = PyLong_FromDouble(3600000000.0); 4917 us_per_day = PyLong_FromDouble(86400000000.0); 4918 us_per_week = PyLong_FromDouble(604800000000.0); 4919 if (us_per_hour == NULL || us_per_day == NULL || us_per_week == NULL) 4920 return; 4921 } 4922 4923 /* --------------------------------------------------------------------------- 4924 Some time zone algebra. For a datetime x, let 4925 x.n = x stripped of its timezone -- its naive time. 4926 x.o = x.utcoffset(), and assuming that doesn't raise an exception or 4927 return None 4928 x.d = x.dst(), and assuming that doesn't raise an exception or 4929 return None 4930 x.s = x's standard offset, x.o - x.d 4931 4932 Now some derived rules, where k is a duration (timedelta). 4933 4934 1. x.o = x.s + x.d 4935 This follows from the definition of x.s. 4936 4937 2. If x and y have the same tzinfo member, x.s = y.s. 4938 This is actually a requirement, an assumption we need to make about 4939 sane tzinfo classes. 4940 4941 3. The naive UTC time corresponding to x is x.n - x.o. 4942 This is again a requirement for a sane tzinfo class. 4943 4944 4. (x+k).s = x.s 4945 This follows from #2, and that datimetimetz+timedelta preserves tzinfo. 4946 4947 5. (x+k).n = x.n + k 4948 Again follows from how arithmetic is defined. 4949 4950 Now we can explain tz.fromutc(x). Let's assume it's an interesting case 4951 (meaning that the various tzinfo methods exist, and don't blow up or return 4952 None when called). 4953 4954 The function wants to return a datetime y with timezone tz, equivalent to x. 4955 x is already in UTC. 4956 4957 By #3, we want 4958 4959 y.n - y.o = x.n [1] 4960 4961 The algorithm starts by attaching tz to x.n, and calling that y. So 4962 x.n = y.n at the start. Then it wants to add a duration k to y, so that [1] 4963 becomes true; in effect, we want to solve [2] for k: 4964 4965 (y+k).n - (y+k).o = x.n [2] 4966 4967 By #1, this is the same as 4968 4969 (y+k).n - ((y+k).s + (y+k).d) = x.n [3] 4970 4971 By #5, (y+k).n = y.n + k, which equals x.n + k because x.n=y.n at the start. 4972 Substituting that into [3], 4973 4974 x.n + k - (y+k).s - (y+k).d = x.n; the x.n terms cancel, leaving 4975 k - (y+k).s - (y+k).d = 0; rearranging, 4976 k = (y+k).s - (y+k).d; by #4, (y+k).s == y.s, so 4977 k = y.s - (y+k).d 4978 4979 On the RHS, (y+k).d can't be computed directly, but y.s can be, and we 4980 approximate k by ignoring the (y+k).d term at first. Note that k can't be 4981 very large, since all offset-returning methods return a duration of magnitude 4982 less than 24 hours. For that reason, if y is firmly in std time, (y+k).d must 4983 be 0, so ignoring it has no consequence then. 4984 4985 In any case, the new value is 4986 4987 z = y + y.s [4] 4988 4989 It's helpful to step back at look at [4] from a higher level: it's simply 4990 mapping from UTC to tz's standard time. 4991 4992 At this point, if 4993 4994 z.n - z.o = x.n [5] 4995 4996 we have an equivalent time, and are almost done. The insecurity here is 4997 at the start of daylight time. Picture US Eastern for concreteness. The wall 4998 time jumps from 1:59 to 3:00, and wall hours of the form 2:MM don't make good 4999 sense then. The docs ask that an Eastern tzinfo class consider such a time to 5000 be EDT (because it's "after 2"), which is a redundant spelling of 1:MM EST 5001 on the day DST starts. We want to return the 1:MM EST spelling because that's 5002 the only spelling that makes sense on the local wall clock. 5003 5004 In fact, if [5] holds at this point, we do have the standard-time spelling, 5005 but that takes a bit of proof. We first prove a stronger result. What's the 5006 difference between the LHS and RHS of [5]? Let 5007 5008 diff = x.n - (z.n - z.o) [6] 5009 5010 Now 5011 z.n = by [4] 5012 (y + y.s).n = by #5 5013 y.n + y.s = since y.n = x.n 5014 x.n + y.s = since z and y are have the same tzinfo member, 5015 y.s = z.s by #2 5016 x.n + z.s 5017 5018 Plugging that back into [6] gives 5019 5020 diff = 5021 x.n - ((x.n + z.s) - z.o) = expanding 5022 x.n - x.n - z.s + z.o = cancelling 5023 - z.s + z.o = by #2 5024 z.d 5025 5026 So diff = z.d. 5027 5028 If [5] is true now, diff = 0, so z.d = 0 too, and we have the standard-time 5029 spelling we wanted in the endcase described above. We're done. Contrarily, 5030 if z.d = 0, then we have a UTC equivalent, and are also done. 5031 5032 If [5] is not true now, diff = z.d != 0, and z.d is the offset we need to 5033 add to z (in effect, z is in tz's standard time, and we need to shift the 5034 local clock into tz's daylight time). 5035 5036 Let 5037 5038 z' = z + z.d = z + diff [7] 5039 5040 and we can again ask whether 5041 5042 z'.n - z'.o = x.n [8] 5043 5044 If so, we're done. If not, the tzinfo class is insane, according to the 5045 assumptions we've made. This also requires a bit of proof. As before, let's 5046 compute the difference between the LHS and RHS of [8] (and skipping some of 5047 the justifications for the kinds of substitutions we've done several times 5048 already): 5049 5050 diff' = x.n - (z'.n - z'.o) = replacing z'.n via [7] 5051 x.n - (z.n + diff - z'.o) = replacing diff via [6] 5052 x.n - (z.n + x.n - (z.n - z.o) - z'.o) = 5053 x.n - z.n - x.n + z.n - z.o + z'.o = cancel x.n 5054 - z.n + z.n - z.o + z'.o = cancel z.n 5055 - z.o + z'.o = #1 twice 5056 -z.s - z.d + z'.s + z'.d = z and z' have same tzinfo 5057 z'.d - z.d 5058 5059 So z' is UTC-equivalent to x iff z'.d = z.d at this point. If they are equal, 5060 we've found the UTC-equivalent so are done. In fact, we stop with [7] and 5061 return z', not bothering to compute z'.d. 5062 5063 How could z.d and z'd differ? z' = z + z.d [7], so merely moving z' by 5064 a dst() offset, and starting *from* a time already in DST (we know z.d != 0), 5065 would have to change the result dst() returns: we start in DST, and moving 5066 a little further into it takes us out of DST. 5067 5068 There isn't a sane case where this can happen. The closest it gets is at 5069 the end of DST, where there's an hour in UTC with no spelling in a hybrid 5070 tzinfo class. In US Eastern, that's 5:MM UTC = 0:MM EST = 1:MM EDT. During 5071 that hour, on an Eastern clock 1:MM is taken as being in standard time (6:MM 5072 UTC) because the docs insist on that, but 0:MM is taken as being in daylight 5073 time (4:MM UTC). There is no local time mapping to 5:MM UTC. The local 5074 clock jumps from 1:59 back to 1:00 again, and repeats the 1:MM hour in 5075 standard time. Since that's what the local clock *does*, we want to map both 5076 UTC hours 5:MM and 6:MM to 1:MM Eastern. The result is ambiguous 5077 in local time, but so it goes -- it's the way the local clock works. 5078 5079 When x = 5:MM UTC is the input to this algorithm, x.o=0, y.o=-5 and y.d=0, 5080 so z=0:MM. z.d=60 (minutes) then, so [5] doesn't hold and we keep going. 5081 z' = z + z.d = 1:MM then, and z'.d=0, and z'.d - z.d = -60 != 0 so [8] 5082 (correctly) concludes that z' is not UTC-equivalent to x. 5083 5084 Because we know z.d said z was in daylight time (else [5] would have held and 5085 we would have stopped then), and we know z.d != z'.d (else [8] would have held 5086 and we would have stopped then), and there are only 2 possible values dst() can 5087 return in Eastern, it follows that z'.d must be 0 (which it is in the example, 5088 but the reasoning doesn't depend on the example -- it depends on there being 5089 two possible dst() outcomes, one zero and the other non-zero). Therefore 5090 z' must be in standard time, and is the spelling we want in this case. 5091 5092 Note again that z' is not UTC-equivalent as far as the hybrid tzinfo class is 5093 concerned (because it takes z' as being in standard time rather than the 5094 daylight time we intend here), but returning it gives the real-life "local 5095 clock repeats an hour" behavior when mapping the "unspellable" UTC hour into 5096 tz. 5097 5098 When the input is 6:MM, z=1:MM and z.d=0, and we stop at once, again with 5099 the 1:MM standard time spelling we want. 5100 5101 So how can this break? One of the assumptions must be violated. Two 5102 possibilities: 5103 5104 1) [2] effectively says that y.s is invariant across all y belong to a given 5105 time zone. This isn't true if, for political reasons or continental drift, 5106 a region decides to change its base offset from UTC. 5107 5108 2) There may be versions of "double daylight" time where the tail end of 5109 the analysis gives up a step too early. I haven't thought about that 5110 enough to say. 5111 5112 In any case, it's clear that the default fromutc() is strong enough to handle 5113 "almost all" time zones: so long as the standard offset is invariant, it 5114 doesn't matter if daylight time transition points change from year to year, or 5115 if daylight time is skipped in some years; it doesn't matter how large or 5116 small dst() may get within its bounds; and it doesn't even matter if some 5117 perverse time zone returns a negative dst()). So a breaking case must be 5118 pretty bizarre, and a tzinfo subclass can override fromutc() if it is. 5119 --------------------------------------------------------------------------- */ 5120