1
/* Copyright (C) 2000-2005 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
/* Written by Sergei A. Golubchik, who has a shared copyright to this code */
19
#include "my_handler.h"
21
typedef struct st_ft_stopwords
27
static TREE *stopwords3=NULL;
29
static int FT_STOPWORD_cmp(void* cmp_arg __attribute__((unused)),
30
FT_STOPWORD *w1, FT_STOPWORD *w2)
32
return ha_compare_text(default_charset_info,
33
(uchar *)w1->pos,w1->len,
34
(uchar *)w2->pos,w2->len,0,0);
37
static void FT_STOPWORD_free(FT_STOPWORD *w, TREE_FREE action,
38
void *arg __attribute__((unused)))
40
if (action == free_free)
41
my_free((uchar*) w->pos, MYF(0));
44
static int ft_add_stopword(const char *w)
48
(((sw.len= (uint) strlen(sw.pos=w)) >= ft_min_word_len) &&
49
(tree_insert(stopwords3, &sw, 0, stopwords3->custom_arg)==NULL));
52
int ft_init_stopwords()
56
if (!(stopwords3=(TREE *)my_malloc(sizeof(TREE),MYF(0))))
58
init_tree(stopwords3,0,0,sizeof(FT_STOPWORD),(qsort_cmp2)&FT_STOPWORD_cmp,
60
(ft_stopword_file ? (tree_element_free)&FT_STOPWORD_free : 0),
68
uchar *buffer, *start, *end;
72
if (!*ft_stopword_file)
75
if ((fd=my_open(ft_stopword_file, O_RDONLY, MYF(MY_WME))) == -1)
77
len=(uint)my_seek(fd, 0L, MY_SEEK_END, MYF(0));
78
my_seek(fd, 0L, MY_SEEK_SET, MYF(0));
79
if (!(start=buffer=my_malloc(len+1, MYF(MY_WME))))
81
len=my_read(fd, buffer, len, MYF(MY_WME));
83
while (ft_simple_get_word(default_charset_info, &start, end, &w, TRUE))
85
if (ft_add_stopword(my_strndup((char*) w.pos, w.len, MYF(0))))
90
my_free(buffer, MYF(0));
92
my_close(fd, MYF(MY_WME));
97
/* compatibility mode: to be removed */
98
char **sws=(char **)ft_precompiled_stopwords;
102
if (ft_add_stopword(*sws))
105
ft_stopword_file="(built-in)"; /* for SHOW VARIABLES */
110
int is_stopword(char *word, uint len)
115
return tree_search(stopwords3,&sw, stopwords3->custom_arg) != NULL;
119
void ft_free_stopwords()
123
delete_tree(stopwords3); /* purecov: inspected */
124
my_free((char*) stopwords3,MYF(0));