diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-04-30 17:56:23 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-04-30 17:56:23 +0000 |
commit | 6c28f99d8894b9f9a3c1394d120115f69012f2c3 (patch) | |
tree | 967e8f5c37611f009640580566540a001df60bf3 /io.c | |
parent | bfeeb913fed701b552cb6c7331b33062b7922de3 (diff) |
* merge some patches from win32-uncode-test branch.
see #1685.
* file.c, include/ruby/intern.h (rb_str_encode_ospath): new function
to convert encoding for pathname.
* win32.c, include/ruby/win32.h (rb_w32_ulink, rb_w32_urename,
rb_w32_ustati64, rb_w32_uopen, rb_w32_uutime, rb_w32_uchdir,
rb_w32_umkdir, rb_w32_urmdir, rb_w32_uunlink): new functions to
accept UTF-8 path.
* win32/win32.c (rb_w32_opendir, link, rb_w32_stati64, rb_w32_utime,
rb_w32_unlink): use WCHAR path internally.
* file.c (rb_stat, eaccess, access_internal, rb_file_s_ftype,
chmod_internal, rb_file_chmod, rb_file_chown, utime_internal,
rb_file_s_link, unlink_internal, rb_file_s_rename): use UTF-8 version
functions on Win32.
* file.c (apply2files, rb_stat, rb_file_s_lstat, rb_file_symlink_p,
rb_file_readable_p, rb_file_writable_p, rb_file_executable_p,
check3rdbyte, rb_file_identical_p, rb_file_chmod, rb_file_chown,
rb_file_s_link, rb_file_s_symlink, rb_file_s_rename): call
rb_str_encode_ospath() before passing the path to system.
* io.c (rb_sysopen): ditto.
* dir.c (dir_chdir, dir_s_mkdir, dir_s_rmdir): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27570 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 49 |
1 files changed, 7 insertions, 42 deletions
@@ -114,6 +114,12 @@ extern void Init_File(void); #define IO_RBUF_CAPA_FOR(fptr) (NEED_READCONV(fptr) ? IO_CBUF_CAPA_MIN : IO_RBUF_CAPA_MIN) #define IO_WBUF_CAPA_MIN 8192 +/* define system APIs */ +#ifdef _WIN32 +#undef open +#define open rb_w32_uopen +#endif + VALUE rb_cIO; VALUE rb_eEOFError; VALUE rb_eIOError; @@ -4464,49 +4470,13 @@ struct sysopen_struct { VALUE fname; int oflags; mode_t perm; -#ifdef _WIN32 - int wchar; -#endif }; -#ifdef _WIN32 -static rb_encoding * -w32_utf16(void) -{ - static rb_encoding *utf16 = (rb_encoding *)-1; - if (utf16 == (rb_encoding *)-1) { - utf16 = rb_enc_find("UTF-16LE"); - if (utf16 == rb_ascii8bit_encoding()) - utf16 = NULL; - } - return utf16; -} - -static int -w32_conv_to_utf16(volatile VALUE *strp) -{ - rb_encoding *utf16 = w32_utf16(); - if (utf16) { - VALUE wstr = rb_str_encode(*strp, rb_enc_from_encoding(utf16), 0, Qnil); - rb_enc_str_buf_cat(wstr, "", 1, utf16); /* workaround */ - *strp = wstr; - return 1; - } - else { - return 0; - } -} -#endif - static VALUE sysopen_func(void *ptr) { const struct sysopen_struct *data = ptr; const char *fname = RSTRING_PTR(data->fname); -#ifdef _WIN32 - if (data->wchar) - return (VALUE)rb_w32_wopen((WCHAR *)fname, data->oflags, data->perm); -#endif return (VALUE)open(fname, data->oflags, data->perm); } @@ -4525,14 +4495,9 @@ rb_sysopen(VALUE fname, int oflags, mode_t perm) #ifdef O_BINARY oflags |= O_BINARY; #endif - data.fname = fname; + data.fname = rb_str_encode_ospath(fname); data.oflags = oflags; data.perm = perm; -#ifdef _WIN32 - if ((data.wchar = w32_conv_to_utf16(&data.fname)) != 0) { - OBJ_FREEZE(data.fname); - } -#endif fd = rb_sysopen_internal(&data); if (fd < 0) { |