Asellus aquaticus
Asellus aquaticus

Reputation: 53

SWIG typemap from C char* to python string

I am trying to use a C library in Python using SWIG. This C library passes function results through arguments everywhere. Using the online SWIG manual, I have succeeded in getting an integer function result passed to Python, but I am having a hard time figuring out how to do this for a character string.

This is the essence of my code:

myfunc.c:

#include <myfunc.h>

#include <stdio.h>


int mystr(int inp, char *outstr){
   outstr="aaa";
   printf("%s\n", outstr);
   return(0);
}

myfunc.h:

extern int mystr(int inp, char *outstr);

So basically my question is what the typemap for *outstr should look like.

Thanks in advance.

Upvotes: 0

Views: 2419

Answers (2)

Asellus aquaticus
Asellus aquaticus

Reputation: 53

This is how I got it to work, by modifying the example in section 34.9.3 of the SWIG 2.0 manual:

%typemap(in, numinputs=0) char *outstr (char temp) {
   $1 = &temp;
}
%typemap(argout) char *outstr {

    PyObject *o, *o2, *o3;
    o = PyString_FromString($1);
    if ((!$result) || ($result == Py_None)) {
        $result = o;
    } else {
        if (!PyTuple_Check($result)) {
            PyObject *o2 = $result;
            $result = PyTuple_New(1);
            PyTuple_SetItem($result,0,o2);
        }
        o3 = PyTuple_New(1);
        PyTuple_SetItem(o3,0,o);
        o2 = $result;
        $result = PySequence_Concat(o2,o3);
        Py_DECREF(o2);
        Py_DECREF(o3);
    }
}

Upvotes: 0

m7thon
m7thon

Reputation: 3043

Have a look at the SWIG manual 9.3.4 String handling: cstring.i. This provides several typemaps for use with char * arguments.

Probably (assuming you are indeed using strcpy(outstr, "aaa") as mentioned in a comment above) you want in your SWIG interface file, before the function declaration, e.g.:

%include <cstring.i>
%cstring_bounded_output(char* outstr, 1024);

Upvotes: 2

Related Questions