stub ファイルをガシガシ書く

差し当たって、新しいクラスを定義しない範囲で、メソッドを Scheme 側に定義していこうと思います。

出発点

;;;
;;; id3liblib.stub
;;;

"
#include \"id3lib_glue.h\"
"

;; これは多分、stub中でオートボクシングのために使われる定義
;; 実際の定義は、id3lib_glue.cpp の
;; void Scm_Init_id3lib()
;; で行われる。
;; 
;; Gauche 組み込みの foreign pointer framework (?) の恩恵により、
;; C/C++ のオブジェクトをくるむだけの Scheme オブジェクトは
;; このように簡単に定義できる。
;; と言うことだと思う。
(define-type <id3tag> "ID3_Tag*" "ID3Tag"
  "ID3TAG_P" "ID3TAG_UNBOX" "ID3TAG_BOX")

;; これは foreign pointer framework によるオートボクシングの効果。
;; C++ オブジェクトのポインタを返すだけで良い。
;; (本当か?エラー処理は?)
;; 
;; ID3TAG_BOX マクロを展開して出来るコードは
;; Scm_MakeForeignPointer(ID3TagClass, ptr)
;; (id3lib_glue.h)であるが、この関数の中では NULL チェック等はしてくれるようだ。
(define-cproc make-id3tag (name::<const-cstring>)
  (expr <id3tag> "new ID3_Tag(name)"))

;; これは genstub 組み込みのオートボクシング定義
;; $PREFIX/share/gauche/0.8.8/lib/genstub に一覧あり
(define-cproc id3tag-filename (tag::<id3tag>)
  (expr <const-cstring> "tag->GetFileName()"))

;; Local variables:
;; mode: scheme
;; end: