sada_csaのサンプルコード

今回はPizza&Chili CorpusのGonzalez氏によってラップされた
sadakane先生版Compressed Suffix Array(CSA)のサンプルコードを
付属のREADMEにしたがって書いてみる。


まずインターフェイスが記述されたヘッダファイルを入手。パスの通っている場所に置く。

$$ fetch http://pizzachili.dcc.uchile.cl/utils/interface.h
$$ sudo cp interface.h /usr/include/interface.h

お次にサンプルコードを書く。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <interdace.h>
 4
 5 int main() {
 6   char  *str = "abracadabra";
 7   char  *key = "abra";
 8   void  *index;
 9   ulong *pocc;
10   ulong numocc;
11   int   i;
12
13   build_index(str, strlen(str), "filename=abra", index);
14   locate(index, key, strlen(key), &pocc,&numocc);
15   for (i = 0; i < numocc; i++) {
16     printf("%s\n", str + pocc[i]);
17   }
18   free(pocc);
19   free_index(index);
20   return 0;
21 }

これをtest.cとして保存。コンパイルする。

$$ gcc -lm test.c csa.a -o test
csa.a(suftest3.test.o)(.text+0x31): In function `mygettime':
: undefined reference to `ftime'

今度はftimeなんて知らないよ、と怒られた。
調べてみるとftime関数はobsoleteされてるらしい。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/ftime.3.html
なので、またまたsuftest3.test.cを編集して
time関数で代用してやる。

68 void mygettime(mytimestruct *t)
69 {
70   /* ftime(t); */
71   time(&(t->time));
72 }

suftest3.test.cを編集したのでcsa.aのコンパイルからやり直す。

$$ gmake cleanall
$$ gmake
$$ gcc -lm test.c csa.a -o test

これで無事コンパイル通った!めでたし。めでたし。

最後に実行確認。

$$ ./test
abra
abracadabra

build_index()でindexが作られる。
filename=abraとしているので
abra.idx、abra.psiというインデックスファイルが作られる。
これを引数に指定しlocate()を呼び出すことで
poccの指す先にキーワードabraの出現位置の配列が作られる。
サンプルでは、これらの出現位置から末尾までの文字列を表示している。
poccの中身はソートされていないらしくabracadabraより先にabraが表示されている。

以上。
Pizza&Chili Corpusで入手可能なライブラリはすべて共通のインターフェイスが使えるので
ほかのライブラリの動作確認にも、このサンプルは使えるはず。