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_buf_new(mrb, 64); for (i=0; i<RARRAY_LEN(ary); i++) { if (i > 0 && !mrb_nil_p(sep)) { mrb_str_buf_append(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_buf_append(mrb, result, val); break; default: tmp = mrb_check_string_type(mrb, val); if (!mrb_nil_p(tmp)) { val = tmp; goto str_join; } tmp = mrb_check_convert_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary"); 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 void printP(mrb_state *mrb, const char *conv, const char *sep) { mrb_int argc; mrb_value *argv; mrb_get_args(mrb, "*", &argv, &argc); mrb_value buffer = mrb_str_buf_new(mrb, 128); mrb_value arg; for (int i = 0; i < argc; ++i) { arg = argv[i]; arg = mrb_funcall(mrb, arg, conv, 0); mrb_str_buf_append(mrb, buffer, arg); if (i < argc) mrb_str_buf_cat(mrb, buffer, sep, strlen(sep)); } shState->eThread().showMessageBox(RSTRING_PTR(buffer), SDL_MESSAGEBOX_INFORMATION); }
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(); }