index bd16da17e69ffee7f30c29210dc7569c4001caa6..6cc22ad632eabaf17dbaad6f8040f3ac3960db3c 100644 (file)
int *argc,
char ***argv)
{
- PyObject *o;
- int size, i;
-
- size = PyTuple_Size(args);
+ PyObject *o, *lo;
+ int args_count,
+ argv_count,
+ element_count,
+ i, j;
+
+ args_count = PyTuple_Size(args);
+ element_count = 0;
+ for (i = 0; i < args_count; i++) {
+ o = PyTuple_GET_ITEM(args, i);
+ if (PyString_Check(o))
+ element_count++;
+ else if (PyList_CheckExact(o))
+ element_count += PyList_Size(o);
+ else {
+ PyErr_Format(PyExc_TypeError, "argument %d must be string or list of strings", i);
+ return -1;
+ }
+ }
+
*argv = PyMem_New(char *,
- size + 1);
+ element_count + 1);
if (*argv == NULL)
return -1;
- for (i = 0; i < size; i++) {
+ argv_count = 0;
+ for (i = 0; i < args_count; i++) {
o = PyTuple_GET_ITEM(args, i);
- if (PyString_Check(o))
- (*argv)[i + 1] = PyString_AS_STRING(o);
- else {
- PyMem_Del(*argv);
- PyErr_Format(PyExc_TypeError, "argument %d must be string", i);
- return -1;
- }
+ if (PyString_Check(o)) {
+ argv_count++;
+ (*argv)[argv_count] = PyString_AS_STRING(o);
+ } else if (PyList_CheckExact(o))
+ for (j = 0; j < PyList_Size(o); j++) {
+ lo = PyList_GetItem(o, j);
+ if (PyString_Check(lo)) {
+ argv_count++;
+ (*argv)[argv_count] = PyString_AS_STRING(lo);
+ } else {
+ PyMem_Del(*argv);
+ PyErr_Format(PyExc_TypeError, "element %d in argument %d must be string", j, i);
+ return -1;
+ }
+ }
+ else {
+ PyMem_Del(*argv);
+ PyErr_Format(PyExc_TypeError, "argument %d must be string or list of strings", i);
+ return -1;
+ }
}
+
(*argv)[0] = command;
- *argc = size + 1;
+ *argc = element_count + 1;
/* reset getopt state */
opterr = optind = 0;