/* * Normalizes the @string@. * * @example * # Normalizes "ABC" with the default normalizer * Groonga::Normalizer.normalize("AbC") # => "abc" * * @overload normalize(string) * @return [String] The normalized string * @param [String] string The original string */ static VALUE rb_grn_normalizer_s_normalize (VALUE klass, VALUE rb_string) { VALUE rb_context = Qnil; VALUE rb_encoded_string; VALUE rb_normalized_string; grn_ctx *context = NULL; grn_obj *grn_string; grn_obj *normalizer = GRN_NORMALIZER_AUTO; /* TODO: make customizable */ int flags = GRN_STRING_REMOVE_BLANK; const char *normalized_string; unsigned int normalized_string_length; context = rb_grn_context_ensure(&rb_context); rb_encoded_string = rb_grn_context_rb_string_encode(context, rb_string); grn_string = grn_string_open(context, RSTRING_PTR(rb_encoded_string), RSTRING_LEN(rb_encoded_string), normalizer, flags); rb_grn_context_check(context, rb_string); grn_string_get_normalized(context, grn_string, &normalized_string, &normalized_string_length, NULL); rb_normalized_string = rb_grn_context_rb_string_new(context, normalized_string, normalized_string_length); grn_obj_close(context, grn_string); return rb_normalized_string; }
/* * call-seq: * snippet.execute(string) -> スニペットの配列 * * _string_を走査し、スニペットを作成する。 */ static VALUE rb_grn_snippet_execute (VALUE self, VALUE rb_string) { RbGrnSnippet *rb_grn_snippet; grn_rc rc; grn_ctx *context; grn_snip *snippet; char *string; unsigned int string_length; unsigned int i, n_results, max_tagged_length; VALUE rb_results; char *result; if (TYPE(rb_string) != T_STRING) { rb_raise(rb_eGrnInvalidArgument, "snippet text must be String: <%s>", rb_grn_inspect(rb_string)); } rb_grn_snippet = SELF(self); context = rb_grn_snippet->context; snippet = rb_grn_snippet->snippet; #ifdef HAVE_RUBY_ENCODING_H rb_string = rb_grn_context_rb_string_encode(context, rb_string); #endif string = StringValuePtr(rb_string); string_length = RSTRING_LEN(rb_string); rc = grn_snip_exec(context, snippet, string, string_length, &n_results, &max_tagged_length); rb_grn_rc_check(rc, self); rb_results = rb_ary_new2(n_results); result = ALLOCA_N(char, max_tagged_length); for (i = 0; i < n_results; i++) { VALUE rb_result; unsigned result_length; rc = grn_snip_get_result(context, snippet, i, result, &result_length); rb_grn_rc_check(rc, self); rb_result = rb_grn_context_rb_string_new(context, result, result_length); rb_ary_push(rb_results, rb_result); } return rb_results; }
void rb_grn_context_text_set (grn_ctx *context, grn_obj *bulk, VALUE rb_string) { rb_string = rb_grn_context_rb_string_encode(context, rb_string); GRN_TEXT_SET(context, bulk, RSTRING_PTR(rb_string), RSTRING_LEN(rb_string)); }