[PATCH] vbscript: Replace custom buffer management code by BSTR based helper.

Dmitry Timoshkov dmitry at baikal.ru
Wed Oct 23 01:20:50 CDT 2019


Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/vbscript/vbregexp.c | 76 +++++++++++++---------------------------
 1 file changed, 25 insertions(+), 51 deletions(-)

diff --git a/dlls/vbscript/vbregexp.c b/dlls/vbscript/vbregexp.c
index 4edf9dcbfe..50652da953 100644
--- a/dlls/vbscript/vbregexp.c
+++ b/dlls/vbscript/vbregexp.c
@@ -1433,45 +1433,14 @@ static HRESULT WINAPI RegExp2_Test(IRegExp2 *iface, BSTR sourceString, VARIANT_B
     return hres;
 }
 
-typedef struct {
-    WCHAR *buf;
-    DWORD size;
-    DWORD len;
-} strbuf_t;
-
-static BOOL strbuf_ensure_size(strbuf_t *buf, unsigned len)
-{
-    WCHAR *new_buf;
-    DWORD new_size;
-
-    if(len <= buf->size)
-        return TRUE;
-
-    new_size = buf->size ? buf->size<<1 : 16;
-    if(new_size < len)
-        new_size = len;
-    if(buf->buf)
-        new_buf = heap_realloc(buf->buf, new_size*sizeof(WCHAR));
-    else
-        new_buf = heap_alloc(new_size*sizeof(WCHAR));
-    if(!new_buf)
-        return FALSE;
-
-    buf->buf = new_buf;
-    buf->size = new_size;
-    return TRUE;
-}
-
-static HRESULT strbuf_append(strbuf_t *buf, const WCHAR *str, DWORD len)
+static HRESULT bstrcat(BSTR *str, const WCHAR *append, unsigned int len)
 {
-    if(!len)
-        return S_OK;
+    unsigned int old_len = SysStringLen(*str);
 
-    if(!strbuf_ensure_size(buf, buf->len+len))
+    if (!SysReAllocStringLen(str, NULL, old_len + len))
         return E_OUTOFMEMORY;
 
-    memcpy(buf->buf+buf->len, str, len*sizeof(WCHAR));
-    buf->len += len;
+    memcpy(*str + old_len, append, len * sizeof(WCHAR));
     return S_OK;
 }
 
@@ -1480,11 +1449,10 @@ static HRESULT WINAPI RegExp2_Replace(IRegExp2 *iface, BSTR source, VARIANT repl
     RegExp2 *This = impl_from_IRegExp2(iface);
     const WCHAR *cp, *prev_cp = NULL, *ptr, *prev_ptr;
     size_t match_len = 0, source_len, replace_len;
-    strbuf_t buf = { NULL, 0, 0 };
     match_state_t *state = NULL;
     heap_pool_t *mark;
     VARIANT strv;
-    BSTR replace;
+    BSTR replace, buf;
     HRESULT hres;
 
     TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(source), debugstr_variant(&replaceVar), ret);
@@ -1515,6 +1483,10 @@ static HRESULT WINAPI RegExp2_Replace(IRegExp2 *iface, BSTR source, VARIANT repl
     if(This->regexp && !(state = alloc_match_state(This->regexp, &This->pool, cp)))
         hres = E_OUTOFMEMORY;
 
+    buf = SysAllocString(L"");
+    if(!buf)
+        hres = E_OUTOFMEMORY;
+
     while(SUCCEEDED(hres)) {
         if(This->regexp) {
             prev_cp = cp;
@@ -1530,38 +1502,38 @@ static HRESULT WINAPI RegExp2_Replace(IRegExp2 *iface, BSTR source, VARIANT repl
             prev_cp = cp;
         }
 
-        hres = strbuf_append(&buf, prev_cp, cp - prev_cp - match_len);
+        hres = bstrcat(&buf, prev_cp, cp - prev_cp - match_len);
         if(FAILED(hres))
             break;
 
         prev_ptr = replace;
         while((ptr = wmemchr(prev_ptr, '$', replace + replace_len - prev_ptr))) {
-            hres = strbuf_append(&buf, prev_ptr, ptr - prev_ptr);
+            hres = bstrcat(&buf, prev_ptr, ptr - prev_ptr);
             if(FAILED(hres))
                 break;
 
             switch(ptr[1]) {
             case '$':
-                hres = strbuf_append(&buf, ptr, 1);
+                hres = bstrcat(&buf, ptr, 1);
                 prev_ptr = ptr + 2;
                 break;
             case '&':
-                hres = strbuf_append(&buf, cp - match_len, match_len);
+                hres = bstrcat(&buf, cp - match_len, match_len);
                 prev_ptr = ptr + 2;
                 break;
             case '`':
-                hres = strbuf_append(&buf, source, cp - source - match_len);
+                hres = bstrcat(&buf, source, cp - source - match_len);
                 prev_ptr = ptr + 2;
                 break;
             case '\'':
-                hres = strbuf_append(&buf, cp, source + source_len - cp);
+                hres = bstrcat(&buf, cp, source + source_len - cp);
                 prev_ptr = ptr + 2;
                 break;
             default: {
                 DWORD idx;
 
                 if(!iswdigit(ptr[1])) {
-                    hres = strbuf_append(&buf, ptr, 1);
+                    hres = bstrcat(&buf, ptr, 1);
                     prev_ptr = ptr + 1;
                     break;
                 }
@@ -1573,13 +1545,13 @@ static HRESULT WINAPI RegExp2_Replace(IRegExp2 *iface, BSTR source, VARIANT repl
                 }else if(idx && idx <= state->paren_count) {
                     prev_ptr = ptr + 2;
                 }else {
-                    hres = strbuf_append(&buf, ptr, 1);
+                    hres = bstrcat(&buf, ptr, 1);
                     prev_ptr = ptr + 1;
                     break;
                 }
 
                 if(state->parens[idx - 1].index != -1)
-                    hres = strbuf_append(&buf, source + state->parens[idx - 1].index,
+                    hres = bstrcat(&buf, source + state->parens[idx - 1].index,
                                          state->parens[idx - 1].length);
                 break;
             }
@@ -1588,7 +1560,7 @@ static HRESULT WINAPI RegExp2_Replace(IRegExp2 *iface, BSTR source, VARIANT repl
                 break;
         }
         if(SUCCEEDED(hres))
-            hres = strbuf_append(&buf, prev_ptr, replace + replace_len - prev_ptr);
+            hres = bstrcat(&buf, prev_ptr, replace + replace_len - prev_ptr);
         if(FAILED(hres))
             break;
 
@@ -1597,13 +1569,15 @@ static HRESULT WINAPI RegExp2_Replace(IRegExp2 *iface, BSTR source, VARIANT repl
     }
 
     if(SUCCEEDED(hres)) {
-        hres = strbuf_append(&buf, cp, source + source_len - cp);
-        if(SUCCEEDED(hres) && !(*ret = SysAllocStringLen(buf.buf, buf.len)))
-            hres = E_OUTOFMEMORY;
+        hres = bstrcat(&buf, cp, source + source_len - cp);
+        if(SUCCEEDED(hres))
+            *ret = buf;
     }
 
+    if(FAILED(hres))
+        SysFreeString(buf);
+
     heap_pool_clear(mark);
-    heap_free(buf.buf);
     SysFreeString(replace);
     return hres;
 }
-- 
2.20.1




More information about the wine-devel mailing list