static mrb_value mrb_ary_to_h(mrb_state *mrb, mrb_value ary) { mrb_int i; mrb_value v, hash; hash = mrb_hash_new_capa(mrb, 0); for (i = 0; i < RARRAY_LEN(ary); ++i) { v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]); if (mrb_nil_p(v)) { mrb_raisef(mrb, E_TYPE_ERROR, "wrong element type %S at %S (expected array)", mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, RARRAY_PTR(ary)[i])), mrb_fixnum_value(i) ); } if (RARRAY_LEN(v) != 2) { mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong array length at %S (expected 2, was %S)", mrb_fixnum_value(i), mrb_fixnum_value(RARRAY_LEN(v)) ); } mrb_hash_set(mrb, hash, RARRAY_PTR(v)[0], RARRAY_PTR(v)[1]); } return hash; }
static mrb_value mrb_ary_s_try_convert(mrb_state *mrb, mrb_value self) { mrb_value ary; mrb_get_args(mrb, "o", &ary); return mrb_check_array_type(mrb, ary); }
static mrb_value join_ary(mrb_state *mrb, mrb_value ary, mrb_value sep, mrb_value list) { mrb_int i; mrb_value result, val, tmp; /* check recursive */ for (i=0; i<RARRAY_LEN(list); i++) { if (mrb_obj_equal(mrb, ary, RARRAY_PTR(list)[i])) { mrb_raise(mrb, E_ARGUMENT_ERROR, "recursive array join"); } } mrb_ary_push(mrb, list, ary); result = mrb_str_new_capa(mrb, 64); for (i=0; i<RARRAY_LEN(ary); i++) { if (i > 0 && !mrb_nil_p(sep)) { mrb_str_cat_str(mrb, result, sep); } val = RARRAY_PTR(ary)[i]; switch (mrb_type(val)) { case MRB_TT_ARRAY: ary_join: val = join_ary(mrb, val, sep, list); /* fall through */ case MRB_TT_STRING: str_join: mrb_str_cat_str(mrb, result, val); break; default: if (!mrb_immediate_p(val)) { tmp = mrb_check_string_type(mrb, val); if (!mrb_nil_p(tmp)) { val = tmp; goto str_join; } tmp = mrb_check_array_type(mrb, val); if (!mrb_nil_p(tmp)) { val = tmp; goto ary_join; } } val = mrb_obj_as_string(mrb, val); goto str_join; } } mrb_ary_pop(mrb, list); return result; }
static mrb_value mrb_ary_assoc(mrb_state *mrb, mrb_value ary) { mrb_int i; mrb_value v, k; mrb_get_args(mrb, "o", &k); for (i = 0; i < RARRAY_LEN(ary); ++i) { v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]); if (!mrb_nil_p(v) && RARRAY_LEN(v) > 0 && mrb_equal(mrb, RARRAY_PTR(v)[0], k)) return v; } return mrb_nil_value(); }
static mrb_value find_file_check(mrb_state *mrb, mrb_value path, mrb_value fname, mrb_value ext) { FILE *fp; char fpath[MAXPATHLEN]; mrb_value filepath = mrb_str_dup(mrb, path); #ifdef _WIN32 if (RSTRING_PTR(fname)[1] == ':') { #else if (RSTRING_PTR(fname)[0] == '/') { #endif /* when absolute path */ mrb_funcall(mrb, filepath, "replace", 1, fname); } else { mrb_str_cat2(mrb, filepath, "/"); mrb_str_buf_append(mrb, filepath, fname); } if (!mrb_string_p(filepath)) { return mrb_nil_value(); } if (mrb_string_p(ext)) { mrb_str_buf_append(mrb, filepath, ext); } debug("filepath: %s\n", RSTRING_PTR(filepath)); if (realpath(RSTRING_PTR(filepath), fpath) == NULL) { return mrb_nil_value(); } debug("fpath: %s\n", fpath); fp = fopen(fpath, "r"); if (fp == NULL) { return mrb_nil_value(); } fclose(fp); return mrb_str_new_cstr(mrb, fpath); } static mrb_value find_file(mrb_state *mrb, mrb_value filename, int comp) { char *ext, *ptr, *tmp; mrb_value exts; int i, j; char *fname = RSTRING_PTR(filename); mrb_value filepath = mrb_nil_value(); mrb_value load_path = mrb_obj_dup(mrb, mrb_gv_get(mrb, mrb_intern_cstr(mrb, "$:"))); load_path = mrb_check_array_type(mrb, load_path); if(mrb_nil_p(load_path)) { mrb_raise(mrb, E_RUNTIME_ERROR, "invalid $:"); return mrb_undef_value(); } tmp = ptr = fname; while (tmp) { if ((tmp = strchr(ptr, '/')) || (tmp = strchr(ptr, '\\'))) { ptr = tmp + 1; } } ext = strrchr(ptr, '.'); exts = mrb_ary_new(mrb); if (ext == NULL && comp) { mrb_ary_push(mrb, exts, mrb_str_new_cstr(mrb, ".rb")); mrb_ary_push(mrb, exts, mrb_str_new_cstr(mrb, ".mrb")); mrb_ary_push(mrb, exts, mrb_str_new_cstr(mrb, ".so")); } else { mrb_ary_push(mrb, exts, mrb_nil_value()); } /* when a filename start with '.', $: = ['.'] */ if (*fname == '.') { load_path = mrb_ary_new(mrb); mrb_ary_push(mrb, load_path, mrb_str_new_cstr(mrb, ".")); } for (i = 0; i < RARRAY_LEN(load_path); i++) { for (j = 0; j < RARRAY_LEN(exts); j++) { filepath = find_file_check( mrb, mrb_ary_entry(load_path, i), filename, mrb_ary_entry(exts, j)); if (!mrb_nil_p(filepath)) { return filepath; } } } mrb_load_fail(mrb, filename, "cannot load such file"); return mrb_nil_value(); }