[Groonga-commit] groonga/groonga at 4891314 [master] mrb: add Groonga::CommandInput#[] that gets an argument

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index