Kouhei Sutou
null+****@clear*****
Tue Feb 3 11:02:55 JST 2015
Kouhei Sutou 2015-02-03 11:02:55 +0900 (Tue, 03 Feb 2015) New Revision: 48913144b90a5b1e20067d87c5f660dff56d129e https://github.com/groonga/groonga/commit/48913144b90a5b1e20067d87c5f660dff56d129e Message: mrb: add Groonga::CommandInput#[] that gets an argument Modified files: lib/mrb/mrb_command_input.c Modified: lib/mrb/mrb_command_input.c (+60 -0) =================================================================== --- lib/mrb/mrb_command_input.c 2015-02-03 00:10:44 +0900 (59b3e27) +++ lib/mrb/mrb_command_input.c 2015-02-03 11:02:55 +0900 (f392023) @@ -45,6 +45,63 @@ mrb_grn_command_input_initialize(mrb_state *mrb, mrb_value self) return self; } +static mrb_value +mrb_grn_command_input_array_reference(mrb_state *mrb, mrb_value self) +{ + grn_ctx *ctx = (grn_ctx *)mrb->ud; + grn_command_input *input; + mrb_value mrb_key_or_offset; + grn_obj *argument; + + input = DATA_PTR(self); + mrb_get_args(mrb, "o", &mrb_key_or_offset); + + switch (mrb_type(mrb_key_or_offset)) { + case MRB_TT_FIXNUM : + { + mrb_int offset = mrb_fixnum(mrb_key_or_offset); + argument = grn_command_input_at(ctx, input, offset); + } + break; + case MRB_TT_SYMBOL : + { + mrb_sym mrb_key_symbol; + const char *key; + mrb_int key_length; + + mrb_key_symbol = mrb_symbol(mrb_key_or_offset); + key = mrb_sym2name_len(mrb, mrb_key_symbol, &key_length); + argument = grn_command_input_get(ctx, input, key, key_length); + } + break; + case MRB_TT_STRING : + { + mrb_value mrb_key = mrb_key_or_offset; + argument = grn_command_input_get(ctx, input, + RSTRING_PTR(mrb_key), + RSTRING_LEN(mrb_key)); + } + break; + default : + mrb_raisef(mrb, E_ARGUMENT_ERROR, + "must be offset (as integer) or key (as symbol or string): %S", + mrb_key_or_offset); + break; + } + + if (!argument) { + return mrb_nil_value(); + } + + if (GRN_TEXT_LEN(argument) == 0) { + return mrb_nil_value(); + } + + return mrb_str_new_static(mrb, + GRN_TEXT_VALUE(argument), + GRN_TEXT_LEN(argument)); +} + void grn_mrb_command_input_init(grn_ctx *ctx) { @@ -58,5 +115,8 @@ grn_mrb_command_input_init(grn_ctx *ctx) mrb_define_method(mrb, klass, "initialize", mrb_grn_command_input_initialize, MRB_ARGS_REQ(1)); + + mrb_define_method(mrb, klass, "[]", + mrb_grn_command_input_array_reference, MRB_ARGS_REQ(1)); } #endif -------------- next part -------------- HTML����������������������������...Download