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で入手可能なライブラリはすべて共通のインターフェイスが使えるので
ほかのライブラリの動作確認にも、このサンプルは使えるはず。