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を参考にしてみる。