Fix integer based resource id assumption.
Add support for string based type ids.
diff --git a/loader/libres.c b/loader/libres.c
index 68db7dc..c4ec51e 100644
--- a/loader/libres.c
+++ b/loader/libres.c
@@ -37,56 +37,56 @@
/**********************************************************************
* LIBRES_FindResource
*/
+typedef int (*CmpFunc_t)(LPCWSTR a, LPCWSTR b, int c);
+
+int CompareOrdinal(LPCWSTR ordinal, LPCWSTR resstr, int resid)
+{
+ return !resstr && (resid == LOWORD(ordinal));
+}
+
+int CompareName(LPCWSTR name, LPCWSTR resstr, int resid)
+{
+ return resstr && !CRTDLL__wcsnicmp(resstr+1, name, *(resstr));
+}
+
HRSRC LIBRES_FindResource( HINSTANCE hModule, LPCWSTR name, LPCWSTR type )
{
- int nameid=0,typeid;
+ LPCWSTR nameid = name, typeid = type;
ResListE* ResBlock;
const wrc_resource32_t* const * Res;
+ CmpFunc_t EqualNames = CompareOrdinal;
+ CmpFunc_t EqualTypes = CompareOrdinal;
if(HIWORD(name))
{
if(*name=='#')
{
LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
- nameid = atoi(nameA+1);
+ nameid = (LPCWSTR) atoi(nameA+1);
HeapFree( GetProcessHeap(), 0, nameA );
- name=NULL;
}
- }
else
- {
- nameid=LOWORD(name);
- name=NULL;
+ EqualNames = CompareName;
}
+
if(HIWORD(type))
{
if(*type=='#')
{
LPSTR typeA = HEAP_strdupWtoA( GetProcessHeap(), 0, type );
- typeid=atoi(typeA+1);
+ typeid= (LPCWSTR) atoi(typeA+1);
HeapFree( GetProcessHeap(), 0, typeA );
}
else
- {
- TRACE("(*,*,type=string): Returning 0\n");
- return 0;
- }
+ EqualTypes = CompareName;
}
- else
- typeid=LOWORD(type);
- /* FIXME: types can be strings */
for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next)
for(Res=ResBlock->Resources; *Res; Res++)
- if(name)
- {
- if((*Res)->restype==typeid &&
- !CRTDLL__wcsnicmp((LPCWSTR)((*Res)->resname+1), name, *((*Res)->resname)))
+ if (EqualNames(nameid, (*Res)->resname, (*Res)->resid) &&
+ EqualTypes(typeid, (*Res)->restypename, (*Res)->restype))
return (HRSRC)*Res;
- }
- else
- if((*Res)->restype==typeid && (*Res)->resid==nameid)
- return (HRSRC)*Res;
+
return 0;
}