Add typemaps to handle the transformation of Python list of strings into a 'char const **'. This fixes zephyr's issue with SBTarget::Launch without splitting the API into multiple names

llvm-svn: 220306
This commit is contained in:
Enrico Granata 2014-10-21 17:49:24 +00:00
parent 256451561c
commit dd86f33902
1 changed files with 74 additions and 0 deletions

View File

@ -25,6 +25,23 @@
}
}
%typemap(typecheck) char ** {
/* Check if is a list */
$1 = 1;
if (PyList_Check($input)) {
int size = PyList_Size($input);
int i = 0;
for (i = 0; i < size; i++) {
PyObject *o = PyList_GetItem($input,i);
if (!PyString_Check(o)) { $1 = 0; }
}
}
else
{
$1 = ( ($input == Py_None) ? 1 : 0);
}
}
%typemap(freearg) char** {
free((char *) $1);
}
@ -40,6 +57,63 @@
}
}
%typemap(in) char const ** {
/* Check if is a list */
if (PyList_Check($input)) {
int size = PyList_Size($input);
int i = 0;
$1 = (char **) malloc((size+1) * sizeof(char*));
for (i = 0; i < size; i++) {
PyObject *o = PyList_GetItem($input,i);
if (PyString_Check(o))
$1[i] = PyString_AsString(o);
else {
PyErr_SetString(PyExc_TypeError,"list must contain strings");
free($1);
return NULL;
}
}
$1[i] = 0;
} else if ($input == Py_None) {
$1 = NULL;
} else {
PyErr_SetString(PyExc_TypeError,"not a list");
return NULL;
}
}
%typemap(typecheck) char const ** {
/* Check if is a list */
$1 = 1;
if (PyList_Check($input)) {
int size = PyList_Size($input);
int i = 0;
for (i = 0; i < size; i++) {
PyObject *o = PyList_GetItem($input,i);
if (!PyString_Check(o)) { $1 = 0; }
}
}
else
{
$1 = ( ($input == Py_None) ? 1 : 0);
}
}
%typemap(freearg) char const ** {
free((char *) $1);
}
%typemap(out) char const ** {
int len;
int i;
len = 0;
while ($1[len]) len++;
$result = PyList_New(len);
for (i = 0; i < len; i++) {
PyList_SetItem($result, i, PyString_FromString($1[i]));
}
}
/* Typemap definitions to allow SWIG to properly handle char buffer. */
// typemap for a char buffer