From 08f8ab9c37e995d5a7e4060b0b1497c37a437750 Mon Sep 17 00:00:00 2001 From: usa Date: Fri, 9 Feb 2001 15:02:14 +0000 Subject: * win32/win32.c (win32_stat): replace stat for enable when pathname ends with '/' or '\' for mswin32 on Win9X / Win2k. * win32/win32.h: ditto. * ruby.h: ditto. * dir.c (rb_glob_helper): ditto. * file.c (rb_stat, rb_file_s_stat, eaccess, check3rdbyte): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1173 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- win32/win32.c | 21 +++++++++++++++++++++ win32/win32.h | 2 ++ 2 files changed, 23 insertions(+) (limited to 'win32') diff --git a/win32/win32.c b/win32/win32.c index 3fcef7c771..dd6597ea1c 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -29,6 +29,7 @@ #ifndef index #define index(x, y) strchr((x), (y)) #endif +#define isdirsep(x) ((x) == '/' || (x) == '\\') #ifndef bool #define bool int @@ -2612,6 +2613,26 @@ myrename(const char *oldpath, const char *newpath) return res; } +int +win32_stat(const char *path, struct stat *st) +{ + const char *p = path; + + if ((isdirsep(*p) && (p++, TRUE)) || /* absolute path or UNC */ + (ISALPHA(*p) && p[1] == ':' && (p += 2, TRUE))) { /* has drive */ + if (isdirsep(*p)) p++; + } + if (*p && (p = CharPrev(p, p + strlen(p)), isdirsep(*p))) { + /* Win95/2000 fail with trailing path separator? */ + int len = p - path; + char *s = ALLOCA_N(char, len + 1); + memcpy(s, path, len); + s[len] = '\0'; + path = s; + } + return stat(path, st); +} + static long filetime_to_clock(FILETIME *ft) { diff --git a/win32/win32.h b/win32/win32.h index ebffc5c8ab..ffbe967703 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -162,6 +162,8 @@ extern "C++" { #define pclose _pclose #define strcasecmp _stricmp #define strncasecmp _strnicmp +#undef rb_sys_stat +#define rb_sys_stat win32_stat /* these are defined in nt.c */ #ifdef __MINGW32__ -- cgit v1.2.3