summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/structseq.h4
-rw-r--r--Modules/timemodule.c61
2 files changed, 55 insertions, 10 deletions
diff --git a/Include/structseq.h b/Include/structseq.h
index e662916..a482bd8 100644
--- a/Include/structseq.h
+++ b/Include/structseq.h
@@ -35,6 +35,10 @@ typedef struct {
#define PyStructSequence_SET_ITEM(op, i, v) \
(((PyStructSequence *)(op))->ob_item[i] = v)
+#define PyStructSequence_GET_ITEM(op, i) \
+ (((PyStructSequence *)(op))->ob_item[i])
+
+
#ifdef __cplusplus
}
#endif
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 8ce6667..c7acf3a 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -255,6 +255,29 @@ tmtotuple(struct tm *p)
}
static PyObject *
+structtime_totuple(PyObject *t)
+{
+ PyObject *x = NULL;
+ unsigned int i;
+ PyObject *v = PyTuple_New(9);
+ if (v == NULL)
+ return NULL;
+
+ for (i=0; i<9; i++) {
+ x = PyStructSequence_GET_ITEM(t, i);
+ Py_INCREF(x);
+ PyTuple_SET_ITEM(v, i, x);
+ }
+
+ if (PyErr_Occurred()) {
+ Py_XDECREF(v);
+ return NULL;
+ }
+
+ return v;
+}
+
+static PyObject *
time_convert(double when, struct tm * (*function)(const time_t *))
{
struct tm *p;
@@ -332,18 +355,36 @@ gettmarg(PyObject *args, struct tm *p)
{
int y;
memset((void *) p, '\0', sizeof(struct tm));
+ PyObject *t = NULL;
- if (!PyArg_Parse(args, "(iiiiiiiii)",
- &y,
- &p->tm_mon,
- &p->tm_mday,
- &p->tm_hour,
- &p->tm_min,
- &p->tm_sec,
- &p->tm_wday,
- &p->tm_yday,
- &p->tm_isdst))
+ if (PyTuple_Check(args)) {
+ t = args;
+ Py_INCREF(t);
+ }
+ else if (Py_Type(args) == &StructTimeType) {
+ t = structtime_totuple(args);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "Tuple or struct_time argument required");
return 0;
+ }
+
+ if (t == NULL || !PyArg_ParseTuple(t, "iiiiiiiii",
+ &y,
+ &p->tm_mon,
+ &p->tm_mday,
+ &p->tm_hour,
+ &p->tm_min,
+ &p->tm_sec,
+ &p->tm_wday,
+ &p->tm_yday,
+ &p->tm_isdst)) {
+ Py_XDECREF(t);
+ return 0;
+ }
+ Py_DECREF(t);
+
if (y < 1900) {
PyObject *accept = PyDict_GetItemString(moddict,
"accept2dyear");