static mrb_value mrb_file__gethome(mrb_state *mrb, mrb_value klass) { mrb_int argc; char *home; mrb_value path; #ifndef _WIN32 mrb_value username; argc = mrb_get_args(mrb, "|S", &username); if (argc == 0) { home = getenv("HOME"); if (home == NULL) { return mrb_nil_value(); } if (!mrb_file_is_absolute_path(home)) { mrb_raise(mrb, E_ARGUMENT_ERROR, "non-absolute home"); } } else { const char *cuser = mrb_str_to_cstr(mrb, username); struct passwd *pwd = getpwnam(cuser); if (pwd == NULL) { return mrb_nil_value(); } home = pwd->pw_dir; if (!mrb_file_is_absolute_path(home)) { mrb_raisef(mrb, E_ARGUMENT_ERROR, "non-absolute home of ~%S", username); } } home = mrb_locale_from_utf8(home, -1); path = mrb_str_new_cstr(mrb, home); mrb_locale_free(home); return path; #else argc = mrb_get_argc(mrb); if (argc == 0) { home = getenv("USERPROFILE"); if (home == NULL) { return mrb_nil_value(); } if (!mrb_file_is_absolute_path(home)) { mrb_raise(mrb, E_ARGUMENT_ERROR, "non-absolute home"); } } else { return mrb_nil_value(); } home = mrb_locale_from_utf8(home, -1); path = mrb_str_new_cstr(mrb, home); mrb_locale_free(home); return path; #endif }
static mrb_value mrb_ary_first(mrb_state *mrb, mrb_value self) { struct RArray *a = mrb_ary_ptr(self); mrb_int size, alen; if (mrb_get_argc(mrb) == 0) { return (ARY_LEN(a) > 0)? ARY_PTR(a)[0]: mrb_nil_value(); } mrb_get_args(mrb, "|i", &size); if (size < 0) { mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size"); } alen = ARY_LEN(a); if (size > alen) size = alen; if (ARY_SHARED_P(a)) { return ary_subseq(mrb, a, 0, size); } return mrb_ary_new_from_values(mrb, size, ARY_PTR(a)); }