mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
rb_w32_ugetcwd: UTF-8 version getcwd
* dir.c (rb_dir_getwd): convert from UTF-8. * win32/win32.c (w32_getcwd): codepage aware getcwd using GetCurrentDirectoryW. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58745 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
87acdae43d
commit
000482a173
3 changed files with 43 additions and 18 deletions
8
dir.c
8
dir.c
|
@ -74,6 +74,7 @@ char *strchr(char*,char);
|
||||||
#define rmdir(p) rb_w32_urmdir(p)
|
#define rmdir(p) rb_w32_urmdir(p)
|
||||||
#undef opendir
|
#undef opendir
|
||||||
#define opendir(p) rb_w32_uopendir(p)
|
#define opendir(p) rb_w32_uopendir(p)
|
||||||
|
#define ruby_getcwd() rb_w32_ugetcwd(NULL, 0)
|
||||||
#define IS_WIN32 1
|
#define IS_WIN32 1
|
||||||
#else
|
#else
|
||||||
#define IS_WIN32 0
|
#define IS_WIN32 0
|
||||||
|
@ -1051,10 +1052,14 @@ rb_dir_getwd(void)
|
||||||
{
|
{
|
||||||
char *path;
|
char *path;
|
||||||
VALUE cwd;
|
VALUE cwd;
|
||||||
int fsenc = rb_enc_to_index(rb_filesystem_encoding());
|
rb_encoding *fs = rb_filesystem_encoding();
|
||||||
|
int fsenc = rb_enc_to_index(fs);
|
||||||
|
|
||||||
if (fsenc == ENCINDEX_US_ASCII) fsenc = ENCINDEX_ASCII;
|
if (fsenc == ENCINDEX_US_ASCII) fsenc = ENCINDEX_ASCII;
|
||||||
path = my_getcwd();
|
path = my_getcwd();
|
||||||
|
#ifdef _WIN32
|
||||||
|
cwd = rb_str_conv_enc(rb_utf8_str_new_cstr(path), NULL, fs);
|
||||||
|
#else
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
cwd = rb_str_normalize_ospath(path, strlen(path));
|
cwd = rb_str_normalize_ospath(path, strlen(path));
|
||||||
OBJ_TAINT(cwd);
|
OBJ_TAINT(cwd);
|
||||||
|
@ -1062,6 +1067,7 @@ rb_dir_getwd(void)
|
||||||
cwd = rb_tainted_str_new2(path);
|
cwd = rb_tainted_str_new2(path);
|
||||||
#endif
|
#endif
|
||||||
rb_enc_associate_index(cwd, fsenc);
|
rb_enc_associate_index(cwd, fsenc);
|
||||||
|
#endif
|
||||||
|
|
||||||
xfree(path);
|
xfree(path);
|
||||||
return cwd;
|
return cwd;
|
||||||
|
|
|
@ -33,6 +33,7 @@ long rb_w32_telldir(DIR *);
|
||||||
void rb_w32_seekdir(DIR *, long);
|
void rb_w32_seekdir(DIR *, long);
|
||||||
void rb_w32_rewinddir(DIR *);
|
void rb_w32_rewinddir(DIR *);
|
||||||
void rb_w32_closedir(DIR *);
|
void rb_w32_closedir(DIR *);
|
||||||
|
char *rb_w32_ugetcwd(char *, int);
|
||||||
|
|
||||||
#define opendir(s) rb_w32_opendir((s))
|
#define opendir(s) rb_w32_opendir((s))
|
||||||
#define readdir(d) rb_w32_readdir((d), 0)
|
#define readdir(d) rb_w32_readdir((d), 0)
|
||||||
|
|
|
@ -4655,43 +4655,61 @@ clock_getres(clockid_t clock_id, struct timespec *sp)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* License: Ruby's */
|
/* License: Ruby's */
|
||||||
char *
|
static char *
|
||||||
rb_w32_getcwd(char *buffer, int size)
|
w32_getcwd(char *buffer, int size, UINT cp)
|
||||||
{
|
{
|
||||||
char *p = buffer;
|
WCHAR *p;
|
||||||
int len;
|
int wlen, len;
|
||||||
|
|
||||||
len = GetCurrentDirectory(0, NULL);
|
len = GetCurrentDirectoryW(0, NULL);
|
||||||
if (!len) {
|
if (!len) {
|
||||||
errno = map_errno(GetLastError());
|
errno = map_errno(GetLastError());
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p) {
|
if (buffer && size < len) {
|
||||||
|
errno = ERANGE;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = ALLOCA_N(WCHAR, len);
|
||||||
|
if (!GetCurrentDirectoryW(len, p)) {
|
||||||
|
errno = map_errno(GetLastError());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlen = translate_wchar(p, L'\\', L'/') - p + 1;
|
||||||
|
len = WideCharToMultiByte(cp, 0, p, wlen, NULL, 0, NULL, NULL);
|
||||||
|
if (buffer) {
|
||||||
if (size < len) {
|
if (size < len) {
|
||||||
errno = ERANGE;
|
errno = ERANGE;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p = malloc(len);
|
buffer = malloc(len);
|
||||||
size = len;
|
if (!buffer) {
|
||||||
if (!p) {
|
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
WideCharToMultiByte(cp, 0, p, wlen, buffer, len, NULL, NULL);
|
||||||
|
|
||||||
if (!GetCurrentDirectory(size, p)) {
|
return buffer;
|
||||||
errno = map_errno(GetLastError());
|
}
|
||||||
if (!buffer)
|
|
||||||
free(p);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
translate_char(p, '\\', '/', filecp());
|
/* License: Ruby's */
|
||||||
|
char *
|
||||||
|
rb_w32_getcwd(char *buffer, int size)
|
||||||
|
{
|
||||||
|
return w32_getcwd(buffer, size, filecp());
|
||||||
|
}
|
||||||
|
|
||||||
return p;
|
/* License: Ruby's */
|
||||||
|
char *
|
||||||
|
rb_w32_ugetcwd(char *buffer, int size)
|
||||||
|
{
|
||||||
|
return w32_getcwd(buffer, size, CP_UTF8);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* License: Artistic or GPL */
|
/* License: Artistic or GPL */
|
||||||
|
|
Loading…
Add table
Reference in a new issue