+++ /dev/null
-/* datetime.h\r
- */\r
-\r
-#ifndef DATETIME_H\r
-#define DATETIME_H\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-/* Fields are packed into successive bytes, each viewed as unsigned and\r
- * big-endian, unless otherwise noted:\r
- *\r
- * byte offset\r
- * 0 year 2 bytes, 1-9999\r
- * 2 month 1 byte, 1-12\r
- * 3 day 1 byte, 1-31\r
- * 4 hour 1 byte, 0-23\r
- * 5 minute 1 byte, 0-59\r
- * 6 second 1 byte, 0-59\r
- * 7 usecond 3 bytes, 0-999999\r
- * 10\r
- */\r
-\r
-/* # of bytes for year, month, and day. */\r
-#define _PyDateTime_DATE_DATASIZE 4\r
-\r
-/* # of bytes for hour, minute, second, and usecond. */\r
-#define _PyDateTime_TIME_DATASIZE 6\r
-\r
-/* # of bytes for year, month, day, hour, minute, second, and usecond. */\r
-#define _PyDateTime_DATETIME_DATASIZE 10\r
-\r
-\r
-typedef struct\r
-{\r
- PyObject_HEAD\r
- long hashcode; /* -1 when unknown */\r
- int days; /* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */\r
- int seconds; /* 0 <= seconds < 24*3600 is invariant */\r
- int microseconds; /* 0 <= microseconds < 1000000 is invariant */\r
-} PyDateTime_Delta;\r
-\r
-typedef struct\r
-{\r
- PyObject_HEAD /* a pure abstract base clase */\r
-} PyDateTime_TZInfo;\r
-\r
-\r
-/* The datetime and time types have hashcodes, and an optional tzinfo member,\r
- * present if and only if hastzinfo is true.\r
- */\r
-#define _PyTZINFO_HEAD \\r
- PyObject_HEAD \\r
- long hashcode; \\r
- char hastzinfo; /* boolean flag */\r
-\r
-/* No _PyDateTime_BaseTZInfo is allocated; it's just to have something\r
- * convenient to cast to, when getting at the hastzinfo member of objects\r
- * starting with _PyTZINFO_HEAD.\r
- */\r
-typedef struct\r
-{\r
- _PyTZINFO_HEAD\r
-} _PyDateTime_BaseTZInfo;\r
-\r
-/* All time objects are of PyDateTime_TimeType, but that can be allocated\r
- * in two ways, with or without a tzinfo member. Without is the same as\r
- * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an\r
- * internal struct used to allocate the right amount of space for the\r
- * "without" case.\r
- */\r
-#define _PyDateTime_TIMEHEAD \\r
- _PyTZINFO_HEAD \\r
- unsigned char data[_PyDateTime_TIME_DATASIZE];\r
-\r
-typedef struct\r
-{\r
- _PyDateTime_TIMEHEAD\r
-} _PyDateTime_BaseTime; /* hastzinfo false */\r
-\r
-typedef struct\r
-{\r
- _PyDateTime_TIMEHEAD\r
- PyObject *tzinfo;\r
-} PyDateTime_Time; /* hastzinfo true */\r
-\r
-\r
-/* All datetime objects are of PyDateTime_DateTimeType, but that can be\r
- * allocated in two ways too, just like for time objects above. In addition,\r
- * the plain date type is a base class for datetime, so it must also have\r
- * a hastzinfo member (although it's unused there).\r
- */\r
-typedef struct\r
-{\r
- _PyTZINFO_HEAD\r
- unsigned char data[_PyDateTime_DATE_DATASIZE];\r
-} PyDateTime_Date;\r
-\r
-#define _PyDateTime_DATETIMEHEAD \\r
- _PyTZINFO_HEAD \\r
- unsigned char data[_PyDateTime_DATETIME_DATASIZE];\r
-\r
-typedef struct\r
-{\r
- _PyDateTime_DATETIMEHEAD\r
-} _PyDateTime_BaseDateTime; /* hastzinfo false */\r
-\r
-typedef struct\r
-{\r
- _PyDateTime_DATETIMEHEAD\r
- PyObject *tzinfo;\r
-} PyDateTime_DateTime; /* hastzinfo true */\r
-\r
-\r
-/* Apply for date and datetime instances. */\r
-#define PyDateTime_GET_YEAR(o) ((((PyDateTime_Date*)o)->data[0] << 8) | \\r
- ((PyDateTime_Date*)o)->data[1])\r
-#define PyDateTime_GET_MONTH(o) (((PyDateTime_Date*)o)->data[2])\r
-#define PyDateTime_GET_DAY(o) (((PyDateTime_Date*)o)->data[3])\r
-\r
-#define PyDateTime_DATE_GET_HOUR(o) (((PyDateTime_DateTime*)o)->data[4])\r
-#define PyDateTime_DATE_GET_MINUTE(o) (((PyDateTime_DateTime*)o)->data[5])\r
-#define PyDateTime_DATE_GET_SECOND(o) (((PyDateTime_DateTime*)o)->data[6])\r
-#define PyDateTime_DATE_GET_MICROSECOND(o) \\r
- ((((PyDateTime_DateTime*)o)->data[7] << 16) | \\r
- (((PyDateTime_DateTime*)o)->data[8] << 8) | \\r
- ((PyDateTime_DateTime*)o)->data[9])\r
-\r
-/* Apply for time instances. */\r
-#define PyDateTime_TIME_GET_HOUR(o) (((PyDateTime_Time*)o)->data[0])\r
-#define PyDateTime_TIME_GET_MINUTE(o) (((PyDateTime_Time*)o)->data[1])\r
-#define PyDateTime_TIME_GET_SECOND(o) (((PyDateTime_Time*)o)->data[2])\r
-#define PyDateTime_TIME_GET_MICROSECOND(o) \\r
- ((((PyDateTime_Time*)o)->data[3] << 16) | \\r
- (((PyDateTime_Time*)o)->data[4] << 8) | \\r
- ((PyDateTime_Time*)o)->data[5])\r
-\r
-\r
-/* Define structure for C API. */\r
-typedef struct {\r
- /* type objects */\r
- PyTypeObject *DateType;\r
- PyTypeObject *DateTimeType;\r
- PyTypeObject *TimeType;\r
- PyTypeObject *DeltaType;\r
- PyTypeObject *TZInfoType;\r
-\r
- /* constructors */\r
- PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*);\r
- PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int,\r
- PyObject*, PyTypeObject*);\r
- PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*);\r
- PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*);\r
-\r
- /* constructors for the DB API */\r
- PyObject *(*DateTime_FromTimestamp)(PyObject*, PyObject*, PyObject*);\r
- PyObject *(*Date_FromTimestamp)(PyObject*, PyObject*);\r
-\r
-} PyDateTime_CAPI;\r
-\r
-#define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI"\r
-\r
-\r
-/* "magic" constant used to partially protect against developer mistakes. */\r
-#define DATETIME_API_MAGIC 0x414548d5\r
-\r
-#ifdef Py_BUILD_CORE\r
-\r
-/* Macros for type checking when building the Python core. */\r
-#define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType)\r
-#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType)\r
-\r
-#define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType)\r
-#define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType)\r
-\r
-#define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType)\r
-#define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType)\r
-\r
-#define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType)\r
-#define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType)\r
-\r
-#define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType)\r
-#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType)\r
-\r
-#else\r
-\r
-/* Define global variable for the C API and a macro for setting it. */\r
-static PyDateTime_CAPI *PyDateTimeAPI = NULL;\r
-\r
-#define PyDateTime_IMPORT \\r
- PyDateTimeAPI = (PyDateTime_CAPI *)PyCapsule_Import(PyDateTime_CAPSULE_NAME, 0)\r
-\r
-/* Macros for type checking when not building the Python core. */\r
-#define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType)\r
-#define PyDate_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateType)\r
-\r
-#define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType)\r
-#define PyDateTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateTimeType)\r
-\r
-#define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType)\r
-#define PyTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TimeType)\r
-\r
-#define PyDelta_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DeltaType)\r
-#define PyDelta_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DeltaType)\r
-\r
-#define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType)\r
-#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType)\r
-\r
-/* Macros for accessing constructors in a simplified fashion. */\r
-#define PyDate_FromDate(year, month, day) \\r
- PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType)\r
-\r
-#define PyDateTime_FromDateAndTime(year, month, day, hour, min, sec, usec) \\r
- PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, \\r
- min, sec, usec, Py_None, PyDateTimeAPI->DateTimeType)\r
-\r
-#define PyTime_FromTime(hour, minute, second, usecond) \\r
- PyDateTimeAPI->Time_FromTime(hour, minute, second, usecond, \\r
- Py_None, PyDateTimeAPI->TimeType)\r
-\r
-#define PyDelta_FromDSU(days, seconds, useconds) \\r
- PyDateTimeAPI->Delta_FromDelta(days, seconds, useconds, 1, \\r
- PyDateTimeAPI->DeltaType)\r
-\r
-/* Macros supporting the DB API. */\r
-#define PyDateTime_FromTimestamp(args) \\r
- PyDateTimeAPI->DateTime_FromTimestamp( \\r
- (PyObject*) (PyDateTimeAPI->DateTimeType), args, NULL)\r
-\r
-#define PyDate_FromTimestamp(args) \\r
- PyDateTimeAPI->Date_FromTimestamp( \\r
- (PyObject*) (PyDateTimeAPI->DateType), args)\r
-\r
-#endif /* Py_BUILD_CORE */\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-#endif\r