From 6ee24fe1bc9c5a43704cbf0d24aa5c931b91a3a3 Mon Sep 17 00:00:00 2001 From: Reckordp Date: Sun, 8 Mar 2020 05:32:27 +0700 Subject: Evaluate all type path --- mrbgems/mruby-io/src/file.c | 54 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c index ffce0ddcb..25b1dd6e1 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,18 +280,51 @@ mrb_file__getwd(mrb_state *mrb, mrb_value klass) return path; } +#ifdef _WIN32 +#define IS_FILESEP(x) (x == FILE_SEPARATOR || x == FILE_ALT_SEPARATOR) +#define IS_VOLSEP(x) (x == VOLUME_SEPARATOR) +#define IS_DEVICEID(x) (x == '.' || x == '?') + +static int +is_absolute_traditional_path(const char *path, int len) +{ + if (len < 3) return 0; + if (IS_FILESEP(path[0])) return 1; + 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 (IS_FILESEP(path[0]) && IS_FILESEP(path[1])); +} + +static int +is_absolute_device_path(const char *path, int len) { + if (len < 4) return 0; + return (is_aboslute_unc_path(path, len) && 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])); - else - return (IS_PATHSEP(path[0]) && IS_PATHSEP(path[1])); -#undef IS_PATHSEP + return ( + is_absolute_traditional_path(path, len) || + is_aboslute_unc_path(path, len) || + is_absolute_device_path(path, len) + ); + +#undef IS_FILESEP +#undef IS_VOLSEP +#undef IS_DEVICEID + #else - return (path[0] == '/'); +static int +mrb_file_is_absolute_path(const char *path) +{ +#define IS_FILESEP(x) (x == FILE_SEPARATOR) + return IS_FILESEP(path[0]); +#undef IS_FILESEP #endif } @@ -335,7 +369,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 { -- cgit v1.2.3 From ab1465d9d5faed9d396a04d0fafcd70f1c72dd59 Mon Sep 17 00:00:00 2001 From: Reckordp Date: Sun, 8 Mar 2020 10:53:18 +0700 Subject: Traditional, UNC, and Device Is Absolute? --- mrbgems/mruby-io/src/file.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c index 25b1dd6e1..d3da5daaf 100644 --- a/mrbgems/mruby-io/src/file.c +++ b/mrbgems/mruby-io/src/file.c @@ -281,52 +281,56 @@ mrb_file__getwd(mrb_state *mrb, mrb_value klass) } #ifdef _WIN32 -#define IS_FILESEP(x) (x == FILE_SEPARATOR || x == FILE_ALT_SEPARATOR) -#define IS_VOLSEP(x) (x == VOLUME_SEPARATOR) +#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; - if (IS_FILESEP(path[0])) return 1; 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 (IS_FILESEP(path[0]) && IS_FILESEP(path[1])); + 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 (is_aboslute_unc_path(path, len) && IS_DEVICEID(path[2]) && IS_FILESEP(path[3])); + return (CHECK_UNCDEV_PATH && IS_DEVICEID(path[2]) && IS_FILESEP(path[3])); } static int mrb_file_is_absolute_path(const char *path, int len) { - return ( - is_absolute_traditional_path(path, len) || - is_aboslute_unc_path(path, len) || - is_absolute_device_path(path, 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) { -#define IS_FILESEP(x) (x == FILE_SEPARATOR) - return IS_FILESEP(path[0]); -#undef IS_FILESEP -#endif + return (path[0] == *(char*)(FILE_SEPARATOR)); } +#endif static mrb_value mrb_file__gethome(mrb_state *mrb, mrb_value klass) -- cgit v1.2.3 From a8d508c567250dbf1f6a12b9e549e8d1903d76b4 Mon Sep 17 00:00:00 2001 From: Reckordp Date: Sun, 8 Mar 2020 14:41:38 +0700 Subject: Let me in Please --- AUTHORS | 3 +++ 1 file changed, 3 insertions(+) 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 + + -- cgit v1.2.3