sada_csaをmakeする

今回はPizza&Chili CorpusのGonzalez氏によってラップされた
sadakane先生版Compressed Suffix Array(CSA)を
利用する方法を解説。(BSD6環境で検証)


まずはパッケージを入手。

$$ fetch http://pizzachili.dcc.uchile.cl/indexes/Compressed_Suffix_Array/sada_csa.tgz
$$ tar xzfv sada_csa.tgz
$$ cd csa040713

解凍すると、既にオブジェクトファイルが入っているのだが
そのままだと使えなかったので再コンパイルし直すことに。

$$ gmake cleanall
$$ gmake
gcc -O9 -DNDEBUG -c suftest3.test.c
In file included from suftest3.test.c:42:
/usr/include/sys/timeb.h:43: error: syntax error before "time_t"
suftest3.test.c: In function `mylaptime':
suftest3.test.c:28: error: structure has no member named `time'
suftest3.test.c:28: error: structure has no member named `time'
...

というエラーがでた。
/usr/include/sys/timeb.hで怒られているので中身を見てみると

42 struct timeb {
43     time_t time;
   ...

となっている。ここでtime_tという型が宣言されていないので
そんなの知らないよと言って怒られている様子。
なのでsuftest3.test.cを編集して
time_tが宣言されているstat.hをincludeしてやる。

41 #if 1
42  #include <sys/stat.h> /* ココ */
43  #include <sys/timeb.h>
44 #else

再度makeする。

$$ gmake
gcc -O9 -DNDEBUG -c suftest3.test.c
suftest3.test.c: In function `locate_extract':
suftest3.test.c:300: error: `HZ' undeclared (first use in this function)
suftest3.test.c:300: error: (Each undeclared identifier is reported only once
suftest3.test.c:300: error: for each function it appears in.)
...

今度はHZなる変数が宣言されていないとのこと。
この変数は、linux環境ではasm/param.hで宣言されていて
タイマ割り込みの周波数を意味しているみたい。
http://www.mech.tohoku-gakuin.ac.jp/contents/linux/control/advance.html
BSD環境では何がそれに該当するのかわからなかったのだが
ぱっとみCSAの動作自体には影響しなさそうだったので
(処理にかかった時間を表示するときに使っている程度)
HZ=1000と適当に定義してみた。

ふたたびsuftest3.test.cを編集して適当な行に

54 #define HZ 1000

といれる。

$$ gmake
gcc -O9 -DNDEBUG -c suftest3.test.c
gcc -O9 -DNDEBUG -c comparray4.c
comparray4.c: In function `csa_btchlookup':
comparray4.c:811: warning: passing arg 4 of `qsort' from incompatible pointer type
comparray4.c: In function `csa_btchlookup3':
comparray4.c:955: warning: passing arg 4 of `qsort' from incompatible pointer type
...

エラーではないがwarningがでた。
qsort関数の第4引数の型がおかしいらしい。
調べてみるとqsort用の比較関数が

794 int intcompare(int *i, int *j)

となっていた。qsortに与える比較関数は
引き数がconst void *でないといけないので、これを

794 /* int intcompare(int *i, int *j) */
795 int intcompare(const void *vi, const void *vj)
796 {
797   int *i = (int *)vi;
798   int *j = (int *)vj;

と変更。
無事、gmake通った!めでたい。
これでライブラリcsa.aができたので
次回はサンプルコードを書いてみるよ。