2012-04-10 6 views
4

ソースが利用できないC API(静的ライブラリ)をラップしようとしています。 APIを使用する際の最初のタスクの1つは、環境構造を設定することです。宣言SWIG、Python、Pointers

error_code env_setup(env_t ** env); 

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

はENV構造のレイアウトが隠されていることを考えると、SWIGで(env_t **)このタイプのポインタを製造することも可能ですか?

+1

ただし、(a)書式を改善してください。(b)以前の質問に戻り、回答を受け入れて回答を促してください。 –

+0

私はそうしました。 ' –

答えて

1

タイプマップで何らかの操作が必要な場合があります。

%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); 
%} 

完全にテストされていないとエラー処理に欠けているが、ここでの意図は、CからのPythonに戻ったときにCへ、そしてenv_t **からdictへのPythonから呼び出すときenv_t **dictを変換することです。

+0

返信いただきありがとうございますが、私はCythonで20行未満でした。誰かがこれを読んでいれば、Pythonのサポートだけが必要な場合は、SWIGの代わりにCythonを使うことをお勧めします。 –

関連する問題