* dln.c (dln_find_1): fix for files with dots. [ruby-dev:38588]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23891 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ae72efc541
commit
ee5add4a79
@ -1,3 +1,7 @@
|
|||||||
|
Mon Jun 29 18:55:55 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* dln.c (dln_find_1): fix for files with dots. [ruby-dev:38588]
|
||||||
|
|
||||||
Mon Jun 29 17:14:31 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Mon Jun 29 17:14:31 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* file.c (file_expand_path): should copy original encoding.
|
* file.c (file_expand_path): should copy original encoding.
|
||||||
|
31
dln.c
31
dln.c
@ -1519,7 +1519,12 @@ dln_find_1(const char *fname, const char *path, char *fbuf, size_t size,
|
|||||||
struct stat st;
|
struct stat st;
|
||||||
size_t i, fspace;
|
size_t i, fspace;
|
||||||
#ifdef DOSISH
|
#ifdef DOSISH
|
||||||
int is_abs = 0, has_path = 0, has_ext = 0;
|
static const char extension[][5] = {
|
||||||
|
".exe", ".com", ".cmd", ".bat",
|
||||||
|
};
|
||||||
|
size_t j;
|
||||||
|
int is_abs = 0, has_path = 0;
|
||||||
|
const char *ext = 0;
|
||||||
const char *p = fname;
|
const char *p = fname;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1546,23 +1551,31 @@ dln_find_1(const char *fname, const char *path, char *fbuf, size_t size,
|
|||||||
switch (*p) {
|
switch (*p) {
|
||||||
case '/': case '\\':
|
case '/': case '\\':
|
||||||
has_path = 1;
|
has_path = 1;
|
||||||
has_ext = 0;
|
ext = 0;
|
||||||
p++;
|
p++;
|
||||||
break;
|
break;
|
||||||
case '.':
|
case '.':
|
||||||
has_ext = 1;
|
ext = p;
|
||||||
p++;
|
p++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
p = CharNext(p);
|
p = CharNext(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (ext) {
|
||||||
|
for (j = 0; STRCASECMP(ext, extension[j]); j++) {
|
||||||
|
if (j == sizeof(extension) / sizeof(extension[0])) {
|
||||||
|
ext = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
ep = bp = 0;
|
ep = bp = 0;
|
||||||
if (!exe_flag) {
|
if (!exe_flag) {
|
||||||
RETURN_IF(is_abs);
|
RETURN_IF(is_abs);
|
||||||
}
|
}
|
||||||
else if (has_path) {
|
else if (has_path) {
|
||||||
RETURN_IF(has_ext);
|
RETURN_IF(ext);
|
||||||
i = p - fname;
|
i = p - fname;
|
||||||
if (i + 1 > size) goto toolong;
|
if (i + 1 > size) goto toolong;
|
||||||
fspace = size - i - 1;
|
fspace = size - i - 1;
|
||||||
@ -1646,15 +1659,7 @@ dln_find_1(const char *fname, const char *path, char *fbuf, size_t size,
|
|||||||
memcpy(bp, fname, i + 1);
|
memcpy(bp, fname, i + 1);
|
||||||
|
|
||||||
#if defined(DOSISH)
|
#if defined(DOSISH)
|
||||||
if (exe_flag && !has_ext) {
|
if (exe_flag && !ext) {
|
||||||
static const char extension[][5] = {
|
|
||||||
#if defined(__EMX__) || defined(_WIN32)
|
|
||||||
".exe", ".com", ".cmd", ".bat",
|
|
||||||
/* end of __EMX__ or _WIN32 */
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
size_t j;
|
|
||||||
|
|
||||||
needs_extension:
|
needs_extension:
|
||||||
for (j = 0; j < sizeof(extension) / sizeof(extension[0]); j++) {
|
for (j = 0; j < sizeof(extension) / sizeof(extension[0]); j++) {
|
||||||
if (fspace < strlen(extension[j])) {
|
if (fspace < strlen(extension[j])) {
|
||||||
|
@ -60,6 +60,28 @@ class TestSystem < Test::Unit::TestCase
|
|||||||
|
|
||||||
File.unlink tmpfilename or `/bin/rm -f "#{tmpfilename}"`
|
File.unlink tmpfilename or `/bin/rm -f "#{tmpfilename}"`
|
||||||
File.unlink "#{tmpfilename}.bak" or `/bin/rm -f "#{tmpfilename}.bak"`
|
File.unlink "#{tmpfilename}.bak" or `/bin/rm -f "#{tmpfilename}.bak"`
|
||||||
|
|
||||||
|
if /mswin|mingw/ =~ RUBY_PLATFORM
|
||||||
|
testname = '[ruby-dev:38588]'
|
||||||
|
batch = "batch_tmp.#{$$}"
|
||||||
|
tmpfilename = "#{tmpdir}/#{batch}.bat"
|
||||||
|
open(tmpfilename, "wb") {|f| f.print "\r\n"}
|
||||||
|
assert(system(tmpfilename), testname)
|
||||||
|
assert(system("#{tmpdir}/#{batch}"), testname)
|
||||||
|
assert(system(tmpfilename, "1"), testname)
|
||||||
|
assert(system("#{tmpdir}/#{batch}", "1"), testname)
|
||||||
|
begin
|
||||||
|
path = ENV["PATH"]
|
||||||
|
ENV["PATH"] = "#{tmpdir.tr(File::SEPARATOR, File::ALT_SEPARATOR)}#{File::PATH_SEPARATOR + path if path}"
|
||||||
|
assert(system("#{batch}.bat"), testname)
|
||||||
|
assert(system(batch), testname)
|
||||||
|
assert(system("#{batch}.bat", "1"), testname)
|
||||||
|
assert(system(batch, "1"), testname)
|
||||||
|
ensure
|
||||||
|
ENV["PATH"] = path
|
||||||
|
end
|
||||||
|
File.unlink tmpfilename
|
||||||
|
end
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user