はてなのようなキーワードリンクをRubyで付与する実例
と、いうのをつくってもらったので、これをもとにCでsennaのpatricia treeを試すプログラムを書いたよ。

機能的にはとりあえずキーワードの検出だけ。

CODE:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <senna/senna.h>
  4. #include <string.h>
  5. //#include <exectime.h>
  6.  
  7. void create_index(char* index, char* filename){
  8.  
  9.         sen_sym *sym;
  10.  
  11.         if(!(sym = sen_sym_create(index, 0, SEN_INDEX_NORMALIZE, sen_enc_utf8))){
  12.             printf("cannot open or create sym file\m");
  13.             abort();
  14.         }
  15.  
  16.         FILE * fp = fopen(filename, "rb");
  17.  
  18.         char buffer[2048];
  19.        
  20.         sen_id sym_id;
  21.         while(fgets(buffer, 2048, fp)){
  22.             sscanf(buffer, "%s\n", buffer);
  23.            if(!(sym_id = sen_sym_get(sym, buffer))){
  24.                 printf("cannot create link\n");
  25.                 abort();
  26.            }
  27.  
  28. //           printf("%d\t", sym_id);
  29.         }
  30.  
  31.         fclose(fp);
  32.    
  33.         sen_sym_close(sym);
  34.  
  35. }
  36.  
  37. void traverse(char* index, char* filename){
  38.     printf("traverse\n");
  39.     sen_sym* sym;
  40.  
  41.     if(!(sym = sen_sym_open(index))){
  42.         printf("cannot open index file\n");
  43.         abort();
  44.     }
  45.  
  46.     FILE * fp = fopen(filename, "rb");
  47.  
  48.     if(!fp){
  49.         printf("cannot open file\n");
  50.         abort();
  51.     }
  52.  
  53.     fseek(fp, 0, SEEK_END);
  54.  
  55.     int filesize = ftell(fp);
  56.     int offset = 0;
  57.  
  58.     fseek(fp, 0, SEEK_SET);
  59.  
  60.     char * content = new char[filesize + 1];
  61.     const char * cp = content;
  62.  
  63.  
  64.     fread(content, sizeof(char), filesize, fp);
  65.     content[filesize] = '\0';
  66.  
  67.     sen_sym_scan_hit sh[32];
  68.  
  69.     char buffer[2048];
  70.  
  71.     const char * rest;
  72.  
  73.     exectime::start_timer();
  74.  
  75.     while((rest - content) <filesize){
  76.         int found;
  77.         if(!(found = sen_sym_scan(sym, cp, filesize, sh, 32, &rest))){
  78.             break;
  79.         }       
  80.  
  81.         for(int i=0; i<found; i++){
  82.             int key_len = sen_sym_key(sym, sh[i].id, buffer, 2048);
  83.             if(key_len> 0 && sh[i].length> 7){
  84.                printf("%s\n", buffer);
  85.             }
  86.  
  87.         }
  88.         cp = rest;
  89.  
  90.     }
  91.  
  92.     exectime::end_timer();
  93.  
  94.     printf("time: %f sec\n", exectime::time_result());
  95.  
  96.  
  97. }
  98.  
  99. int main(int argc, char** argv){
  100.  
  101.     if(!strcmp(argv[1], "make")){
  102.         create_index(argv[2], argv[3]);
  103.     }else if(!strcmp(argv[1], "traverse")){
  104.         traverse(argv[2], argv[3]);
  105.     }
  106.    
  107. }