cl-charguessを作ろうとしているが…
libcharguessはlibcharguess.aしか作らないので、無理矢理libcharguess.soを作ってみる。
gcc -shared -o libcharguess.so charguess.o EscSM.o MBCSSM.o GB2312Prober.o Latin1Prober.o SJISProber.o big5Prober.o EUCJPProber.o jpCntx.o MBCSGroupProber.o EUCKRProber.o charDistribution.o universal.o EUCTWProber.o SBCharsetProber.o EscCharsetProber.o SBCSGroupProber.o UTF8Prober.o LangHungarianModel.o LangThaiModel.o LangCyrillicModel.o LangBulgarianModel.o LangGreekModel.o
そして、charguess.lispを作成。
(require :uffi) (defpackage charguess (:use common-lisp uffi)) (in-package :charguess) ;; int CharGuessInit(void); ;; const char* GuessChardet(const char *str); ;; int CharGuessDone(void); (uffi:load-foreign-library "/r/compile/libcharguess/cpp/libcharguess.so") (uffi:def-function ("CharGuessInit" %charguess-init) () :returning :int) (uffi:def-function ("GuessChardet" %guess-chardet) ((str :cstring)) :returning :cstring) (uffi:def-function ("CharGuessDone" %charguess-done) () :returning :int) (defun guess (string) (declare (type string string)) (%charguess-init) (prog1 (%guess-chardet string) (%charguess-done)))
しかし、エラーになってしまった。
Error opening shared object "/r/compile/libcharguess/cpp/libcharguess.so": /r/compile/libcharguess/cpp/libcharguess.so: undefined symbol: _Znwj. [Condition of type SIMPLE-ERROR]
new演算子?
$ echo _Znwj | c++filt operator new(unsigned int)
こうすると解決した。
gcc -shared -o libcharguess.so charguess.o EscSM.o MBCSSM.o GB2312Prober.o Latin1Prober.o SJISProber.o big5Prober.o EUCJPProber.o jpCntx.o MBCSGroupProber.o EUCKRProber.o charDistribution.o universal.o EUCTWProber.o SBCharsetProber.o EscCharsetProber.o SBCSGroupProber.o UTF8Prober.o LangHungarianModel.o LangThaiModel.o LangCyrillicModel.o LangBulgarianModel.o LangGreekModel.o -lstdc++
そして、
CHARGUESS> (guess "な") "UTF-8"
よし!初uffiうまくいった!!
しかし、実際は得体の知れない(external-formatが確定しないからvector)入力を扱わないといけないので、iconv.lispを参考にしてみる。