Hatena::Grouphaskell

eagletmtの日記 このページをアンテナに追加

 | 

2010-08-23

FFI を利用する (3) C でラッパを書く

| 18:14 |  FFI を利用する (3) C でラッパを書く - eagletmtの日記 を含むブックマーク はてなブックマーク -  FFI を利用する (3) C でラッパを書く - eagletmtの日記  FFI を利用する (3) C でラッパを書く - eagletmtの日記 のブックマークコメント

Node だけとれてもしょうがないので,例えばそのノードの textContent を得る関数を定義してみる.

libxml の API では xmlNodeGetContent にあたる.

textContent :: Node -> B.ByteString
textContent (MkNode ptr) = unsafePerformIO $
  bracket (c_xmlNodeGetContent ptr) c_xmlFree B.packCString
foreign import ccall "xmlNodeGetContent" c_xmlNodeGetContent :: Ptr NodeTag -> IO CString
foreign import ccall "xmlFree" c_xmlFree :: Ptr a -> IO ()

これでうまくいってくれればよかったのだけど,なぜか c_xmlFree で落ちる.

libxml/globals.h を見るとなんか #define とかされているようだけど,具体的になぜ失敗するのかよくわからない…

しょうがないので xmlFree を呼ぶだけのラッパを C のほうで書いてそれを呼んだらうまくいった.

#include <libxml/globals.h>

void xmlFree_wrap(void *mem)
{
  xmlFree(mem);
}

ビルドするときは

% gcc -c `xml2-config --cflags` wrapper.c

とコンパイルして,最終的に ghc に wrapper.o も一緒に渡してやればよい.

NourMaNourMa2013/03/29 15:14I just hope whoever wtiers these keeps writing more!

hmdicqgpubhmdicqgpub2013/03/30 14:30iW5Mb1 <a href="http://ygnnewkfwyhb.com/">ygnnewkfwyhb</a>

xpfxoyufxpfxoyuf2013/03/31 22:03Cz3Fh4 , [url=http://flknbtjovirt.com/]flknbtjovirt[/url], [link=http://kdoazlurskqz.com/]kdoazlurskqz[/link], http://fzjqgrfcplbs.com/

qvgopmulirqvgopmulir2013/04/01 10:49Ac343G , [url=http://csqammgdnmrq.com/]csqammgdnmrq[/url], [link=http://kbtjeonmbhzm.com/]kbtjeonmbhzm[/link], http://ntgiiffhvwpi.com/

トラックバック - http://haskell.g.hatena.ne.jp/eagletmt/20100823
 |