// swig wrapper for sarray package - Sasa Hasan - 2008 %inline %{ typedef unsigned char uchar; %} %module sarray %{ extern int bsarray(const uchar *b, int *a, int n); extern int sarray(int *a, int n); %} %typemap(in) (const uchar *b, int *outval, int n) { if (!PyString_Check($input)) { PyErr_SetString(PyExc_ValueError, "Expecting a string"); return NULL; } $1 = PyString_AsString($input); $3 = PyString_Size($input); $2 = (int*) malloc($3*sizeof(int)+1); // +1 needed, see sarray.c } %typemap(in) (int *inandoutval, int n) { if (!PySequence_Check($input)) { PyErr_SetString(PyExc_ValueError, "Expecting a sequence"); return NULL; } $2 = PySequence_Size($input)+1; $1 = (int*) malloc($2*sizeof(int)); int i; for (i = 0; i < PyList_Size($input); i++) { PyObject *pobj = PySequence_GetItem($input,i); if (PyNumber_Check(pobj)) { $1[i] = (int) PyInt_AsLong(pobj); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); free($1); return NULL; } } $1[PyList_Size($input)] = 0; } %typemap(argout) (int *outval, int n) { PyObject *sa_list = PyList_New($2); int i; for (i = 0; i < $2; i++) { PyList_SetItem(sa_list, i, PyInt_FromLong($1[i])); } $result = sa_list; } %apply (int *outval, int n) { (int *inandoutval, int n) }; %typemap(freearg) int * { free($1); } int bsarray(const uchar *b, int *outval, int n); int sarray(int *inandoutval, int n);