mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #4952 from Reckordp/master
Traditional, UNC, and Drive Path
This commit is contained in:
@@ -42,3 +42,6 @@ of this list.
|
||||
Masahiro Wakame
|
||||
YAMAMOTO Masaya
|
||||
KOBAYASHI Shuji
|
||||
RIZAL Reckordp
|
||||
|
||||
|
||||
|
||||
+49
-11
@@ -48,6 +48,7 @@
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
#define PATH_SEPARATOR ";"
|
||||
#define FILE_ALT_SEPARATOR "\\"
|
||||
#define VOLUME_SEPARATOR ":"
|
||||
#else
|
||||
#define PATH_SEPARATOR ":"
|
||||
#endif
|
||||
@@ -279,20 +280,57 @@ mrb_file__getwd(mrb_state *mrb, mrb_value klass)
|
||||
return path;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
#define IS_FILESEP(x) (x == (*(char*)(FILE_SEPARATOR)) || x == (*(char*)(FILE_ALT_SEPARATOR)))
|
||||
#define IS_VOLSEP(x) (x == (*(char*)(VOLUME_SEPARATOR)))
|
||||
#define IS_DEVICEID(x) (x == '.' || x == '?')
|
||||
#define CHECK_UNCDEV_PATH (IS_FILESEP(path[0]) && IS_FILESEP(path[1]))
|
||||
|
||||
static int
|
||||
is_absolute_traditional_path(const char *path, int len)
|
||||
{
|
||||
if (len < 3) return 0;
|
||||
return (ISALPHA(path[0]) && IS_VOLSEP(path[1]) && IS_FILESEP(path[2]));
|
||||
}
|
||||
|
||||
static int
|
||||
is_aboslute_unc_path(const char *path, int len) {
|
||||
if (len < 2) return 0;
|
||||
return (CHECK_UNCDEV_PATH && !IS_DEVICEID(path[2]));
|
||||
}
|
||||
|
||||
static int
|
||||
is_absolute_device_path(const char *path, int len) {
|
||||
if (len < 4) return 0;
|
||||
return (CHECK_UNCDEV_PATH && IS_DEVICEID(path[2]) && IS_FILESEP(path[3]));
|
||||
}
|
||||
|
||||
static int
|
||||
mrb_file_is_absolute_path(const char *path, int len)
|
||||
{
|
||||
if (IS_FILESEP(path[0])) return 1;
|
||||
if (len > 0)
|
||||
return (
|
||||
is_absolute_traditional_path(path, len) ||
|
||||
is_aboslute_unc_path(path, len) ||
|
||||
is_absolute_device_path(path, len)
|
||||
);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
#undef IS_FILESEP
|
||||
#undef IS_VOLSEP
|
||||
#undef IS_DEVICEID
|
||||
#undef CHECK_UNCDEV_PATH
|
||||
|
||||
#else
|
||||
static int
|
||||
mrb_file_is_absolute_path(const char *path)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
#define IS_PATHSEP(x) (x == '/' || x == '\\')
|
||||
if (ISALPHA(path[0]))
|
||||
return (strlen(path) > 2 && path[1] == ':' && IS_PATHSEP(path[2]));
|
||||
else
|
||||
return (IS_PATHSEP(path[0]) && IS_PATHSEP(path[1]));
|
||||
#undef IS_PATHSEP
|
||||
#else
|
||||
return (path[0] == '/');
|
||||
#endif
|
||||
return (path[0] == *(char*)(FILE_SEPARATOR));
|
||||
}
|
||||
#endif
|
||||
|
||||
static mrb_value
|
||||
mrb_file__gethome(mrb_state *mrb, mrb_value klass)
|
||||
@@ -335,7 +373,7 @@ mrb_file__gethome(mrb_state *mrb, mrb_value klass)
|
||||
if (home == NULL) {
|
||||
return mrb_nil_value();
|
||||
}
|
||||
if (!mrb_file_is_absolute_path(home)) {
|
||||
if (!mrb_file_is_absolute_path(home, strlen(home))) {
|
||||
mrb_raise(mrb, E_ARGUMENT_ERROR, "non-absolute home");
|
||||
}
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user