2012-12-30 76 views
0

我想寫一個libedit(一個BSD替代readline與略有不同的API)的包裝,並且有一種方法來添加一個命名函數到C API。包裝C函數,期望C動態回調

例如,在C:

static unsigned char show_help(EditLine *e, int ch) { 
    printf("Help"); 
} 

el = el_init(argv[0], stdin, stdout, stderr); 
el_set(el, EL_ADDFN, "help", "This is help", show_help); 
el_set(el, EL_BIND, "\?", "help", NULL); 

我打電話el_set添加一個函數,然後稍後結合該功能。

我找不到一個很好的方法來讓我包裝EL_ADDFN來動態地綁定Python方法。我可以創建一堆預先命名的C函數,並將它們全部單獨封裝到python方法中,但我更願意儘可能地模擬C API。

有沒有辦法調用EL_ADDFN並確定它正在調用哪個python方法?

回答

0

試試這個:一個單處理函數(我將在下面描述)。包裝EL_ADDFN以便它記錄名稱到python函數的映射,但始終使用一個處理函數。包裹EL_BIND,以便它記錄字符到函數名稱的映射。您的處理函數應該在您的字符中查找ch參數以進行名稱映射,然後查找函數映射的名稱,然後調用該函數。 (如果ADDFN必須綁定之前被調用,您可以創建地圖ch的運作,並直接填充,在該BIND包裝。)

在僞C:

const char *chmap[256]; // initialize to zero 
struct hashtable *namemap; // up to you to find a 
          // hashtable implementation that 
          // will take const char * and map to 
          // PyObject * (function object); 

static unsigned char python_func(EditLine *e, int ch) { 
    const char *name = chmap[ch]; 
    // check for errors 
    PyObject *func = lookup(namemap, name); 
    // check for errors 

    PyObject *editline = convert(e); // or whatever you have 
    PyObject *result = PyObject_CallFunctionObjArgs(func, NULL); 
    // check result, convert to unsigned char, and return 
} 

所以,ADDFN包裝填充散列表,並且BIND操作符填充chmap。