diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-03-08 18:52:24 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-03-08 18:52:24 +0900 |
| commit | 55f320265030b0af5c063788a6673d852abd8606 (patch) | |
| tree | 1d801580a91a035dba0dce188f3dd6e26f9b5b6b | |
| parent | 4398bae56a04a6ac1ac7f49935075bcbd8f50872 (diff) | |
| parent | a8d508c567250dbf1f6a12b9e549e8d1903d76b4 (diff) | |
| download | mruby-55f320265030b0af5c063788a6673d852abd8606.tar.gz mruby-55f320265030b0af5c063788a6673d852abd8606.zip | |
Merge pull request #4952 from Reckordp/master
Traditional, UNC, and Drive Path
| -rw-r--r-- | AUTHORS | 3 | ||||
| -rw-r--r-- | mrbgems/mruby-io/src/file.c | 58 |
2 files changed, 51 insertions, 10 deletions
@@ -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 { |
