summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-18 04:29:34 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-18 04:29:34 +0000
commit4a71766957b39c9a487221d832e92690cd138cac (patch)
tree926b785606f02403b425c4685f604b9e31a063df
parentc503b659ca5e44cdbece8b3cbe5bb3fb941c3bc3 (diff)
* file.c: fixes to compile on mswin32. Patch from U. Nakamura
<usa at garbagecollect.jp>. [ruby-dev:35127] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_5@17397 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--file.c94
-rw-r--r--version.h8
3 files changed, 41 insertions, 66 deletions
diff --git a/ChangeLog b/ChangeLog
index 7a18b5db85..5011c72aeb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Jun 18 13:19:55 2008 URABE Shyouhei <shyouhei@ruby-lang.org>
+
+ * file.c: fixes to compile on mswin32. Patch from U. Nakamura
+ <usa at garbagecollect.jp>. [ruby-dev:35127]
+
Tue Jun 17 22:14:41 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* configure.in (LIBPATHFLAG, RPATHFLAG): no needs to be quoted,
diff --git a/file.c b/file.c
index f113d33b81..d7129fd283 100644
--- a/file.c
+++ b/file.c
@@ -16,11 +16,12 @@
#include "missing/file.h"
#endif
#ifdef __CYGWIN__
+#define OpenFile WINAPI_OpenFile
#include <windows.h>
#include <sys/cygwin.h>
+#undef OpenFile
#endif
-#define OpenFile rb_io_t
#include "ruby.h"
#include "rubyio.h"
#include "rubysig.h"
@@ -2329,18 +2330,6 @@ rb_file_s_umask(argc, argv)
# endif
#endif
-#if defined _WIN32 || defined __CYGWIN__
-#define USE_NTFS 1
-#else
-#define USE_NTFS 0
-#endif
-
-#if USE_NTFS
-#define istrailinggabage(x) ((x) == '.' || (x) == ' ')
-#else
-#define istrailinggabage(x) 0
-#endif
-
#ifdef DOSISH_DRIVE_LETTER
static inline int
has_drive_letter(buf)
@@ -2452,9 +2441,8 @@ rb_path_last_separator(path)
return last;
}
-#define chompdirsep rb_path_end
char *
-rb_path_end(path)
+chompdirsep(path)
const char *path;
{
while (*path) {
@@ -2469,35 +2457,20 @@ rb_path_end(path)
}
return (char *)path;
}
-
-#if USE_NTFS
-static char *
-ntfs_tail(const char *path)
+
+char *
+rb_path_end(path)
+ const char *path;
{
- while (*path && *path != ':') {
- if (istrailinggabage(*path)) {
- const char *last = path++;
- while (istrailinggabage(*path)) path++;
- if (!*path || *path == ':') return (char *)last;
- }
- else if (isdirsep(*path)) {
- const char *last = path++;
- while (isdirsep(*path)) path++;
- if (!*path) return (char *)last;
- if (*path == ':') path++;
- }
- else {
- path = CharNext(path);
- }
- }
- return (char *)path;
+ if (isdirsep(*path)) path++;
+ return chompdirsep(path);
}
-#endif
#if USE_NTFS
static char *
ntfs_tail(const char *path)
{
+ while (*path == '.') path++;
while (*path && *path != ':') {
if (istrailinggabage(*path)) {
const char *last = path++;
@@ -2527,10 +2500,6 @@ ntfs_tail(const char *path)
p = buf + bdiff;\
pend = buf + buflen;\
}\
- rb_str_resize(result, buflen);\
- buf = RSTRING(result)->ptr;\
- p = buf + bdiff;\
- pend = buf + buflen;\
} while (0)
#define BUFINIT() (\
@@ -2769,28 +2738,23 @@ file_expand_path(fname, dname, result)
#if USE_NTFS
*p = '\0';
- if (!strpbrk(b = buf, "*?")) {
+ if ((s = strrdirsep(b = buf)) != 0 && !strpbrk(s, "*?")) {
size_t len;
WIN32_FIND_DATA wfd;
#ifdef __CYGWIN__
- int lnk_added = 0;
+ int lnk_added = 0, is_symlink = 0;
struct stat st;
- char w32buf[MAXPATHLEN], sep = 0;
- p = 0;
+ char w32buf[MAXPATHLEN];
+ p = (char *)s;
if (lstat(buf, &st) == 0 && S_ISLNK(st.st_mode)) {
- p = strrdirsep(buf);
- if (!p) p = skipprefix(buf);
- if (p) {
- sep = *p;
- *p = '\0';
- }
+ is_symlink = 1;
+ *p = '\0';
}
- if (cygwin_conv_to_win32_path(buf, w32buf) == 0) {
+ if (cygwin_conv_to_win32_path((*buf ? buf : "/"), w32buf) == 0) {
b = w32buf;
}
- if (p) *p = sep;
- else p = buf;
- if (b == w32buf) {
+ if (is_symlink && b == w32buf) {
+ *p = '\\';
strlcat(w32buf, p, sizeof(w32buf));
len = strlen(p);
if (len > 4 && strcasecmp(p + len - 4, ".lnk") != 0) {
@@ -2798,24 +2762,30 @@ file_expand_path(fname, dname, result)
strlcat(w32buf, ".lnk", sizeof(w32buf));
}
}
+ *p = '/';
#endif
HANDLE h = FindFirstFile(b, &wfd);
if (h != INVALID_HANDLE_VALUE) {
FindClose(h);
- p = strrdirsep(buf);
len = strlen(wfd.cFileName);
#ifdef __CYGWIN__
if (lnk_added && len > 4 &&
strcasecmp(wfd.cFileName + len - 4, ".lnk") == 0) {
- len -= 4;
+ wfd.cFileName[len -= 4] = '\0';
}
+#else
+ p = (char *)s;
#endif
- if (!p) p = buf;
- buflen = ++p - buf + len;
- rb_str_resize(result, buflen);
+ ++p;
+ BUFCHECK(bdiff + len >= buflen);
memcpy(p, wfd.cFileName, len + 1);
p += len;
}
+#ifdef __CYGWIN__
+ else {
+ p += strlen(p);
+ }
+#endif
}
#endif
@@ -3051,7 +3021,7 @@ rb_file_s_extname(klass, fname)
if (!p)
p = name;
else
- p++;
+ name = ++p;
e = 0;
while (*p) {
@@ -3081,7 +3051,7 @@ rb_file_s_extname(klass, fname)
break;
p = CharNext(p);
}
- if (!e || e+1 == p) /* no dot, or the only dot is first or end? */
+ if (!e || e == name || e+1 == p) /* no dot, or the only dot is first or end? */
return rb_str_new(0, 0);
extname = rb_str_new(e, p - e); /* keep the dot, too! */
OBJ_INFECT(extname, fname);
diff --git a/version.h b/version.h
index 519ea1815b..2b0af78080 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
#define RUBY_VERSION "1.8.5"
-#define RUBY_RELEASE_DATE "2008-06-17"
+#define RUBY_RELEASE_DATE "2008-06-18"
#define RUBY_VERSION_CODE 185
-#define RUBY_RELEASE_CODE 20080617
-#define RUBY_PATCHLEVEL 224
+#define RUBY_RELEASE_CODE 20080618
+#define RUBY_PATCHLEVEL 225
#define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 8
#define RUBY_VERSION_TEENY 5
#define RUBY_RELEASE_YEAR 2008
#define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 17
+#define RUBY_RELEASE_DAY 18
#ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[];