4

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

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

宣言付き

error_code env_setup(env_t ** env);

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

4

1 に答える 1

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

完全にテストされておらず、エラー処理が欠けていますが、ここでの目的は、Python から C に呼び出すときにadictを anに変換し、C から Python に戻るときに to を変換することです。env_t **env_t **dict

于 2012-04-10T05:53:01.343 に答える