我正在尝试为某些C结构编写Haskell FFI绑定。一个例子如下:
typedef struct s0{int a;
union{unsigned char b;
struct s0*c;
struct{unsigned char d[1];
}; };}*S;
我的问题是如何在 chs (对于 c2hs )或 hsc (对于 hsc2hs )格式?我查看了c2hs的教程,但要么没有得到足够的信息,要么没有理解它,这会帮助我编写chs文件以进行上述定义。
我可以使用HSFFIG工具生成haskell绑定,但它使用自定义访问方法HSFFIG.FieldAccess.FieldAccess来定义绑定。我更喜欢编写使用核心haskell FFI库的绑定,而不是第三方库。
因此,这个问题是关于如何以hsc格式编写递归结构的绑定,或者只使用核心FFI库的chs格式。
实际定义更复杂,但是一旦我弄清楚如何为c2hs或hsc2hs工具编写上面的结构定义,我就可以从那里开始。我知道需要为内部联合和结构定义可存储的实例,但我不知道如何为上面的递归定义编写包装器。特别是,如何从外部结构访问struct / union内部?我查看了HSFFIG定义,但访问方法是HSFFIG定义的访问方法。所以,我无法弄清楚如何将其转换为仅使用核心FFI库的chs定义。
我在StackOverflow中看到的问题似乎是关于更简单的定义。如果在其他地方有类似的答案,我会很感激指点。
答案 0 :(得分:1)
你无法在c2hs或hsc2hs中伪装一个等效数据结构。但是,可以在c2hs中进行自己的编组,只需要一点点工作。
data MyType = Next MyType | MyChar Char | MyString String | MyEnd
然后使用hsc2hs的newtype指针功能来声明MyType的指针(即s0)。然后,使用hsc2hs的访问器编写显式函数,以递归方式遍历结构并构建Haskell结构。在每个步骤中,您测试是否已经点击空指针,如果是这样,则返回一个MyEnd(或者,根据数据编码,只检查指示联合中的类型的int是否为负数或者其他),否则继续解析无论你拥有什么,如果那是一个指针,那就递归地进行。
你也可以用hsc2hs做同样的事情。