ft_stopwords.c 3.3 KB
Newer Older
unknown's avatar
unknown committed
1
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
unknown's avatar
unknown committed
2

unknown's avatar
unknown committed
3 4 5 6
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
unknown's avatar
unknown committed
7

unknown's avatar
unknown committed
8 9 10 11
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
unknown's avatar
unknown committed
12

unknown's avatar
unknown committed
13 14 15 16 17 18 19
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

/* Written by Sergei A. Golubchik, who has a shared copyright to this code */

#include "ftdefs.h"
20
#include "my_handler.h"
unknown's avatar
unknown committed
21

22 23
typedef struct st_ft_stopwords
{
unknown's avatar
unknown committed
24 25 26 27 28 29
  const char * pos;
  uint   len;
} FT_STOPWORD;

static TREE *stopwords3=NULL;

30 31
static int FT_STOPWORD_cmp(void* cmp_arg __attribute__((unused)),
			   FT_STOPWORD *w1, FT_STOPWORD *w2)
unknown's avatar
unknown committed
32
{
33 34
  return mi_compare_text(default_charset_info,
			 (uchar *)w1->pos,w1->len,
35
			 (uchar *)w2->pos,w2->len,0,0);
unknown's avatar
unknown committed
36 37
}

38 39
static void FT_STOPWORD_free(FT_STOPWORD *w, TREE_FREE action,
                             void *arg __attribute__((unused)))
unknown's avatar
unknown committed
40
{
41 42 43
  if (action == free_free)
    my_free((gptr) w->pos, MYF(0));
}
unknown's avatar
unknown committed
44

45 46 47 48 49 50 51
static int ft_add_stopword(const char *w)
{
  FT_STOPWORD sw;
  return !w ||
         (((sw.len= (uint) strlen(sw.pos=w)) >= ft_min_word_len) &&
          (tree_insert(stopwords3, &sw, 0, stopwords3->custom_arg)==NULL));
}
unknown's avatar
unknown committed
52

53 54 55
int ft_init_stopwords()
{
  if (!stopwords3)
unknown's avatar
unknown committed
56
  {
57 58
    if (!(stopwords3=(TREE *)my_malloc(sizeof(TREE),MYF(0))))
      return -1;
59
    init_tree(stopwords3,0,0,sizeof(FT_STOPWORD),(qsort_cmp2)&FT_STOPWORD_cmp,
60 61 62
              0,
              (ft_stopword_file ? (tree_element_free)&FT_STOPWORD_free : 0),
              NULL);
unknown's avatar
unknown committed
63 64
  }

65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
  if (ft_stopword_file)
  {
    File fd;
    uint len;
    byte *buffer, *start, *end;
    FT_WORD w;
    int error=-1;

    if (!*ft_stopword_file)
      return 0;

    if ((fd=my_open(ft_stopword_file, O_RDONLY, MYF(MY_WME))) == -1)
      return -1;
    len=(uint)my_seek(fd, 0L, MY_SEEK_END, MYF(0));
    my_seek(fd, 0L, MY_SEEK_SET, MYF(0));
    if (!(start=buffer=my_malloc(len+1, MYF(MY_WME))))
      goto err0;
    len=my_read(fd, buffer, len, MYF(MY_WME));
    end=start+len;
84
    while (ft_simple_get_word(default_charset_info, &start, end, &w, TRUE))
85 86 87 88 89 90 91 92 93 94 95 96
    {
      if (ft_add_stopword(my_strdup_with_length(w.pos, w.len, MYF(0))))
        goto err1;
    }
    error=0;
err1:
    my_free(buffer, MYF(0));
err0:
    my_close(fd, MYF(MY_WME));
    return error;
  }
  else
unknown's avatar
unknown committed
97
  {
98 99 100 101
    /* compatibility mode: to be removed */
    char **sws=(char **)ft_precompiled_stopwords;

    for (;*sws;sws++)
unknown's avatar
unknown committed
102
    {
103 104
      if (ft_add_stopword(*sws))
        return -1;
unknown's avatar
unknown committed
105
    }
106
    ft_stopword_file="(built-in)"; /* for SHOW VARIABLES */
unknown's avatar
unknown committed
107 108 109 110 111 112 113 114 115
  }
  return 0;
}

int is_stopword(char *word, uint len)
{
  FT_STOPWORD sw;
  sw.pos=word;
  sw.len=len;
116
  return tree_search(stopwords3,&sw, stopwords3->custom_arg) != NULL;
unknown's avatar
unknown committed
117 118
}

119 120 121 122 123

void ft_free_stopwords()
{
  if (stopwords3)
  {
124
    delete_tree(stopwords3); /* purecov: inspected */
unknown's avatar
unknown committed
125
    my_free((char*) stopwords3,MYF(0));
126 127
    stopwords3=0;
  }
128
  ft_stopword_file= 0;
129
}