ft_stopwords.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* Written by Sergei A. Golubchik, who has a shared copyright to this code */
  14. #include "ftdefs.h"
  15. #include "my_handler.h"
  16. typedef struct st_ft_stopwords
  17. {
  18.   const char * pos;
  19.   uint   len;
  20. } FT_STOPWORD;
  21. static TREE *stopwords3=NULL;
  22. static int FT_STOPWORD_cmp(void* cmp_arg __attribute__((unused)),
  23.    FT_STOPWORD *w1, FT_STOPWORD *w2)
  24. {
  25.   return mi_compare_text(default_charset_info,
  26.  (uchar *)w1->pos,w1->len,
  27.  (uchar *)w2->pos,w2->len,0,0);
  28. }
  29. static void FT_STOPWORD_free(FT_STOPWORD *w, TREE_FREE action,
  30.                              void *arg __attribute__((unused)))
  31. {
  32.   if (action == free_free)
  33.     my_free((gptr) w->pos, MYF(0));
  34. }
  35. static int ft_add_stopword(const char *w)
  36. {
  37.   FT_STOPWORD sw;
  38.   return !w ||
  39.          (((sw.len= (uint) strlen(sw.pos=w)) >= ft_min_word_len) &&
  40.           (tree_insert(stopwords3, &sw, 0, stopwords3->custom_arg)==NULL));
  41. }
  42. int ft_init_stopwords()
  43. {
  44.   if (!stopwords3)
  45.   {
  46.     if (!(stopwords3=(TREE *)my_malloc(sizeof(TREE),MYF(0))))
  47.       return -1;
  48.     init_tree(stopwords3,0,0,sizeof(FT_STOPWORD),(qsort_cmp2)&FT_STOPWORD_cmp,
  49.               0,
  50.               (ft_stopword_file ? (tree_element_free)&FT_STOPWORD_free : 0),
  51.               NULL);
  52.   }
  53.   if (ft_stopword_file)
  54.   {
  55.     File fd;
  56.     uint len;
  57.     byte *buffer, *start, *end;
  58.     FT_WORD w;
  59.     int error=-1;
  60.     if (!*ft_stopword_file)
  61.       return 0;
  62.     if ((fd=my_open(ft_stopword_file, O_RDONLY, MYF(MY_WME))) == -1)
  63.       return -1;
  64.     len=(uint)my_seek(fd, 0L, MY_SEEK_END, MYF(0));
  65.     my_seek(fd, 0L, MY_SEEK_SET, MYF(0));
  66.     if (!(start=buffer=my_malloc(len+1, MYF(MY_WME))))
  67.       goto err0;
  68.     len=my_read(fd, buffer, len, MYF(MY_WME));
  69.     end=start+len;
  70.     while (ft_simple_get_word(default_charset_info, &start, end, &w))
  71.     {
  72.       if (ft_add_stopword(my_strdup_with_length(w.pos, w.len, MYF(0))))
  73.         goto err1;
  74.     }
  75.     error=0;
  76. err1:
  77.     my_free(buffer, MYF(0));
  78. err0:
  79.     my_close(fd, MYF(MY_WME));
  80.     return error;
  81.   }
  82.   else
  83.   {
  84.     /* compatibility mode: to be removed */
  85.     char **sws=(char **)ft_precompiled_stopwords;
  86.     for (;*sws;sws++)
  87.     {
  88.       if (ft_add_stopword(*sws))
  89.         return -1;
  90.     }
  91.     ft_stopword_file="(built-in)"; /* for SHOW VARIABLES */
  92.   }
  93.   return 0;
  94. }
  95. int is_stopword(char *word, uint len)
  96. {
  97.   FT_STOPWORD sw;
  98.   sw.pos=word;
  99.   sw.len=len;
  100.   return tree_search(stopwords3,&sw, stopwords3->custom_arg) != NULL;
  101. }
  102. void ft_free_stopwords()
  103. {
  104.   if (stopwords3)
  105.   {
  106.     delete_tree(stopwords3); /* purecov: inspected */
  107.     my_free((char*) stopwords3,MYF(0));
  108.     stopwords3=0;
  109.   }
  110.   ft_stopword_file= 0;
  111. }