ruby-changes:6428
From: usa <ko1@a...>
Date: Tue, 8 Jul 2008 00:11:07 +0900 (JST)
Subject: [ruby-changes:6428] Ruby:r17944 (win32-unicode-test): * win32/win32.c, include/win32/win32.c (rb_w32_parse_cmndline): new
usa 2008-07-08 00:06:39 +0900 (Tue, 08 Jul 2008)
New Revision: 17944
Modified files:
branches/win32-unicode-test/ChangeLog
branches/win32-unicode-test/include/ruby/win32.h
branches/win32-unicode-test/ruby.c
branches/win32-unicode-test/win32/win32.c
Log:
* win32/win32.c, include/win32/win32.c (rb_w32_parse_cmndline): new
function to parse command line from GetCommandLineW().
this is incomplete.
* ruby.c (process_options): use rb_w32_parse_cmdline(). this is
incomplete, too.
* win32/win32.c (rb_w32_write_console): sorry, pullup mistake.
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=17944
Index: win32-unicode-test/include/ruby/win32.h
===================================================================
--- win32-unicode-test/include/ruby/win32.h (revision 17943)
+++ win32-unicode-test/include/ruby/win32.h (revision 17944)
@@ -208,6 +208,7 @@
#define isascii __isascii
#endif
#define NtInitialize ruby_sysinit
+extern int rb_w32_parse_cmdline(char ***, const char *);
extern int rb_w32_cmdvector(const char *, char ***);
extern rb_pid_t rb_w32_pipe_exec(const char *, const char *, int, int *, int *);
extern int flock(int fd, int oper);
Index: win32-unicode-test/ChangeLog
===================================================================
--- win32-unicode-test/ChangeLog (revision 17943)
+++ win32-unicode-test/ChangeLog (revision 17944)
@@ -1,3 +1,14 @@
+Tue Jul 8 00:03:20 2008 NAKAMURA Usaku <usa@r...>
+
+ * win32/win32.c, include/win32/win32.c (rb_w32_parse_cmndline): new
+ function to parse command line from GetCommandLineW().
+ this is incomplete.
+
+ * ruby.c (process_options): use rb_w32_parse_cmdline(). this is
+ incomplete, too.
+
+ * win32/win32.c (rb_w32_write_console): sorry, pullup mistake.
+
Mon Jul 7 20:39:28 2008 Masaki Suketa <masaki.suketa@n...>
* ext/win32ole/win32ole.c(Init_win32ole): add
Index: win32-unicode-test/win32/win32.c
===================================================================
--- win32-unicode-test/win32/win32.c (revision 17943)
+++ win32-unicode-test/win32/win32.c (revision 17944)
@@ -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>
@@ -1144,7 +1145,31 @@
return ptr;
}
-int
+int
+rb_w32_parse_cmdline(char ***vec, const char *enc)
+{
+ WCHAR *wcmd;
+ char *cmd;
+ VALUE str;
+
+ if (enc) {
+ if (!rb_transcode_convertible("UTF-16LE", enc))
+ return 0;
+ wcmd = GetCommandLineW();
+ str = rb_str_transcode(rb_enc_str_new((char *)wcmd,
+ lstrlenW(wcmd) * sizeof(WCHAR),
+ rb_enc_find("UTF-16LE")),
+ rb_str_new2(enc));
+ cmd = RSTRING_PTR(str);
+ }
+ else {
+ cmd = GetCommandLineA();
+ }
+
+ return rb_w32_cmdvector(cmd, vec);
+}
+
+int
rb_w32_cmdvector(const char *cmd, char ***vec)
{
int globbing, len;
@@ -3933,6 +3958,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/ruby.c
===================================================================
--- win32-unicode-test/ruby.c (revision 17943)
+++ win32-unicode-test/ruby.c (revision 17944)
@@ -970,11 +970,12 @@
rb_encoding *enc, *lenc;
const char *s;
char fbuf[MAXPATHLEN];
- int i = proc_options(argc, argv, opt);
+ int opnum = proc_options(argc, argv, opt);
+ int i;
int safe;
- argc -= i;
- argv += i;
+ argc -= opnum;
+ argv += opnum;
if (!(opt->disable & DISABLE_BIT(rubyopt)) &&
rb_safe_level() == 0 && (s = getenv("RUBYOPT"))) {
@@ -1058,6 +1059,7 @@
if (!opt->script)
opt->script = argv[0];
}
+ opnum++;
argc--;
argv++;
}
@@ -1096,6 +1098,15 @@
enc = lenc;
}
rb_enc_set_default_external(rb_enc_from_encoding(enc));
+#ifdef _WIN32
+ if ((argc = rb_w32_parse_cmdline(&argv, rb_enc_name(enc))) != 0) {
+ argc -= opnum;
+ argv += opnum;
+ ruby_set_argv(argc, argv);
+ for (i = 0; i < RARRAY_LEN(rb_argv); i++)
+ rb_enc_associate(RARRAY_PTR(rb_argv)[i], enc);
+ }
+#endif
rb_set_safe_level_force(safe);
if (opt->e_script) {
--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/