summaryrefslogtreecommitdiff
path: root/file.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-12-06 07:21:55 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-12-06 07:21:55 +0000
commit1f97dd562cb07e1e27541a6484acf0c1ad5eab0d (patch)
tree4db7ce839141dedba970a818ce0f4ed3b4706859 /file.c
parenta8fff364061bf768df753400c32802de2040285f (diff)
file.c: isADS
* file.c (isADS): add macro to tell if Alternate Data Stream separator, to distinguish from drive letter. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56996 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
-rw-r--r--file.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/file.c b/file.c
index 7e3cd407c2..7e8720f07e 100644
--- a/file.c
+++ b/file.c
@@ -2922,12 +2922,24 @@ static const char file_alt_separator[] = {FILE_ALT_SEPARATOR, '\0'};
#define USE_NTFS 0
#endif
#endif
+#ifndef USE_NTFS_ADS
+# if USE_NTFS
+# define USE_NTFS_ADS 1
+# else
+# define USE_NTFS_ADS 0
+# endif
+#endif
#if USE_NTFS
#define istrailinggarbage(x) ((x) == '.' || (x) == ' ')
#else
#define istrailinggarbage(x) 0
#endif
+#if USE_NTFS_ADS
+# define isADS(x) ((x) == ':')
+#else
+# define isADS(x) 0
+#endif
#define Next(p, e, enc) ((p) + rb_enc_mbclen((p), (e), (enc)))
#define Inc(p, e, enc) ((p) = Next((p), (e), (enc)))
@@ -3098,17 +3110,17 @@ static char *
ntfs_tail(const char *path, const char *end, rb_encoding *enc)
{
while (path < end && *path == '.') path++;
- while (path < end && *path != ':') {
+ while (path < end && !isADS(*path)) {
if (istrailinggarbage(*path)) {
const char *last = path++;
while (path < end && istrailinggarbage(*path)) path++;
- if (path >= end || *path == ':') return (char *)last;
+ if (path >= end || isADS(*path)) return (char *)last;
}
else if (isdirsep(*path)) {
const char *last = path++;
while (path < end && isdirsep(*path)) path++;
if (path >= end) return (char *)last;
- if (*path == ':') path++;
+ if (isADS(*path)) path++;
}
else {
Inc(path, end, enc);
@@ -3472,7 +3484,7 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na
case ' ': {
const char *e = s;
while (s < fend && istrailinggarbage(*s)) s++;
- if (!*s) {
+ if (s >= fend) {
s = e;
goto endpath;
}
@@ -3511,19 +3523,23 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na
if (s > b) {
#if USE_NTFS
+# if USE_NTFS_ADS
static const char prime[] = ":$DATA";
enum {prime_len = sizeof(prime) -1};
+# endif
endpath:
+# if USE_NTFS_ADS
if (s > b + prime_len && strncasecmp(s - prime_len, prime, prime_len) == 0) {
/* alias of stream */
/* get rid of a bug of x64 VC++ */
- if (*(s - (prime_len+1)) == ':') {
+ if (isADS(*(s - (prime_len+1)))) {
s -= prime_len + 1; /* prime */
}
else if (memchr(b, ':', s - prime_len - b)) {
s -= prime_len; /* alternative */
}
}
+# endif
#endif
BUFCOPY(b, s-b);
rb_str_set_len(result, p-buf);
@@ -4233,7 +4249,7 @@ ruby_enc_find_extname(const char *name, long *len, rb_encoding *enc)
if (*p == '.') dot = p;
p++;
}
- if (!*p || *p == ':') {
+ if (!*p || isADS(*p)) {
p = last;
break;
}
@@ -4244,7 +4260,7 @@ ruby_enc_find_extname(const char *name, long *len, rb_encoding *enc)
#endif
}
#if USE_NTFS
- else if (*p == ':') {
+ else if (isADS(*p)) {
break;
}
#endif