diff --git a/mrbgems/mruby-io/mrblib/file.rb b/mrbgems/mruby-io/mrblib/file.rb index 719f4e629..e5594ca50 100644 --- a/mrbgems/mruby-io/mrblib/file.rb +++ b/mrbgems/mruby-io/mrblib/file.rb @@ -149,7 +149,7 @@ class File < IO if drive_prefix.empty? expanded_path else - drive_prefix + expanded_path.gsub("/", File::ALT_SEPARATOR) + drive_prefix + expanded_path end end diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c index 4d744eb48..7afc2de10 100644 --- a/mrbgems/mruby-io/src/file.c +++ b/mrbgems/mruby-io/src/file.c @@ -345,15 +345,14 @@ mrb_file__gethome(mrb_state *mrb, mrb_value klass) mrb_int argc = mrb_get_args(mrb, "|S", &username); if (argc == 0) { home = getenv("HOME"); - if (home == NULL) { - return mrb_nil_value(); - } #ifdef _WIN32 - home = getenv("USERPROFILE"); if (home == NULL) { - return mrb_nil_value(); + home = getenv("USERPROFILE"); } #endif + if (home == NULL) { + return mrb_nil_value(); + } if (!mrb_file_is_absolute_path(home)) { mrb_raise(mrb, E_ARGUMENT_ERROR, "non-absolute home"); } @@ -378,6 +377,15 @@ mrb_file__gethome(mrb_state *mrb, mrb_value klass) home = mrb_utf8_from_locale(home, -1); path = mrb_str_new_cstr(mrb, home); mrb_utf8_free(home); +#ifdef _WIN32 + char *pathp = RSTRING_PTR(path); + const char *const pathend = pathp + RSTRING_LEN(path); + for (;;) { + pathp = memchr(pathp, '\\', pathend - pathp); + if (!pathp) break; + *pathp++ = '/'; + } +#endif return path; } diff --git a/mrbgems/mruby-io/test/file.rb b/mrbgems/mruby-io/test/file.rb index 465135185..07e32b325 100644 --- a/mrbgems/mruby-io/test/file.rb +++ b/mrbgems/mruby-io/test/file.rb @@ -204,7 +204,7 @@ assert('File.expand_path') do assert_equal "/", File.expand_path("../../../..", "/") if File._getwd[1] == ":" drive_letter = File._getwd[0] - assert_equal drive_letter + ":\\", File.expand_path(([".."] * 100).join("/")) + assert_equal drive_letter + ":/", File.expand_path(([".."] * 100).join("/")) else assert_equal "/", File.expand_path(([".."] * 100).join("/")) end