- Clean up method implementations to be consistent and pass tests. - Factor out common code. - Validate arguments. - Correctly match szNameBuf user passed strings as case-insensitive as per documentation. - Match method parameter identifiers to be as per documentation. - Rewrite where required to use common helpers.
Signed-off-by: Edward O'Callaghan edward@antitrust.cc
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 c4f00ca5bea..f12185f85fc 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; @@ -5101,26 +5094,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; }
} @@ -5150,20 +5143,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; } @@ -5171,7 +5162,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 | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index f12185f85fc..00a148154eb 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -5103,17 +5103,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; }
} @@ -5149,9 +5149,10 @@ 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; + TLBVarDesc *pVDesc; UINT fdc;
if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), name)) { @@ -5160,17 +5161,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; + pVDesc = TLB_get_vardesc_by_name(pTInfo, name); + if (pVDesc) { + memid[count] = pVDesc->vardesc.memid; goto ITypeLib2_fnFindName_exit; }
@@ -5673,14 +5674,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 00a148154eb..28c29777ffb 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -5094,27 +5094,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]; int pc; - if(!lstrcmpiW(TLB_get_bstr(pFDesc->Name), szNameBuf)) goto ITypeLib2_fnIsName_exit; + + 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 28c29777ffb..f11cab97078 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -5141,8 +5141,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) @@ -5151,9 +5151,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(). @@ -5162,7 +5162,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName( TLBVarDesc *pVDesc; 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; } @@ -5170,13 +5170,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; } }
- pVDesc = TLB_get_vardesc_by_name(pTInfo, name); + 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 f11cab97078..8ac2b25961b 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; @@ -5103,25 +5108,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]; int pc;
- 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; + }
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; @@ -5164,6 +5177,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; }
@@ -5172,6 +5186,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; } } @@ -5179,6 +5194,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName( 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 8ac2b25961b..d64d4dbb585 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -5102,6 +5102,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 | 45 ++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 18 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index d64d4dbb585..3f664f60bbd 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; @@ -5108,24 +5120,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]; - int pc; + 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];
- 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; @@ -5175,8 +5187,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]; + TLBFuncDesc *pFDesc; TLBVarDesc *pVDesc; - UINT fdc;
if(!lstrcmpiW(TLB_get_bstr(pTInfo->Name), szNameBuf)) { memid[count] = MEMBERID_NIL; @@ -5184,14 +5196,11 @@ 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; }
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 | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 3f664f60bbd..b116d5ca9b3 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; @@ -5121,6 +5137,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)) { @@ -5134,15 +5151,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
Use helpers and reduce excessive cyclomatic complexity and spurious syntax.
Signed-off-by: Edward O'Callaghan edward@antitrust.cc --- dlls/oleaut32/typelib.c | 78 ++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 37 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index b116d5ca9b3..45613ca576c 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -6364,61 +6364,65 @@ static HRESULT WINAPI ITypeInfo_fnGetImplTypeFlags( ITypeInfo2 *iface, }
/* GetIDsOfNames - * Maps between member names and member IDs, and parameter names and - * parameter IDs. + * Maps between member names and member IDs, parameter names and IDs. */ static HRESULT WINAPI ITypeInfo_fnGetIDsOfNames( ITypeInfo2 *iface, LPOLESTR *rgszNames, UINT cNames, MEMBERID *pMemId) { ITypeInfoImpl *This = impl_from_ITypeInfo2(iface); - const TLBVarDesc *pVDesc; - HRESULT ret=S_OK; - UINT i, fdc; + TLBFuncDesc *pFDesc; + TLBVarDesc *pVDesc; + ITypeInfo *pTInfo; + HRESULT ret = S_OK;
TRACE("%p, %s, %d.\n", iface, debugstr_w(*rgszNames), cNames);
/* init out parameters in case of failure */ - for (i = 0; i < cNames; i++) + for (UINT i = 0; i < cNames; i++) pMemId[i] = MEMBERID_NIL;
- for (fdc = 0; fdc < This->typeattr.cFuncs; ++fdc) { - int j; - const TLBFuncDesc *pFDesc = &This->funcdescs[fdc]; - if(!lstrcmpiW(*rgszNames, TLB_get_bstr(pFDesc->Name))) { - if(cNames) *pMemId=pFDesc->funcdesc.memid; - for(i=1; i < cNames; i++){ - for(j=0; j<pFDesc->funcdesc.cParams; j++) - if(!lstrcmpiW(rgszNames[i],TLB_get_bstr(pFDesc->pParamDesc[j].Name))) - break; - if( j<pFDesc->funcdesc.cParams) - pMemId[i]=j; - else - ret=DISP_E_UNKNOWNNAME; - }; - TRACE("-- %#lx.\n", ret); - return ret; + pFDesc = TLB_get_funcdesc_by_name(This, *rgszNames); + if (pFDesc) { + if (cNames) *pMemId = pFDesc->funcdesc.memid; + + for (UINT i = 1; i < cNames; i++) { + /* TODO: generalise TLB_get_funcparams_by_name(This, rgszNames[i], &pc); */ + for (UINT j = 0; j < pFDesc->funcdesc.cParams; j++) + if (!lstrcmpiW(rgszNames[i], TLB_get_bstr(pFDesc->pParamDesc[j].Name))) + break; + if (j < pFDesc->funcdesc.cParams) + pMemId[i] = j; + else + ret = DISP_E_UNKNOWNNAME; } + + TRACE("-- %#lx.\n", ret); + return ret; } + pVDesc = TLB_get_vardesc_by_name(This, *rgszNames); - if(pVDesc){ - if(cNames) - *pMemId = pVDesc->vardesc.memid; + if (pVDesc) { + if (cNames) *pMemId = pVDesc->vardesc.memid; return ret; } + /* not found, see if it can be found in an inherited interface */ - if(This->impltypes) { - /* recursive search */ - ITypeInfo *pTInfo; - ret = ITypeInfo2_GetRefTypeInfo(iface, This->impltypes[0].hRef, &pTInfo); - if(SUCCEEDED(ret)){ - ret=ITypeInfo_GetIDsOfNames(pTInfo, rgszNames, cNames, pMemId ); - ITypeInfo_Release(pTInfo); - return ret; - } - WARN("Could not search inherited interface!\n"); - } else + if (!This->impltypes) { WARN("no names found\n"); - return DISP_E_UNKNOWNNAME; + return DISP_E_UNKNOWNNAME; + } + + /* recursive search */ + ret = ITypeInfo2_GetRefTypeInfo(iface, This->impltypes[0].hRef, &pTInfo); + if (FAILED(ret)) { + WARN("Could not search inherited interface!\n"); + return DISP_E_UNKNOWNNAME; + } + + ret = ITypeInfo_GetIDsOfNames(pTInfo, rgszNames, cNames, pMemId ); + ITypeInfo_Release(pTInfo); + + return ret; }
From: Edward O'Callaghan edward@antitrust.cc
Allows for a clear ITypeLib2::GetTypeInfoOfGuid() implementation.
Signed-off-by: Edward O'Callaghan edward@antitrust.cc --- dlls/oleaut32/typelib.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 45613ca576c..2b24d4c0be8 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -1753,6 +1753,16 @@ static inline ITypeInfoImpl *TLB_get_typeinfo_by_name(ITypeLibImpl *typelib, con return NULL; }
+static inline ITypeInfoImpl *TLB_get_typeinfo_by_guid(ITypeLibImpl *typelib, REFGUID guid) +{ + for (UINT i = 0; i < typelib->TypeInfoCount; ++i) { + if (IsEqualIID(TLB_get_guid_null(This->typeinfos[i]->guid), guid)) + return typelib->typeinfos[i]; + } + + return NULL; +} + static void TLBVarDesc_Constructor(TLBVarDesc *var_desc) { list_init(&var_desc->custdata_list); @@ -4960,19 +4970,18 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeInfoOfGuid( ITypeInfo **ppTInfo) { ITypeLibImpl *This = impl_from_ITypeLib2(iface); - int i; + ITypeInfoImpl *pTInfo;
TRACE("%p %s %p\n", This, debugstr_guid(guid), ppTInfo);
- for(i = 0; i < This->TypeInfoCount; ++i){ - if(IsEqualIID(TLB_get_guid_null(This->typeinfos[i]->guid), guid)){ - *ppTInfo = (ITypeInfo *)&This->typeinfos[i]->ITypeInfo2_iface; - ITypeInfo_AddRef(*ppTInfo); - return S_OK; - } - } + pTInfo = TLB_get_typeinfo_by_guid(This, guid); + if (!pTInfo) + return TYPE_E_ELEMENTNOTFOUND;
- return TYPE_E_ELEMENTNOTFOUND; + *ppTInfo = (ITypeInfo *)&pTInfo->ITypeInfo2_iface; + ITypeInfo_AddRef(*ppTInfo); + + return S_OK; }
/* ITypeLib::GetLibAttr