/* * WINElib-Resources * * Copied and modified heavily from loader/resource.c */ #include #include #include "libres.h" #include "windows.h" #include "xmalloc.h" typedef struct RLE { const struct resource* const * Resources; /* NULL-terminated array of pointers */ struct RLE* next; } ResListE; static ResListE* ResourceList=NULL; void LIBRES_RegisterResources(const struct resource* const * Res) { ResListE** Curr; ResListE* n; for(Curr=&ResourceList; *Curr; Curr=&((*Curr)->next)) { } n=xmalloc(sizeof(ResListE)); n->Resources=Res; n->next=NULL; *Curr=n; } /********************************************************************** * LIBRES_FindResource */ HRSRC LIBRES_FindResource( HINSTANCE hModule, LPCSTR name, LPCSTR type ) { int nameid=0,typeid; ResListE* ResBlock; const struct resource* const * Res; if(HIWORD(name)) { if(*name=='#') { nameid=atoi(name+1); name=NULL; } } else { nameid=LOWORD(name); name=NULL; } if(HIWORD(type)) { if(*type=='#') typeid=atoi(type+1); else { WINELIB_UNIMP("LIBRES_FindResource(*,*,type=string)"); return 0; } } else typeid=LOWORD(type); for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next) for(Res=ResBlock->Resources; *Res; Res++) if(name) { if((*Res)->type==typeid && !lstrcmpi((*Res)->name,name)) return (HRSRC)*Res; } else if((*Res)->type==typeid && (*Res)->id==nameid) return (HRSRC)*Res; return 0; } /********************************************************************** * LIBRES_LoadResource */ HGLOBAL LIBRES_LoadResource( HINSTANCE hModule, HRSRC hRsrc ) { return (HGLOBAL)(((struct resource*)hRsrc)->bytes); } /********************************************************************** * LIBRES_LockResource */ LPVOID LIBRES_LockResource( HGLOBAL handle ) { return (LPVOID)handle; } /********************************************************************** * LIBRES_FreeResource */ BOOL LIBRES_FreeResource( HGLOBAL handle ) { return 0; /* Obsolete in Win32 */ } /********************************************************************** * LIBRES_AccessResource */ INT LIBRES_AccessResource( HINSTANCE hModule, HRSRC hRsrc ) { WINELIB_UNIMP("LIBRES_AccessResource()"); return -1; /* Obsolete in Win32 */ } /********************************************************************** * LIBRES_SizeofResource */ DWORD LIBRES_SizeofResource( HINSTANCE hModule, HRSRC hRsrc ) { return (DWORD)(((struct resource*)hRsrc)->size); } /********************************************************************** * LIBRES_AllocResource */ HGLOBAL LIBRES_AllocResource( HINSTANCE hModule, HRSRC hRsrc, DWORD size ) { WINELIB_UNIMP("LIBRES_AllocResource()"); return 0; /* Obsolete in Win32 */ }