summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-03-08 18:52:24 +0900
committerGitHub <[email protected]>2020-03-08 18:52:24 +0900
commit55f320265030b0af5c063788a6673d852abd8606 (patch)
tree1d801580a91a035dba0dce188f3dd6e26f9b5b6b
parent4398bae56a04a6ac1ac7f49935075bcbd8f50872 (diff)
parenta8d508c567250dbf1f6a12b9e549e8d1903d76b4 (diff)
downloadmruby-55f320265030b0af5c063788a6673d852abd8606.tar.gz
mruby-55f320265030b0af5c063788a6673d852abd8606.zip
Merge pull request #4952 from Reckordp/master
Traditional, UNC, and Drive Path
-rw-r--r--AUTHORS3
-rw-r--r--mrbgems/mruby-io/src/file.c58
2 files changed, 51 insertions, 10 deletions
diff --git a/AUTHORS b/AUTHORS
index 2353ff683..446cfdb82 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -42,3 +42,6 @@ of this list.
Masahiro Wakame
YAMAMOTO Masaya
KOBAYASHI Shuji
+ RIZAL Reckordp
+
+
diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c
index 3f3b6bb25..d3da5daaf 100644
--- a/mrbgems/mruby-io/src/file.c
+++ b/mrbgems/mruby-io/src/file.c
@@ -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)
+mrb_file_is_absolute_path(const char *path, int len)
{
-#ifdef _WIN32
-#define IS_PATHSEP(x) (x == '/' || x == '\\')
- if (ISALPHA(path[0]))
- return (strlen(path) > 2 && path[1] == ':' && IS_PATHSEP(path[2]));
+ 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 (IS_PATHSEP(path[0]) && IS_PATHSEP(path[1]));
-#undef IS_PATHSEP
+ return 0;
+}
+
+#undef IS_FILESEP
+#undef IS_VOLSEP
+#undef IS_DEVICEID
+#undef CHECK_UNCDEV_PATH
+
#else
- return (path[0] == '/');
-#endif
+static int
+mrb_file_is_absolute_path(const char *path)
+{
+ 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 {