ruby-changes:6309
From: naruse <ko1@a...>
Date: Thu, 3 Jul 2008 01:27:32 +0900 (JST)
Subject: [ruby-changes:6309] Ruby:r17825 (win32-unicode-test): * win32/win32.c (rb_w32_write_console): this function converts output characters
naruse 2008-07-03 01:27:15 +0900 (Thu, 03 Jul 2008) New Revision: 17825 Modified files: branches/win32-unicode-test/ChangeLog branches/win32-unicode-test/include/ruby/encoding.h branches/win32-unicode-test/include/ruby/win32.h branches/win32-unicode-test/io.c branches/win32-unicode-test/transcode.c branches/win32-unicode-test/win32/win32.c Log: * win32/win32.c (rb_w32_write_console): this function converts output characters to Unicode character and write it to Windows Connsole. * include/ruby/win32.h (rb_w32_write_console): ditto. * io.c (io_fwrite): use rb_w32_write_console when output is console and the system is win32. * transcode.c (rb_transcode_convertible): defined. * include/ruby/encoding.h (rb_transcode_convertible): ditto. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=17825 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/win32-unicode-test/win32/win32.c?r1=17825&r2=17824&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/win32-unicode-test/io.c?r1=17825&r2=17824&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/win32-unicode-test/include/ruby/encoding.h?r1=17825&r2=17824&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/win32-unicode-test/ChangeLog?r1=17825&r2=17824&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/win32-unicode-test/include/ruby/win32.h?r1=17825&r2=17824&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/win32-unicode-test/transcode.c?r1=17825&r2=17824&diff_format=u Index: win32-unicode-test/include/ruby/win32.h =================================================================== --- win32-unicode-test/include/ruby/win32.h (revision 17824) +++ win32-unicode-test/include/ruby/win32.h (revision 17825) @@ -548,6 +548,7 @@ size_t rb_w32_read(int, void *, size_t); size_t rb_w32_write(int, const void *, size_t); int rb_w32_utime(const char *, const struct utimbuf *); +long rb_w32_write_console(unsigned long, int); int WINAPI rb_w32_Sleep(unsigned long msec); int rb_w32_wait_events_blocking(HANDLE *events, int num, DWORD timeout); Index: win32-unicode-test/include/ruby/encoding.h =================================================================== --- win32-unicode-test/include/ruby/encoding.h (revision 17824) +++ win32-unicode-test/include/ruby/encoding.h (revision 17825) @@ -192,6 +192,7 @@ return ENC_DUMMY_P(ENC_FROM_ENCODING(enc)); } +int rb_transcode_convertible(const char* from_encoding, const char* to_encoding); VALUE rb_str_transcode(VALUE str, VALUE to); #endif /* RUBY_ENCODING_H */ Index: win32-unicode-test/ChangeLog =================================================================== --- win32-unicode-test/ChangeLog (revision 17824) +++ win32-unicode-test/ChangeLog (revision 17825) @@ -1,3 +1,17 @@ +Thu Jul 3 01:19:00 2008 NARUSE, Yui <naruse@r...> + + * win32/win32.c (rb_w32_write_console): this function converts output characters + to Unicode character and write it to Windows Connsole. + + * include/ruby/win32.h (rb_w32_write_console): ditto. + + * io.c (io_fwrite): use rb_w32_write_console when output is console and + the system is win32. + + * transcode.c (rb_transcode_convertible): defined. + + * include/ruby/encoding.h (rb_transcode_convertible): ditto. + Thu Jul 3 00:18:00 2008 Masaki Suketa <masaki.suketa@n...> * ext/win32ole/win32ole.c: avoid creating Ruby object during Index: win32-unicode-test/io.c =================================================================== --- win32-unicode-test/io.c (revision 17824) +++ win32-unicode-test/io.c (revision 17825) @@ -14,6 +14,7 @@ #include "ruby/ruby.h" #include "ruby/io.h" #include "ruby/signal.h" +#include "ruby/win32.h" #include "vm_core.h" #include <ctype.h> #include <errno.h> @@ -689,6 +690,11 @@ { long len, n, r, l, offset = 0; +#ifdef _WIN32 + len = rb_w32_write_console(str, fptr->fd); + if (len >= 0) return len; +#endif + /* * If an external encoding was specified and it differs from * the strings encoding then we must transcode before writing. Index: win32-unicode-test/win32/win32.c =================================================================== --- win32-unicode-test/win32/win32.c (revision 17824) +++ win32-unicode-test/win32/win32.c (revision 17825) @@ -12,6 +12,7 @@ #include "ruby/ruby.h" #include "ruby/signal.h" +#include "ruby/encoding.h" #include "dln.h" #include <fcntl.h> #include <process.h> @@ -3933,6 +3934,28 @@ return rb_w32_send(fd, buf, size, 0); } +long +rb_w32_write_console(VALUE str, int fd) +{ + static int disable; + HANDLE handle; + DWORD dwMode, reslen; + + if (disable) return -1L; + handle = (HANDLE)_osfhnd(fd); + if (!GetConsoleMode(handle, &dwMode) || + !rb_transcode_convertible(rb_enc_name(rb_enc_get(str)), "UTF-16LE")) + return -1L; + + str = rb_str_transcode(str, rb_str_new2("UTF-16LE")); + if (!WriteConsoleW(handle, (LPWSTR)RSTRING_PTR(str), RSTRING_LEN(str)/2, &reslen, NULL)) { + if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + disable = TRUE; + return -1L; + } + return (long)reslen; +} + static int unixtime_to_filetime(time_t time, FILETIME *ft) { Index: win32-unicode-test/transcode.c =================================================================== --- win32-unicode-test/transcode.c (revision 17824) +++ win32-unicode-test/transcode.c (revision 17825) @@ -119,6 +119,14 @@ return (rb_transcoder *)val; } +/* + * experimental. + */ +int +rb_transcode_convertible(const char* from_encoding, const char* to_encoding) +{ + return transcode_dispatch(from_encoding, to_encoding) ? TRUE : FALSE; +} /* * Transcoding engine logic -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/