/*
 *  call-seq:
 *     MultiSearcher.new(searcher*) -> searcher
 *
 *  Create a new MultiSearcher by passing a list of subsearchers to the
 *  constructor.
 */
static VALUE
frb_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_LEN(rsearcher);
                REALLOC_N(searchers, Searcher *, capa);
                for (j = 0; j < RARRAY_LEN(rsearcher); j++) {
                    VALUE rs = RARRAY_PTR(rsearcher)[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, &frb_ms_mark, &frb_ms_free, s);
    object_add(s, self);
    return self;
}