Jacek Caban : mshtml: Clean up get_all and tags (also fixes a typo).
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Mar 22 15:09:01 CST 2006
Module: wine
Branch: refs/heads/master
Commit: b88b981dcbb0b220ef1686a3acde2658c995c7fd
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=b88b981dcbb0b220ef1686a3acde2658c995c7fd
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Mar 22 17:14:42 2006 +0100
mshtml: Clean up get_all and tags (also fixes a typo).
---
dlls/mshtml/htmlelem.c | 80 +++++++++++++++++++++++++-----------------------
1 files changed, 41 insertions(+), 39 deletions(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 41dec13..40d1d36 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -38,6 +38,22 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
static HRESULT HTMLElementCollection_Create(IUnknown*,HTMLElement**,DWORD,IDispatch**);
+typedef struct {
+ HTMLElement **buf;
+ DWORD len;
+ DWORD size;
+} elem_vector;
+
+static void elem_vector_add(elem_vector *buf, HTMLElement *elem)
+{
+ if(buf->len == buf->size) {
+ buf->size <<= 1;
+ buf->buf = HeapReAlloc(GetProcessHeap(), 0, buf->buf, buf->size*sizeof(HTMLElement**));
+ }
+
+ buf->buf[buf->len++] = elem;
+}
+
#define HTMLELEM_THIS(iface) DEFINE_THIS(HTMLElement, HTMLElement, iface)
static HRESULT WINAPI HTMLElement_QueryInterface(IHTMLElement *iface,
@@ -747,8 +763,7 @@ static HRESULT WINAPI HTMLElement_get_ch
return E_NOTIMPL;
}
-static void create_all_list(HTMLDocument *doc, HTMLElement *elem, HTMLElement ***list, DWORD *size,
- DWORD *len)
+static void create_all_list(HTMLDocument *doc, HTMLElement *elem, elem_vector *buf)
{
nsIDOMNodeList *nsnode_list;
nsIDOMNode *iter;
@@ -777,37 +792,30 @@ static void create_all_list(HTMLDocument
if(node->node_type != NT_HTMLELEM)
continue;
- if(*len == *size) {
- *size <<= 1;
- *list = HeapReAlloc(GetProcessHeap(), 0, *list, *size * sizeof(HTMLElement**));
- }
-
- (*list)[(*len)++] = (HTMLElement*)node->impl.elem;
-
- create_all_list(doc, (HTMLElement*)node->impl.elem, list, size, len);
+ elem_vector_add(buf, (HTMLElement*)node->impl.elem);
+ create_all_list(doc, (HTMLElement*)node->impl.elem, buf);
}
}
static HRESULT WINAPI HTMLElement_get_all(IHTMLElement *iface, IDispatch **p)
{
HTMLElement *This = HTMLELEM_THIS(iface);
- HTMLElement **elem_list;
- DWORD list_size = 8, len = 0;
+ elem_vector buf = {NULL, 0, 8};
TRACE("(%p)->(%p)\n", This, p);
- elem_list = HeapAlloc(GetProcessHeap(), 0, list_size*sizeof(HTMLElement**));
+ buf.buf = HeapAlloc(GetProcessHeap(), 0, buf.size*sizeof(HTMLElement**));
- create_all_list(This->node->doc, This, &elem_list, &list_size, &len);
+ create_all_list(This->node->doc, This, &buf);
- if(!len) {
- HeapFree(GetProcessHeap(), 0, elem_list);
- elem_list = NULL;
- }else if(list_size > len) {
- elem_list = HeapReAlloc(GetProcessHeap(), 0, elem_list, len*sizeof(HTMLElement**));
+ if(!buf.len) {
+ HeapFree(GetProcessHeap(), 0, buf.buf);
+ buf.buf = NULL;
+ }else if(buf.size > buf.len) {
+ buf.buf = HeapReAlloc(GetProcessHeap(), 0, buf.buf, buf.len*sizeof(HTMLElement**));
}
- return HTMLElementCollection_Create((IUnknown*)HTMLELEM(This), elem_list, len, p);
+ return HTMLElementCollection_Create((IUnknown*)HTMLELEM(This), buf.buf, buf.len, p);
}
static void HTMLElement_destructor(IUnknown *iface)
@@ -1152,19 +1160,19 @@ static HRESULT WINAPI HTMLElementCollect
VARIANT tagName, IDispatch **pdisp)
{
HTMLElementCollection *This = ELEMCOL_THIS(iface);
- DWORD size = 8, len = 0, i;
- HTMLElement **elem_list;
+ DWORD i;
nsAString tag_str;
const PRUnichar *tag;
+ elem_vector buf = {NULL, 0, 8};
if(V_VT(&tagName) != VT_BSTR) {
WARN("Invalid arg\n");
- return E_INVALIDARG;
+ return DISP_E_MEMBERNOTFOUND;
}
TRACE("(%p)->(%s %p)\n", This, debugstr_w(V_BSTR(&tagName)), pdisp);
- elem_list = HeapAlloc(GetProcessHeap(), 0, size*sizeof(HTMLElement*));
+ buf.buf = HeapAlloc(GetProcessHeap(), 0, buf.size*sizeof(HTMLElement*));
nsAString_Init(&tag_str, NULL);
@@ -1176,28 +1184,22 @@ static HRESULT WINAPI HTMLElementCollect
nsAString_GetData(&tag_str, &tag, NULL);
if(CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, tag, -1,
- V_BSTR(&tagName), -1) == CSTR_EQUAL) {
- if(len == size) {
- size <<= 2;
- elem_list = HeapReAlloc(GetProcessHeap(), 0, elem_list, size);
- }
-
- elem_list[len++] = This->elems[i];
- }
+ V_BSTR(&tagName), -1) == CSTR_EQUAL)
+ elem_vector_add(&buf, This->elems[i]);
}
nsAString_Finish(&tag_str);
- TRACE("fount %ld tags\n", len);
+ TRACE("fount %ld tags\n", buf.len);
- if(!len) {
- HeapFree(GetProcessHeap(), 0, elem_list);
- elem_list = NULL;
- }else if(size > len) {
- HeapReAlloc(GetProcessHeap(), 0, elem_list, len);
+ if(!buf.len) {
+ HeapFree(GetProcessHeap(), 0, buf.buf);
+ buf.buf = NULL;
+ }else if(buf.size > buf.len) {
+ buf.buf = HeapReAlloc(GetProcessHeap(), 0, buf.buf, buf.len);
}
- return HTMLElementCollection_Create(This->ref_unk, elem_list, len, pdisp);
+ return HTMLElementCollection_Create(This->ref_unk, buf.buf, buf.len, pdisp);
}
#undef ELEMCOL_THIS
More information about the wine-cvs
mailing list