1
0
Fork 0
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:
nobu 2017-05-16 10:25:56 +00:00
parent 87acdae43d
commit 000482a173
3 changed files with 43 additions and 18 deletions

8
dir.c
View file

@ -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;

View file

@ -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)

View file

@ -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 */