summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-04-30 17:56:23 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-04-30 17:56:23 +0000
commit6c28f99d8894b9f9a3c1394d120115f69012f2c3 (patch)
tree967e8f5c37611f009640580566540a001df60bf3 /io.c
parentbfeeb913fed701b552cb6c7331b33062b7922de3 (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.c49
1 files changed, 7 insertions, 42 deletions
diff --git a/io.c b/io.c
index 8a61940824..1b9124134e 100644
--- a/io.c
+++ b/io.c
@@ -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) {