summaryrefslogtreecommitdiff
path: root/ext/win32ole
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-08-23 08:17:59 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-08-23 08:17:59 +0000
commitf539e9cbf3e50f5d9be45a0e4c23366bb3e4e6ef (patch)
tree128b2409b1003b17c913cee124b79df90af3b38f /ext/win32ole
parentdcdde335a6656a8daec0b74f2f2268ca44eebeca (diff)
win32ole.c: store directly
* ext/win32ole/win32ole.c (ole_wc2vstr): store converted multibyte string to string value directly. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42664 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/win32ole')
-rw-r--r--ext/win32ole/win32ole.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c
index be5ae826ff..58784c4b91 100644
--- a/ext/win32ole/win32ole.c
+++ b/ext/win32ole/win32ole.c
@@ -1064,7 +1064,7 @@ ole_cp2encoding(UINT cp)
}
static char *
-ole_wc2mb(LPWSTR pw)
+ole_wc2mb_alloc(LPWSTR pw, char *(alloc)(UINT size, void *arg), void *arg)
{
LPSTR pm;
UINT size = 0;
@@ -1076,7 +1076,7 @@ ole_wc2mb(LPWSTR pw)
if (FAILED(hr)) {
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert Unicode to CP%d", cWIN32OLE_cp);
}
- pm = ALLOC_N(char, size + 1);
+ pm = alloc(size, arg);
hr = pIMultiLanguage->lpVtbl->ConvertStringFromUnicode(pIMultiLanguage,
&dw, cWIN32OLE_cp, pw, NULL, pm, &size);
if (FAILED(hr)) {
@@ -1088,17 +1088,29 @@ ole_wc2mb(LPWSTR pw)
}
size = WideCharToMultiByte(cWIN32OLE_cp, 0, pw, -1, NULL, 0, NULL, NULL);
if (size) {
- pm = ALLOC_N(char, size + 1);
+ pm = alloc(size, arg);
WideCharToMultiByte(cWIN32OLE_cp, 0, pw, -1, pm, size, NULL, NULL);
pm[size] = '\0';
}
else {
- pm = ALLOC_N(char, 1);
+ pm = alloc(0, arg);
*pm = '\0';
}
return pm;
}
+static char *
+ole_alloc_str(UINT size, void *arg)
+{
+ return ALLOC_N(char, size + 1);
+}
+
+static char *
+ole_wc2mb(LPWSTR pw)
+{
+ return ole_wc2mb_alloc(pw, ole_alloc_str, NULL);
+}
+
static VALUE
ole_hresult2msg(HRESULT hr)
{
@@ -1383,15 +1395,22 @@ ole_mb2wc(char *pm, int len)
return pw;
}
+static char *
+ole_alloc_vstr(UINT size, void *arg)
+{
+ VALUE str = rb_enc_str_new(NULL, size, cWIN32OLE_enc);
+ *(VALUE *)arg = str;
+ return RSTRING_PTR(str);
+}
+
static VALUE
ole_wc2vstr(LPWSTR pw, BOOL isfree)
{
- char *p = ole_wc2mb(pw);
- VALUE vstr = rb_str_new_cstr(p);
- rb_enc_associate(vstr, cWIN32OLE_enc);
+ VALUE vstr;
+ ole_wc2mb_alloc(pw, ole_alloc_vstr, &vstr);
+ rb_str_set_len(vstr, (long)strlen(RSTRING_PTR(vstr)));
if(isfree)
SysFreeString(pw);
- free(p);
return vstr;
}