Remove PyArg_Parse usage from time module. (An extra set of eyeballs on

this would be nice.  I'm a little rusty.)
This commit is contained in:
Skip Montanaro 2007-08-24 21:11:00 +00:00
parent b382b84abe
commit 41cfce9c2b
2 changed files with 55 additions and 10 deletions

View File

@ -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

View File

@ -254,6 +254,29 @@ tmtotuple(struct tm *p)
return v;
}
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 *))
{
@ -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");