Tags : QDBM

このTagsの登録数:1件 表示 : 1 - 1 / 1

Hyper EstraierをIntel Macでビルド

post : 2006-04-30 0:53 | , ,

Hyper Estraier 1.2.3がIntel Macでうまく動かない問題。
ビルド自体はできるのだが、正常に動作しない。make check-macをテストすると途中でエラーになる。実際に使ってみてもインデックスは作成されるが検索がまったくヒットしないという状態。QDBM 1.8.49のmake check-macも失敗しているのでまずはこちらから。

調べていくうち、cabin.cのcbsetvnumbuf()という関数に辿り着いた。これは数値をバッファに書き込む関数で、1バイト〜可変長に対応。数が大きい場合は128で割って、負の数値にしてまだ続きがあることを示しつつ書き込んでいる。書き込まれたバッファをダンプして見てみると、負の数値にするべきところがなっていなかった。
・Mac固有の問題を引き起こしそうなコードではない
・エンディアンの問題でもない
・ソースコードの書き方に問題はなさそうだし、あればとっくに解決されているはず
などをふまえて、「Mac OS Tiger Intelのgcc 4.0.1でこのソースコードをビルドすると、(プリプロセッサのバグだとか解釈だとかそんな理由で)意図した通りの実行コードを書き出せていないのではないか」というのが私の結論。まずはコンパイラオプションを確認するべきかとは思うがよく分からない。ソースコードの表現を変えてビルドしてみた。

static int cbsetvnumbuf(char *buf, int num){
  div_t d;
  int len;
  assert(buf && num >= 0);
  if(num == 0){
    ((signed char *)buf)[0] = 0;
    return 1;
  }
  len = 0;
  while(num > 0){
    d = div(num, 128);
    num = d.quot;
-    ((signed char *)buf)[len] = d.rem;
-    if(num > 0) ((signed char *)buf)[len] = -(((signed char *)buf)[len]) - 1; 
+    signed char fill;
+    if(num > 0){
+        fill= -(d.rem) - 1;
+    }else{
+        fill=d.rem;
+    }
+    ((signed char *)buf)[len] = fill;
    len++;
  }
  return len;
}

villa.cにもvlsetvnumbuf()という似たような関数があったのでこちらも表現を変える。これでmake check-mac完全クリア。Hyper Estraier側でもestraier.cのest_set_vnumbuf()が同じ処理をしているので編集。これでいちおう使えるようになった。なんでオリジナルのコードでは上手く行かないのかは分からないままだけど。これでもまだHyper Estraierのmake check-macの途中でこけるので完全ではないが……。

んで、使ってみた感想は、速いに尽きる。メモリをけっこう喰ってるぽいものの、内容検索に絞ればSpotlightは敵じゃない。mdimporterでブリッジしてテキストを流し込んだりしてみようかな。