Jacek Caban : jscript: Reimplemented do_attribute_tag_format without direct access to object' s string buffer.

Alexandre Julliard julliard at winehq.org
Wed Mar 6 13:11:54 CST 2013


Module: wine
Branch: master
Commit: 6eaef96dad12fb4aaec5044421941f3cd7ddb44a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6eaef96dad12fb4aaec5044421941f3cd7ddb44a

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Mar  6 12:39:38 2013 +0100

jscript: Reimplemented do_attribute_tag_format without direct access to object's string buffer.

---

 dlls/jscript/string.c |   39 +++++++++++++++++++++++++++++++--------
 1 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c
index 6235b51..8f38621 100644
--- a/dlls/jscript/string.c
+++ b/dlls/jscript/string.c
@@ -186,14 +186,11 @@ static HRESULT do_attributeless_tag_format(script_ctx_t *ctx, vdisp_t *jsthis, j
 }
 
 static HRESULT do_attribute_tag_format(script_ctx_t *ctx, vdisp_t *jsthis, unsigned argc, jsval_t *argv, jsval_t *r,
-        const WCHAR *tagname, const WCHAR *attr)
+        const WCHAR *tagname, const WCHAR *attrname)
 {
-    static const WCHAR tagfmtW[]
-        = {'<','%','s',' ','%','s','=','\"','%','s','\"','>','%','s','<','/','%','s','>',0};
     static const WCHAR undefinedW[] = {'u','n','d','e','f','i','n','e','d',0};
 
     jsstr_t *str, *attr_value = NULL;
-    const WCHAR *attr_str;
     unsigned attr_len;
     HRESULT hres;
 
@@ -207,19 +204,45 @@ static HRESULT do_attribute_tag_format(script_ctx_t *ctx, vdisp_t *jsthis, unsig
             jsstr_release(str);
             return hres;
         }
-        attr_str = attr_value->str;
         attr_len = jsstr_length(attr_value);
     }else {
-        attr_str = undefinedW;
         attr_len = sizeof(undefinedW)/sizeof(WCHAR)-1;
     }
 
     if(r) {
+        unsigned attrname_len = strlenW(attrname);
+        unsigned tagname_len = strlenW(tagname);
         jsstr_t *ret;
 
-        ret = jsstr_alloc_buf(2*strlenW(tagname) + strlenW(attr) + attr_len + jsstr_length(str) + 9);
+        ret = jsstr_alloc_buf(2*tagname_len + attrname_len + attr_len + jsstr_length(str) + 9);
         if(ret) {
-            sprintfW(ret->str, tagfmtW, tagname, attr, attr_str, str->str, tagname);
+            WCHAR *ptr = ret->str;
+
+            *ptr++ = '<';
+            memcpy(ptr, tagname, tagname_len*sizeof(WCHAR));
+            ptr += tagname_len;
+            *ptr++ = ' ';
+            memcpy(ptr, attrname, attrname_len*sizeof(WCHAR));
+            ptr += attrname_len;
+            *ptr++ = '=';
+            *ptr++ = '"';
+
+            if(attr_value)
+                jsstr_flush(attr_value, ptr);
+            else
+                memcpy(ptr, undefinedW, attr_len*sizeof(WCHAR));
+            ptr += attr_len;
+
+            *ptr++ = '"';
+            *ptr++ = '>';
+            ptr += jsstr_flush(str, ptr);
+
+            *ptr++ = '<';
+            *ptr++ = '/';
+            memcpy(ptr, tagname, tagname_len*sizeof(WCHAR));
+            ptr += tagname_len;
+            *ptr = '>';
+
             *r = jsval_string(ret);
         }else {
             hres = E_OUTOFMEMORY;




More information about the wine-cvs mailing list