mittens 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/ext/mittens/ext.c +27 -19
- data/lib/mittens/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a293e52f3e6ecf7669615bbf24aae34a9fcef78305b7324f7f739fc97e7eb0fc
|
|
4
|
+
data.tar.gz: e5f1ba1b94ac634316599a25d969c1d71d4a0ff591ef043011c2481fe641814d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4c392905c194b9eb723f44e7e97fd040395757751a43a034c34dfef51f399f24e2be4e390414e6e34e79bd26410987d696cd23fa197396ff9510f60a5503730e
|
|
7
|
+
data.tar.gz: 9dbff4611a7d1b43d42d19fa0e873a3c5055b2358b5b0d75e3080e9686ccd315be564dbd93af62e28a63c3e1b50706968a2b6dbcd01f9dc7cd41420bf782ac09
|
data/CHANGELOG.md
CHANGED
data/ext/mittens/ext.c
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
#include <limits.h>
|
|
2
|
+
|
|
1
3
|
#include "libstemmer.h"
|
|
2
4
|
#include "ruby/ruby.h"
|
|
3
5
|
|
|
4
6
|
typedef struct stemmer {
|
|
5
|
-
struct sb_stemmer
|
|
7
|
+
struct sb_stemmer* stemmer;
|
|
6
8
|
} stemmer_t;
|
|
7
9
|
|
|
8
|
-
static void stemmer_free(void
|
|
10
|
+
static void stemmer_free(void* ptr)
|
|
9
11
|
{
|
|
10
|
-
stemmer_t
|
|
12
|
+
stemmer_t* stemmer = (stemmer_t*) ptr;
|
|
11
13
|
// safe to pass null pointer according to docs
|
|
12
14
|
sb_stemmer_delete(stemmer->stemmer);
|
|
13
15
|
xfree(ptr);
|
|
@@ -23,7 +25,7 @@ const rb_data_type_t stemmer_data_type = {
|
|
|
23
25
|
|
|
24
26
|
static VALUE stemmer_allocate(VALUE klass)
|
|
25
27
|
{
|
|
26
|
-
stemmer_t
|
|
28
|
+
stemmer_t* stemmer;
|
|
27
29
|
VALUE obj = TypedData_Make_Struct(klass, stemmer_t, &stemmer_data_type, stemmer);
|
|
28
30
|
stemmer->stemmer = NULL;
|
|
29
31
|
return obj;
|
|
@@ -34,16 +36,17 @@ static VALUE stemmer_initialize(int argc, VALUE* argv, VALUE self)
|
|
|
34
36
|
VALUE opts;
|
|
35
37
|
rb_scan_args(argc, argv, ":", &opts);
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
VALUE language = Qnil;
|
|
40
|
+
const char* algorithm = "english";
|
|
38
41
|
if (!NIL_P(opts)) {
|
|
39
|
-
|
|
42
|
+
language = rb_hash_aref(opts, ID2SYM(rb_intern("language")));
|
|
40
43
|
if (!NIL_P(language)) {
|
|
41
44
|
Check_Type(language, T_STRING);
|
|
42
45
|
algorithm = RSTRING_PTR(language);
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
48
|
|
|
46
|
-
stemmer_t
|
|
49
|
+
stemmer_t* stemmer;
|
|
47
50
|
TypedData_Get_Struct(self, stemmer_t, &stemmer_data_type, stemmer);
|
|
48
51
|
|
|
49
52
|
// in case called multiple times
|
|
@@ -55,28 +58,33 @@ static VALUE stemmer_initialize(int argc, VALUE* argv, VALUE self)
|
|
|
55
58
|
rb_raise(rb_eArgError, "unknown language: %s", algorithm);
|
|
56
59
|
}
|
|
57
60
|
|
|
61
|
+
// must be placed after last use of algorithm
|
|
62
|
+
RB_GC_GUARD(language);
|
|
63
|
+
|
|
58
64
|
return self;
|
|
59
65
|
}
|
|
60
66
|
|
|
61
67
|
static VALUE stemmer_stem(VALUE self, VALUE value)
|
|
62
68
|
{
|
|
63
|
-
stemmer_t
|
|
69
|
+
stemmer_t* stemmer;
|
|
64
70
|
TypedData_Get_Struct(self, stemmer_t, &stemmer_data_type, stemmer);
|
|
65
71
|
|
|
66
72
|
Check_Type(value, T_STRING);
|
|
67
73
|
|
|
68
|
-
const sb_symbol
|
|
69
|
-
|
|
70
|
-
|
|
74
|
+
const sb_symbol* word = (const sb_symbol*) RSTRING_PTR(value);
|
|
75
|
+
long size = RSTRING_LEN(value);
|
|
76
|
+
if (size > INT_MAX)
|
|
77
|
+
rb_raise(rb_eArgError, "string exceeds max length");
|
|
78
|
+
const sb_symbol* pointer_out = sb_stemmer_stem(stemmer->stemmer, word, (int) size);
|
|
71
79
|
|
|
72
|
-
return rb_utf8_str_new_cstr((char
|
|
80
|
+
return rb_utf8_str_new_cstr((char*) pointer_out);
|
|
73
81
|
}
|
|
74
82
|
|
|
75
83
|
static VALUE stemmer_languages(VALUE klass)
|
|
76
84
|
{
|
|
77
85
|
VALUE out = rb_ary_new();
|
|
78
86
|
|
|
79
|
-
const char
|
|
87
|
+
const char** language = sb_stemmer_list();
|
|
80
88
|
while (*language != NULL) {
|
|
81
89
|
rb_ary_push(out, rb_utf8_str_new_cstr(*language));
|
|
82
90
|
language++;
|
|
@@ -87,10 +95,10 @@ static VALUE stemmer_languages(VALUE klass)
|
|
|
87
95
|
|
|
88
96
|
void Init_ext(void)
|
|
89
97
|
{
|
|
90
|
-
VALUE
|
|
91
|
-
VALUE
|
|
92
|
-
rb_define_alloc_func(
|
|
93
|
-
rb_define_method(
|
|
94
|
-
rb_define_method(
|
|
95
|
-
rb_define_singleton_method(
|
|
98
|
+
VALUE mMittens = rb_define_module("Mittens");
|
|
99
|
+
VALUE cStemmer = rb_define_class_under(mMittens, "Stemmer", rb_cObject);
|
|
100
|
+
rb_define_alloc_func(cStemmer, stemmer_allocate);
|
|
101
|
+
rb_define_method(cStemmer, "initialize", stemmer_initialize, -1);
|
|
102
|
+
rb_define_method(cStemmer, "stem", stemmer_stem, 1);
|
|
103
|
+
rb_define_singleton_method(cStemmer, "languages", stemmer_languages, 0);
|
|
96
104
|
}
|
data/lib/mittens/version.rb
CHANGED