/* * call-seq: * MultiSearcher.new(searcher*) -> searcher * * Create a new MultiSearcher by passing a list of subsearchers to the * constructor. */ static VALUE frt_ms_init(int argc, VALUE *argv, VALUE self) { int i, j, top = 0, capa = argc; VALUE rsearcher; Searcher **searchers = ALLOC_N(Searcher *, capa); Searcher *s; for (i = 0; i < argc; i++) { rsearcher = argv[i]; switch (TYPE(rsearcher)) { case T_ARRAY: capa += RARRAY(rsearcher)->len; REALLOC_N(searchers, Searcher *, capa); for (j = 0; j < RARRAY(rsearcher)->len; j++) { VALUE rs = RARRAY(rsearcher)->ptr[j]; Data_Get_Struct(rs, Searcher, s); searchers[top++] = s; } break; case T_DATA: Data_Get_Struct(rsearcher, Searcher, s); searchers[top++] = s; break; default: rb_raise(rb_eArgError, "Can't add class %s to MultiSearcher", rb_obj_classname(rsearcher)); break; } } s = msea_new(searchers, top, false); Frt_Wrap_Struct(self, &frt_ms_mark, &frt_ms_free, s); object_add(s, self); return self; }