Fix integer based resource id assumption.

Add support for string based type ids.
This commit is contained in:
Ulrich Czekalla 1999-09-27 13:31:47 +00:00 committed by Alexandre Julliard
parent a39ad1af4b
commit e91d976e17
1 changed files with 23 additions and 23 deletions

View File

@ -37,56 +37,56 @@ void LIBRES_RegisterResources(const wrc_resource32_t * const * Res)
/********************************************************************** /**********************************************************************
* LIBRES_FindResource * 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 ) HRSRC LIBRES_FindResource( HINSTANCE hModule, LPCWSTR name, LPCWSTR type )
{ {
int nameid=0,typeid; LPCWSTR nameid = name, typeid = type;
ResListE* ResBlock; ResListE* ResBlock;
const wrc_resource32_t* const * Res; const wrc_resource32_t* const * Res;
CmpFunc_t EqualNames = CompareOrdinal;
CmpFunc_t EqualTypes = CompareOrdinal;
if(HIWORD(name)) if(HIWORD(name))
{ {
if(*name=='#') if(*name=='#')
{ {
LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name ); LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
nameid = atoi(nameA+1); nameid = (LPCWSTR) atoi(nameA+1);
HeapFree( GetProcessHeap(), 0, nameA ); HeapFree( GetProcessHeap(), 0, nameA );
name=NULL;
} }
}
else else
{ EqualNames = CompareName;
nameid=LOWORD(name);
name=NULL;
} }
if(HIWORD(type)) if(HIWORD(type))
{ {
if(*type=='#') if(*type=='#')
{ {
LPSTR typeA = HEAP_strdupWtoA( GetProcessHeap(), 0, type ); LPSTR typeA = HEAP_strdupWtoA( GetProcessHeap(), 0, type );
typeid=atoi(typeA+1); typeid= (LPCWSTR) atoi(typeA+1);
HeapFree( GetProcessHeap(), 0, typeA ); HeapFree( GetProcessHeap(), 0, typeA );
} }
else else
{ EqualTypes = CompareName;
TRACE("(*,*,type=string): Returning 0\n");
return 0;
}
} }
else
typeid=LOWORD(type);
/* FIXME: types can be strings */
for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next) for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next)
for(Res=ResBlock->Resources; *Res; Res++) for(Res=ResBlock->Resources; *Res; Res++)
if(name) if (EqualNames(nameid, (*Res)->resname, (*Res)->resid) &&
{ EqualTypes(typeid, (*Res)->restypename, (*Res)->restype))
if((*Res)->restype==typeid &&
!CRTDLL__wcsnicmp((LPCWSTR)((*Res)->resname+1), name, *((*Res)->resname)))
return (HRSRC)*Res;
}
else
if((*Res)->restype==typeid && (*Res)->resid==nameid)
return (HRSRC)*Res; return (HRSRC)*Res;
return 0; return 0;
} }