/*
 * call-seq:
 *  create(path, option=>value, ...)
 *
 * インデックスファイルの作成。
 *
 * 有効な option:
 * :key_size [Integer] :: キーのサイズ (default: 0)
 * :flags [Integer] :: 次のフラグを「|」で連結したもの。Senna::Index::NORMALIZE, Senna::Index::SPLIT_ALPHA, Senna::Index::SPLIT_DIGIT, Senna::Index::SPLIT_SYMBOL, Senna::Index::NGRAM, Senna::Index::DELIMITED. (default: 0)
 * :initial_n_segments [Integer] :: 初期バッファサイズ (default: 0)
 * :encoding [Integer] :: 次のいずれか。Senna::ENC_DEFAULT(default), Senna::ENC_NONE, Senna::ENC_EUC_JP, Senna::ENC_UTF8, Senna::ENC_SJIS
 *
 * === Argument
 * path [String] :: インデックスファイル名
 *
 * === Return
 * Senna::Index オブジェクト
 *
 * === Exception
 * Senna::Error:: インデックスの作成に失敗した
 */
static VALUE index_create(int argc, VALUE *argv, VALUE klass)
{
    VALUE path, opt;
    VALUE key_size=Qnil, flags, initial_n_segments, encoding;
    char *s_path;
    int _key_size=0, _flags=0, _initial_n_segments=0;
    sen_encoding _encoding=sen_enc_default;
    sen_index *indexp;
    VALUE obj;
    struct index_data *data;
    rb_scan_args(argc, argv, "11", &path, &opt);
    Check_SafeStr(path);
    s_path = RSTRING_PTR(path);
    if (!NIL_P(opt)) {
        Check_Type(opt, T_HASH);
        key_size = rb_hash_aref(opt, ID2SYM(rb_intern("key_size")));
        if (key_size == rb_cInteger)
            _key_size = sizeof(long);
        else {
            _key_size = NIL_P(key_size) ? 0 : NUM2INT(key_size);
            key_size = Qnil;
        }
        flags = rb_hash_aref(opt, ID2SYM(rb_intern("flags")));
        _flags = NIL_P(flags) ? 0 : NUM2INT(flags);
        initial_n_segments = rb_hash_aref(opt, ID2SYM(rb_intern("initial_n_segments")));
        _initial_n_segments = NIL_P(initial_n_segments) ? 0 : NUM2INT(initial_n_segments);
        encoding = rb_hash_aref(opt, ID2SYM(rb_intern("encoding")));
        _encoding = NIL_P(encoding) ? sen_enc_default : NUM2INT(encoding);
    }
    indexp = sen_index_create(s_path, _key_size, _flags, _initial_n_segments, _encoding);
    if (indexp == NULL)
        senna_error(0, "cannot create: %s: %s", s_path, strerror(errno));
    obj = Data_Make_Struct(klass, struct index_data, 0, free_index, data);
    data->closed = 0;
    data->indexp = indexp;
    rb_iv_set(obj, "key_size", INT2NUM(_key_size));
    rb_iv_set(obj, "key_type", key_size);
    return obj;
}