2012-04-10 13 views
4

Ich versuche, eine C-API (statische Bibliothek) zu umbrechen, von der die Quelle nicht verfügbar ist. Eine der ersten Aufgaben bei der Verwendung der API ist das Einrichten der Umgebungsstruktur.SWIG, Python und Zeiger

env_t * my_env = NULL; 
result = env_setup(&my_env); 

mit Erklärung

error_code env_setup(env_t ** env); 

Ist es sogar möglich, Zeiger dieser Art (env_t **) in SWIG herzustellen, wenn man bedenkt, dass das Layout der env-Struktur verborgen ist?

+1

Dies ist eine gute Frage, jedoch (a) bitte verbessern Sie die Formatierung und (b) gehen Sie bitte zurück zu Ihren vorherigen Fragen und akzeptieren Sie die Antworten, um die Leute zu ermutigen, diese zu beantworten. –

+0

Ich habe es getan. ' –

Antwort

1

Möglicherweise müssen Sie mit Typmaps manipulieren.

%typemap(in) env_t ** (env_t *temp) %{ 
    temp = env_alloc(); 
    PyObject *iter = PyObject_GetIter($input); 
    for (PyObject *item; (item = PyIter_Next(it));) { 
     PyObject *key = PyObject_Str(item); 
     PyObject *val = PyObject_GetItem($input, key); 
     env_set(temp, PyString_AsString(key), PyString_AsString(val), ENV_OVERRIDE); 
     Py_DECREF(val); 
     Py_DECREF(key); 
     Py_DECREF(item); 
    } 
    Py_DECREF(iter); 
    $1 = &temp; 
%} 
%typemap(argout) env_t** %{ 
    PyObject *o = PyDict_New(); 
    for (char **val = env_array(*$1); *val; val++) { 
     char *eq = strchr(*val, '='); 
     *eq = '\0'; 
     PyMapping_SetItemString(o, *val, eq + 1); 
    } 
    env_free(*$1); 
    $result = SWIG_Python_AppendOutput($result, o); 
%} 

Völlig ungetestet und in die Fehlerbehandlung fehlt, aber die Absicht ist es, eine dict in eine env_t ** zu verwandeln, wenn sie von Python C aufrufen und env_t **-dict wenn von C nach Python zurück.

+0

Danke für die Antwort, aber ich konnte es in Cython in <20 Zeilen machen. Wenn jemand dies liest, schlage ich vor, Cython anstelle von SWIG zu verwenden, wenn Sie nur Python-Unterstützung benötigen. –