~snowball-yiddish-dev/snowball-yiddish/trunk

« back to all changes in this revision

Viewing changes to snowball/libstemmer/libstemmer.c

  • Committer: richard
  • Date: 2003-03-30 12:08:09 UTC
  • Revision ID: svn-v4:633ccae0-01f4-0310-8c99-d3591da6f01f:trunk:216
This module will contain only the code and build system, and documentation
for building and running the stemming library.
All sample data will be in a separate module, and the website will be in
its own module too.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
#include "libstemmer.h"
 
3
#include "../runtime/api.h"
 
4
#include "modules.h"
 
5
 
 
6
struct sb_stemmer {
 
7
    struct SN_env * (*create)(void);
 
8
    void (*close)(struct SN_env *);
 
9
    int (*stem)(struct SN_env *);
 
10
 
 
11
    struct SN_env * env;
 
12
};
 
13
 
 
14
/** Create a new stemmer object, using the specified algorithm.
 
15
 *
 
16
 *  @return If the specified algorithm is not recognised, 0 will be 
 
17
 *  returned; otherwise a pointer to a newly created stemmer for that
 
18
 *  algorithm will be returned.
 
19
 */
 
20
struct sb_stemmer * sb_stemmer_create(const char * algorithm)
 
21
{
 
22
    struct stemmer_modules * module;
 
23
    struct sb_stemmer * stemmer =
 
24
            (struct sb_stemmer *) malloc(sizeof(struct sb_stemmer));
 
25
    if (stemmer == 0) return 0;
 
26
 
 
27
    for (module = modules; module->name != 0; module++) {
 
28
        if (strcmp(module->name, algorithm) == 0) break;
 
29
    }
 
30
    if (module->name == 0) return 0;
 
31
    
 
32
    stemmer->create = module->create;
 
33
    stemmer->close = module->close;
 
34
    stemmer->stem = module->stem;
 
35
 
 
36
    stemmer->env = stemmer->create();
 
37
 
 
38
    return stemmer;
 
39
}
 
40
 
 
41
/** Release a stemmer.
 
42
 *
 
43
 *  This frees all resources allocated for the stemmer.  After calling
 
44
 *  this function, the supplied stemmer may no longer be used in any way.
 
45
 *
 
46
 *  It is safe to pass a null pointer to this function - this will have
 
47
 *  no effect.
 
48
 */
 
49
void sb_stemmer_release(struct sb_stemmer * stemmer)
 
50
{
 
51
    if (stemmer == 0) return;
 
52
    if (stemmer->close == 0) return;
 
53
    stemmer->close(stemmer->env);
 
54
    stemmer->close = 0;
 
55
    free(stemmer);
 
56
}
 
57
 
 
58
/** Stem a word.
 
59
 *
 
60
 *  The return value is owned by the stemmer - it must not be freed or
 
61
 *  modified, and it will become invalid when the stemmer is called again,
 
62
 *  or if the stemmer is freed.
 
63
 */
 
64
const sb_symbol *
 
65
sb_stemmer_stem(struct sb_stemmer * stemmer, const sb_symbol * word, int size)
 
66
{
 
67
    SN_set_current(stemmer->env, size, word);
 
68
    (void) stemmer->stem(stemmer->env);
 
69
    stemmer->env->p[stemmer->env->l] = 0;
 
70
    return stemmer->env->p;
 
71
}