Make both method calls;
1. Consistently written with parameter names as per spec. 2. Fix parameter validation to be consistent with spec. 3. Fix szNameBuf parameter semantics as per spec. 4. Fix szNameBuf casing str search as per spec. 5. Factor out common code into TLB_ helpers vastly improves readability.
-- v3: dlls/oleaut32: Scope indexer to loops in fn[Is|Find]Name() dlls/oleaut32: Factor out TLB_get_funcparams_by_name() dlls/oleaut32: Factor out TLB_get_funcdesc_by_name() dlls/oleaut32: Validate args of ITypeLib2_fnIsName() dlls/oleaut32: fn(Is|Find)Name should set szNameBuf with correct case dlls/oleaut32: Use consistent param identifiers in fnFindName dlls/oleaut32: Mostly mirror fnFindName impl in typelib.c
From: Edward O'Callaghan edward@antitrust.cc
Signed-off-by: Edward O'Callaghan edward@antitrust.cc --- dlls/oleaut32/typelib.c | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index f421a76fe95..088fc06b119 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -1285,13 +1285,6 @@ static inline BSTR TLB_get_bstr(const TLBString *str) return str != NULL ? str->str : NULL; }
-static inline int TLB_str_memcmp(void *left, const TLBString *str, DWORD len) -{ - if(!str) - return 1; - return memcmp(left, str->str, len); -} - static inline const GUID *TLB_get_guidref(const TLBGuid *guid) { return guid != NULL ? &guid->guid : NULL; @@ -5026,26 +5019,26 @@ static HRESULT WINAPI ITypeLib2_fnIsName( { ITypeLibImpl *This = impl_from_ITypeLib2(iface); int tic; - UINT nNameBufLen = (lstrlenW(szNameBuf)+1)*sizeof(WCHAR), fdc, vrc; + UINT fdc, vrc;
TRACE("%p, %s, %#lx, %p.\n", iface, debugstr_w(szNameBuf), lHashVal, pfName);
*pfName=TRUE; for(tic = 0; tic < This->TypeInfoCount; ++tic){ ITypeInfoImpl *pTInfo = This->typeinfos[tic]; - if(!TLB_str_memcmp(szNameBuf, pTInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; + if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; for(fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) { TLBFuncDesc *pFInfo = &pTInfo->funcdescs[fdc]; int pc; - if(!TLB_str_memcmp(szNameBuf, pFInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; + if(!lstrcmpiW(TLB_get_bstr(pFInfo->Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; for(pc=0; pc < pFInfo->funcdesc.cParams; pc++){ - if(!TLB_str_memcmp(szNameBuf, pFInfo->pParamDesc[pc].Name, nNameBufLen)) + if(!lstrcmpiW(TLB_get_bstr(pFInfo->pParamDesc[pc].Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; } } for(vrc = 0; vrc < pTInfo->typeattr.cVars; ++vrc){ TLBVarDesc *pVInfo = &pTInfo->vardescs[vrc]; - if(!TLB_str_memcmp(szNameBuf, pVInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; + if(!lstrcmpiW(TLB_get_bstr(pVInfo->Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; }
} @@ -5075,20 +5068,18 @@ static HRESULT WINAPI ITypeLib2_fnFindName( ITypeLibImpl *This = impl_from_ITypeLib2(iface); int tic; UINT count = 0; - UINT len;
TRACE("%p, %s %#lx, %p, %p, %p.\n", iface, debugstr_w(name), hash, ppTInfo, memid, found);
if ((!name && hash == 0) || !ppTInfo || !memid || !found) return E_INVALIDARG;
- len = (lstrlenW(name) + 1)*sizeof(WCHAR); for(tic = 0; count < *found && tic < This->TypeInfoCount; ++tic) { ITypeInfoImpl *pTInfo = This->typeinfos[tic]; TLBVarDesc *var; UINT fdc;
- if(!TLB_str_memcmp(name, pTInfo->Name, len)) { + if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), name)) { memid[count] = MEMBERID_NIL; goto ITypeLib2_fnFindName_exit; } @@ -5096,7 +5087,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName( for(fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) { TLBFuncDesc *func = &pTInfo->funcdescs[fdc];
- if(!TLB_str_memcmp(name, func->Name, len)) { + if(!lstrcmpiW(TLB_get_bstr(func->Name), name)) { memid[count] = func->funcdesc.memid; goto ITypeLib2_fnFindName_exit; }
From: Edward O'Callaghan edward@antitrust.cc
Make the code a little more consistent to read and grep.
Signed-off-by: Edward O'Callaghan edward@antitrust.cc --- dlls/oleaut32/typelib.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 088fc06b119..b0845c0132d 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -5028,17 +5028,17 @@ static HRESULT WINAPI ITypeLib2_fnIsName( ITypeInfoImpl *pTInfo = This->typeinfos[tic]; if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; for(fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) { - TLBFuncDesc *pFInfo = &pTInfo->funcdescs[fdc]; + TLBFuncDesc *pFDesc = &pTInfo->funcdescs[fdc]; int pc; - if(!lstrcmpiW(TLB_get_bstr(pFInfo->Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; - for(pc=0; pc < pFInfo->funcdesc.cParams; pc++){ - if(!lstrcmpiW(TLB_get_bstr(pFInfo->pParamDesc[pc].Name), szNameBuf)) + if(!lstrcmpiW(TLB_get_bstr(pFDesc->Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; + for(pc=0; pc < pFDesc->funcdesc.cParams; pc++){ + if(!lstrcmpiW(TLB_get_bstr(pFDesc->pParamDesc[pc].Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; } } for(vrc = 0; vrc < pTInfo->typeattr.cVars; ++vrc){ - TLBVarDesc *pVInfo = &pTInfo->vardescs[vrc]; - if(!lstrcmpiW(TLB_get_bstr(pVInfo->Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; + TLBVarDesc *pVDesc = &pTInfo->vardescs[vrc]; + if(!lstrcmpiW(TLB_get_bstr(pVDesc->Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; }
} @@ -5074,9 +5074,9 @@ static HRESULT WINAPI ITypeLib2_fnFindName( if ((!name && hash == 0) || !ppTInfo || !memid || !found) return E_INVALIDARG;
+ // TODO: factor out common impl with fnIsName(). for(tic = 0; count < *found && tic < This->TypeInfoCount; ++tic) { ITypeInfoImpl *pTInfo = This->typeinfos[tic]; - TLBVarDesc *var; UINT fdc;
if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), name)) { @@ -5085,17 +5085,17 @@ static HRESULT WINAPI ITypeLib2_fnFindName( }
for(fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) { - TLBFuncDesc *func = &pTInfo->funcdescs[fdc]; + TLBFuncDesc *pFDesc = &pTInfo->funcdescs[fdc];
- if(!lstrcmpiW(TLB_get_bstr(func->Name), name)) { - memid[count] = func->funcdesc.memid; + if(!lstrcmpiW(TLB_get_bstr(pFDesc->Name), name)) { + memid[count] = pFDesc->funcdesc.memid; goto ITypeLib2_fnFindName_exit; } }
- var = TLB_get_vardesc_by_name(pTInfo, name); - if (var) { - memid[count] = var->vardesc.memid; + TLBVarDesc *pVDesc = TLB_get_vardesc_by_name(pTInfo, name); + if (pVDesc) { + memid[count] = pVDesc->vardesc.memid; goto ITypeLib2_fnFindName_exit; }
@@ -5598,14 +5598,14 @@ static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This)
for(i = 0; i < This->typeattr.cVars; ++i) { - TLBVarDesc *pVInfo = &This->vardescs[i]; - if (pVInfo->vardesc_create) { - TLB_FreeVarDesc(pVInfo->vardesc_create); - } else if (pVInfo->vardesc.varkind == VAR_CONST) { - VariantClear(pVInfo->vardesc.lpvarValue); - free(pVInfo->vardesc.lpvarValue); + TLBVarDesc *pVDesc = &This->vardescs[i]; + if (pVDesc->vardesc_create) { + TLB_FreeVarDesc(pVDesc->vardesc_create); + } else if (pVDesc->vardesc.varkind == VAR_CONST) { + VariantClear(pVDesc->vardesc.lpvarValue); + free(pVDesc->vardesc.lpvarValue); } - TLB_FreeCustData(&pVInfo->custdata_list); + TLB_FreeCustData(&pVDesc->custdata_list); } free(This->vardescs);
From: Edward O'Callaghan edward@antitrust.cc
The methods fnFindName and fnIsName() are almost identical. Consistently match them where possible, paving the way for a common internal worker implementation.
Signed-off-by: Edward O'Callaghan edward@antitrust.cc --- dlls/oleaut32/typelib.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index b0845c0132d..2b82a1fb68b 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -5019,27 +5019,34 @@ static HRESULT WINAPI ITypeLib2_fnIsName( { ITypeLibImpl *This = impl_from_ITypeLib2(iface); int tic; - UINT fdc, vrc;
TRACE("%p, %s, %#lx, %p.\n", iface, debugstr_w(szNameBuf), lHashVal, pfName);
*pfName=TRUE; for(tic = 0; tic < This->TypeInfoCount; ++tic){ ITypeInfoImpl *pTInfo = This->typeinfos[tic]; - if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; + TLBVarDesc *pVDesc; + UINT fdc; + + if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), szNameBuf)) + goto ITypeLib2_fnIsName_exit; + for(fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) { TLBFuncDesc *pFDesc = &pTInfo->funcdescs[fdc]; + + if(!lstrcmpiW(TLB_get_bstr(pFDesc->Name), szNameBuf)) + goto ITypeLib2_fnIsName_exit; + int pc; - if(!lstrcmpiW(TLB_get_bstr(pFDesc->Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; for(pc=0; pc < pFDesc->funcdesc.cParams; pc++){ if(!lstrcmpiW(TLB_get_bstr(pFDesc->pParamDesc[pc].Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; } } - for(vrc = 0; vrc < pTInfo->typeattr.cVars; ++vrc){ - TLBVarDesc *pVDesc = &pTInfo->vardescs[vrc]; - if(!lstrcmpiW(TLB_get_bstr(pVDesc->Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; - } + + pVDesc = TLB_get_vardesc_by_name(pTInfo, szNameBuf); + if (pVDesc) + goto ITypeLib2_fnIsName_exit;
} *pfName=FALSE;
From: Edward O'Callaghan edward@antitrust.cc
Signed-off-by: Edward O'Callaghan edward@antitrust.cc --- dlls/oleaut32/typelib.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 2b82a1fb68b..754a2a15867 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -5066,8 +5066,8 @@ ITypeLib2_fnIsName_exit: */ static HRESULT WINAPI ITypeLib2_fnFindName( ITypeLib2 *iface, - LPOLESTR name, - ULONG hash, + LPOLESTR szNameBuf, + ULONG lHashVal, ITypeInfo **ppTInfo, MEMBERID *memid, UINT16 *found) @@ -5076,9 +5076,9 @@ static HRESULT WINAPI ITypeLib2_fnFindName( int tic; UINT count = 0;
- TRACE("%p, %s %#lx, %p, %p, %p.\n", iface, debugstr_w(name), hash, ppTInfo, memid, found); + TRACE("%p, %s %#lx, %p, %p, %p.\n", iface, debugstr_w(szNameBuf), lHashVal, ppTInfo, memid, found);
- if ((!name && hash == 0) || !ppTInfo || !memid || !found) + if ((!szNameBuf && !lHashVal) || !ppTInfo || !memid || !found) return E_INVALIDARG;
// TODO: factor out common impl with fnIsName(). @@ -5086,7 +5086,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName( ITypeInfoImpl *pTInfo = This->typeinfos[tic]; UINT fdc;
- if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), name)) { + if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), szNameBuf)) { memid[count] = MEMBERID_NIL; goto ITypeLib2_fnFindName_exit; } @@ -5094,13 +5094,13 @@ static HRESULT WINAPI ITypeLib2_fnFindName( for(fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) { TLBFuncDesc *pFDesc = &pTInfo->funcdescs[fdc];
- if(!lstrcmpiW(TLB_get_bstr(pFDesc->Name), name)) { + if(!lstrcmpiW(TLB_get_bstr(pFDesc->Name), szNameBuf)) { memid[count] = pFDesc->funcdesc.memid; goto ITypeLib2_fnFindName_exit; } }
- TLBVarDesc *pVDesc = TLB_get_vardesc_by_name(pTInfo, name); + TLBVarDesc *pVDesc = TLB_get_vardesc_by_name(pTInfo, szNameBuf); if (pVDesc) { memid[count] = pVDesc->vardesc.memid; goto ITypeLib2_fnFindName_exit;
From: Edward O'Callaghan edward@antitrust.cc
Both the ::IsName() and ::FindName() methods should do case-insensitive searches however should fix up the szNameBuf param with any case diff upon a match.
Test-Fix-Spotted-by: Damien Zammit damien@zamaudio.com Signed-off-by: Edward O'Callaghan edward@antitrust.cc --- dlls/oleaut32/tests/typelib.c | 2 -- dlls/oleaut32/typelib.c | 24 ++++++++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c index 153964e17d5..f75102538fe 100644 --- a/dlls/oleaut32/tests/typelib.c +++ b/dlls/oleaut32/tests/typelib.c @@ -7743,11 +7743,9 @@ static void test_FindName(void) ti = (void*)0xdeadbeef; hr = ITypeLib_FindName(tl, buffW, 0, &ti, &memid, &c); ok(hr == S_OK, "got 0x%08lx\n", hr); -todo_wine { ok(memid == MEMBERID_NIL, "got %ld\n", memid); ok(!lstrcmpW(buffW, wszGUID), "got %s\n", wine_dbgstr_w(buffW)); ok(c == 1, "got %d\n", c); -} if (c == 1) ITypeInfo_Release(ti);
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 754a2a15867..2920bc96989 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -1285,6 +1285,11 @@ static inline BSTR TLB_get_bstr(const TLBString *str) return str != NULL ? str->str : NULL; }
+static inline void TLB_set_bstr(LPOLESTR s, const TLBString *str) +{ + lstrcpyW(s, str->str); +} + static inline const GUID *TLB_get_guidref(const TLBGuid *guid) { return guid != NULL ? &guid->guid : NULL; @@ -5028,25 +5033,33 @@ static HRESULT WINAPI ITypeLib2_fnIsName( TLBVarDesc *pVDesc; UINT fdc;
- if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), szNameBuf)) + if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), szNameBuf)) { + TLB_set_bstr(szNameBuf, pTInfo->Name); goto ITypeLib2_fnIsName_exit; + }
for(fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) { TLBFuncDesc *pFDesc = &pTInfo->funcdescs[fdc];
- if(!lstrcmpiW(TLB_get_bstr(pFDesc->Name), szNameBuf)) + if(!lstrcmpiW(TLB_get_bstr(pFDesc->Name), szNameBuf)) { + TLB_set_bstr(szNameBuf, pFDesc->Name); goto ITypeLib2_fnIsName_exit; + }
int pc; for(pc=0; pc < pFDesc->funcdesc.cParams; pc++){ - if(!lstrcmpiW(TLB_get_bstr(pFDesc->pParamDesc[pc].Name), szNameBuf)) + if(!lstrcmpiW(TLB_get_bstr(pFDesc->pParamDesc[pc].Name), szNameBuf)) { + TLB_set_bstr(szNameBuf, pFDesc->pParamDesc[pc].Name); goto ITypeLib2_fnIsName_exit; + } } }
pVDesc = TLB_get_vardesc_by_name(pTInfo, szNameBuf); - if (pVDesc) + if (pVDesc) { + TLB_set_bstr(szNameBuf, pVDesc->Name); goto ITypeLib2_fnIsName_exit; + }
} *pfName=FALSE; @@ -5088,6 +5101,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName(
if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), szNameBuf)) { memid[count] = MEMBERID_NIL; + TLB_set_bstr(szNameBuf, pTInfo->Name); goto ITypeLib2_fnFindName_exit; }
@@ -5096,6 +5110,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName(
if(!lstrcmpiW(TLB_get_bstr(pFDesc->Name), szNameBuf)) { memid[count] = pFDesc->funcdesc.memid; + TLB_set_bstr(szNameBuf, pFDesc->Name); goto ITypeLib2_fnFindName_exit; } } @@ -5103,6 +5118,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName( TLBVarDesc *pVDesc = TLB_get_vardesc_by_name(pTInfo, szNameBuf); if (pVDesc) { memid[count] = pVDesc->vardesc.memid; + TLB_set_bstr(szNameBuf, pVDesc->Name); goto ITypeLib2_fnFindName_exit; }
From: Edward O'Callaghan edward@antitrust.cc
Signed-off-by: Edward O'Callaghan edward@antitrust.cc --- dlls/oleaut32/typelib.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 2920bc96989..35c7af68efe 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -5027,6 +5027,9 @@ static HRESULT WINAPI ITypeLib2_fnIsName(
TRACE("%p, %s, %#lx, %p.\n", iface, debugstr_w(szNameBuf), lHashVal, pfName);
+ if ((!szNameBuf && !lHashVal) || !pfName) + return E_INVALIDARG; + *pfName=TRUE; for(tic = 0; tic < This->TypeInfoCount; ++tic){ ITypeInfoImpl *pTInfo = This->typeinfos[tic];
From: Edward O'Callaghan edward@antitrust.cc
Signed-off-by: Edward O'Callaghan edward@antitrust.cc --- dlls/oleaut32/typelib.c | 48 +++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 19 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 35c7af68efe..b86828c40c9 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -1677,6 +1677,18 @@ static inline TLBFuncDesc *TLB_get_funcdesc_by_memberid_invkind(ITypeInfoImpl *t return NULL; }
+static inline TLBFuncDesc *TLB_get_funcdesc_by_name(ITypeInfoImpl *typeinfo, const OLECHAR *name) +{ + for (int i = 0; i < typeinfo->typeattr.cFuncs; ++i) { + TLBFuncDesc *pFDesc = &typeinfo->funcdescs[i]; + + if (!lstrcmpiW(TLB_get_bstr(pFDesc->Name), name)) + return pFDesc; + } + + return NULL; +} + static inline TLBVarDesc *TLB_get_vardesc_by_memberid(ITypeInfoImpl *typeinfo, MEMBERID memid) { int i; @@ -5033,24 +5045,24 @@ static HRESULT WINAPI ITypeLib2_fnIsName( *pfName=TRUE; for(tic = 0; tic < This->TypeInfoCount; ++tic){ ITypeInfoImpl *pTInfo = This->typeinfos[tic]; + TLBFuncDesc *pFDesc; TLBVarDesc *pVDesc; - UINT fdc;
if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), szNameBuf)) { TLB_set_bstr(szNameBuf, pTInfo->Name); goto ITypeLib2_fnIsName_exit; }
- for(fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) { - TLBFuncDesc *pFDesc = &pTInfo->funcdescs[fdc]; + pFDesc = TLB_get_funcdesc_by_name(pTInfo, szNameBuf); + if (pFDesc) { + TLB_set_bstr(szNameBuf, pFDesc->Name); + goto ITypeLib2_fnIsName_exit; + }
- if(!lstrcmpiW(TLB_get_bstr(pFDesc->Name), szNameBuf)) { - TLB_set_bstr(szNameBuf, pFDesc->Name); - goto ITypeLib2_fnIsName_exit; - } + for(UINT fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) { + pFDesc = &pTInfo->funcdescs[fdc];
- int pc; - for(pc=0; pc < pFDesc->funcdesc.cParams; pc++){ + for(int pc=0; pc < pFDesc->funcdesc.cParams; pc++){ if(!lstrcmpiW(TLB_get_bstr(pFDesc->pParamDesc[pc].Name), szNameBuf)) { TLB_set_bstr(szNameBuf, pFDesc->pParamDesc[pc].Name); goto ITypeLib2_fnIsName_exit; @@ -5100,7 +5112,8 @@ static HRESULT WINAPI ITypeLib2_fnFindName( // TODO: factor out common impl with fnIsName(). for(tic = 0; count < *found && tic < This->TypeInfoCount; ++tic) { ITypeInfoImpl *pTInfo = This->typeinfos[tic]; - UINT fdc; + TLBFuncDesc *pFDesc; + TLBVarDesc *pVDesc;
if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), szNameBuf)) { memid[count] = MEMBERID_NIL; @@ -5108,17 +5121,14 @@ static HRESULT WINAPI ITypeLib2_fnFindName( goto ITypeLib2_fnFindName_exit; }
- for(fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) { - TLBFuncDesc *pFDesc = &pTInfo->funcdescs[fdc]; - - if(!lstrcmpiW(TLB_get_bstr(pFDesc->Name), szNameBuf)) { - memid[count] = pFDesc->funcdesc.memid; - TLB_set_bstr(szNameBuf, pFDesc->Name); - goto ITypeLib2_fnFindName_exit; - } + pFDesc = TLB_get_funcdesc_by_name(pTInfo, szNameBuf); + if (pFDesc) { + memid[count] = pFDesc->funcdesc.memid; + TLB_set_bstr(szNameBuf, pFDesc->Name); + goto ITypeLib2_fnFindName_exit; }
- TLBVarDesc *pVDesc = TLB_get_vardesc_by_name(pTInfo, szNameBuf); + pVDesc = TLB_get_vardesc_by_name(pTInfo, szNameBuf); if (pVDesc) { memid[count] = pVDesc->vardesc.memid; TLB_set_bstr(szNameBuf, pVDesc->Name);
From: Edward O'Callaghan edward@antitrust.cc
Signed-off-by: Edward O'Callaghan edward@antitrust.cc --- dlls/oleaut32/typelib.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index b86828c40c9..58ee7020521 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -1689,6 +1689,22 @@ static inline TLBFuncDesc *TLB_get_funcdesc_by_name(ITypeInfoImpl *typeinfo, con return NULL; }
+static inline TLBParDesc *TLB_get_funcparams_by_name(ITypeInfoImpl *typeinfo, const OLECHAR *name) +{ + for (int i = 0; i < typeinfo->typeattr.cFuncs; ++i) { + TLBFuncDesc *pFDesc = &typeinfo->funcdescs[i]; + + for (int pc = 0; pc < pFDesc->funcdesc.cParams; pc++){ + TLBParDesc *pPDesc = &pFDesc->pParamDesc[pc]; + + if (!lstrcmpiW(TLB_get_bstr(pPDesc->Name), name)) + return pPDesc; + } + } + + return NULL; +} + static inline TLBVarDesc *TLB_get_vardesc_by_memberid(ITypeInfoImpl *typeinfo, MEMBERID memid) { int i; @@ -5046,6 +5062,7 @@ static HRESULT WINAPI ITypeLib2_fnIsName( for(tic = 0; tic < This->TypeInfoCount; ++tic){ ITypeInfoImpl *pTInfo = This->typeinfos[tic]; TLBFuncDesc *pFDesc; + TLBParDesc *pPDesc; TLBVarDesc *pVDesc;
if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), szNameBuf)) { @@ -5059,15 +5076,10 @@ static HRESULT WINAPI ITypeLib2_fnIsName( goto ITypeLib2_fnIsName_exit; }
- for(UINT fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) { - pFDesc = &pTInfo->funcdescs[fdc]; - - for(int pc=0; pc < pFDesc->funcdesc.cParams; pc++){ - if(!lstrcmpiW(TLB_get_bstr(pFDesc->pParamDesc[pc].Name), szNameBuf)) { - TLB_set_bstr(szNameBuf, pFDesc->pParamDesc[pc].Name); - goto ITypeLib2_fnIsName_exit; - } - } + pPDesc = TLB_get_funcparams_by_name(pTInfo, szNameBuf); + if (pPDesc) { + TLB_set_bstr(szNameBuf, pPDesc->Name); + goto ITypeLib2_fnIsName_exit; }
pVDesc = TLB_get_vardesc_by_name(pTInfo, szNameBuf);
From: Edward O'Callaghan edward@antitrust.cc
Signed-off-by: Edward O'Callaghan edward@antitrust.cc --- dlls/oleaut32/typelib.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 58ee7020521..8ef9b82dd2e 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -5051,7 +5051,6 @@ static HRESULT WINAPI ITypeLib2_fnIsName( BOOL *pfName) { ITypeLibImpl *This = impl_from_ITypeLib2(iface); - int tic;
TRACE("%p, %s, %#lx, %p.\n", iface, debugstr_w(szNameBuf), lHashVal, pfName);
@@ -5059,7 +5058,7 @@ static HRESULT WINAPI ITypeLib2_fnIsName( return E_INVALIDARG;
*pfName=TRUE; - for(tic = 0; tic < This->TypeInfoCount; ++tic){ + for(int tic = 0; tic < This->TypeInfoCount; ++tic){ ITypeInfoImpl *pTInfo = This->typeinfos[tic]; TLBFuncDesc *pFDesc; TLBParDesc *pPDesc; @@ -5113,7 +5112,6 @@ static HRESULT WINAPI ITypeLib2_fnFindName( UINT16 *found) { ITypeLibImpl *This = impl_from_ITypeLib2(iface); - int tic; UINT count = 0;
TRACE("%p, %s %#lx, %p, %p, %p.\n", iface, debugstr_w(szNameBuf), lHashVal, ppTInfo, memid, found); @@ -5122,7 +5120,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName( return E_INVALIDARG;
// TODO: factor out common impl with fnIsName(). - for(tic = 0; count < *found && tic < This->TypeInfoCount; ++tic) { + for(int tic = 0; count < *found && tic < This->TypeInfoCount; ++tic) { ITypeInfoImpl *pTInfo = This->typeinfos[tic]; TLBFuncDesc *pFDesc; TLBVarDesc *pVDesc; @@ -5148,6 +5146,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName( }
continue; + ITypeLib2_fnFindName_exit: ITypeInfo2_AddRef(&pTInfo->ITypeInfo2_iface); ppTInfo[count] = (ITypeInfo *)&pTInfo->ITypeInfo2_iface;