Add typemaps to handle the transformation of Python list of strings into a 'char...
authorEnrico Granata <egranata@apple.com>
Tue, 21 Oct 2014 17:49:24 +0000 (17:49 +0000)
committerEnrico Granata <egranata@apple.com>
Tue, 21 Oct 2014 17:49:24 +0000 (17:49 +0000)
llvm-svn: 220306

lldb/scripts/Python/python-typemaps.swig

index 7a6e0d3..df809f4 100644 (file)
   }
 }
 
+%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);
 }
   }
 }
 
+%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