Modified IcmpCloseHandle and IcmpSendEchoRequest so that we don't
[wine] / loader / libres.c
1 /*
2  * WINElib-Resources
3  *
4  * Copied and modified heavily from loader/resource.c
5  */
6
7 #include <stdlib.h>
8 #include "wine/winestring.h"
9 #include "libres.h"
10 #include "resource.h"
11 #include "debugtools.h"
12 #include "heap.h"
13 #include "crtdll.h"
14 #include "xmalloc.h"
15
16 DEFAULT_DEBUG_CHANNEL(resource)
17
18 typedef struct RLE
19 {
20     const wrc_resource32_t * const * Resources;  /* NULL-terminated array of pointers */
21     struct RLE* next;
22 } ResListE;
23
24 static ResListE* ResourceList=NULL;
25
26 void LIBRES_RegisterResources(const wrc_resource32_t * const * Res)
27 {
28   ResListE** Curr;
29   ResListE* n;
30   for(Curr=&ResourceList; *Curr; Curr=&((*Curr)->next)) { }
31   n=xmalloc(sizeof(ResListE));
32   n->Resources=Res;
33   n->next=NULL;
34   *Curr=n;
35 }
36
37 /**********************************************************************
38  *          LIBRES_FindResource
39  */
40 typedef int (*CmpFunc_t)(LPCWSTR a, LPCWSTR b, int c);
41
42 int CompareOrdinal(LPCWSTR ordinal, LPCWSTR resstr, int resid)
43 {
44     return !resstr && (resid == LOWORD(ordinal));
45
46         
47 int CompareName(LPCWSTR name, LPCWSTR resstr, int resid)
48 {
49     return resstr && !CRTDLL__wcsnicmp(resstr+1, name, *(resstr));
50 }
51
52 HRSRC LIBRES_FindResource( HINSTANCE hModule, LPCWSTR name, LPCWSTR type )
53 {
54   LPCWSTR nameid = name, typeid = type;
55   ResListE* ResBlock;
56   const wrc_resource32_t* const * Res;
57   CmpFunc_t EqualNames = CompareOrdinal;
58   CmpFunc_t EqualTypes = CompareOrdinal;
59
60   if(HIWORD(name))
61   {
62     if(*name=='#')
63     {
64         LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
65         nameid = (LPCWSTR) atoi(nameA+1);
66         HeapFree( GetProcessHeap(), 0, nameA );
67     }
68   else
69         EqualNames = CompareName;
70   }
71
72   if(HIWORD(type))
73   {
74     if(*type=='#')
75     {
76         LPSTR typeA = HEAP_strdupWtoA( GetProcessHeap(), 0, type );
77         typeid= (LPCWSTR) atoi(typeA+1);
78         HeapFree( GetProcessHeap(), 0, typeA );
79     }
80     else
81         EqualTypes = CompareName;
82   }
83   
84   for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next)
85     for(Res=ResBlock->Resources; *Res; Res++)
86         if (EqualNames(nameid, (*Res)->resname, (*Res)->resid) && 
87                 EqualTypes(typeid, (*Res)->restypename, (*Res)->restype))
88           return (HRSRC)*Res;
89
90   return 0;
91 }
92
93
94 /**********************************************************************
95  *          LIBRES_LoadResource    
96  */
97 HGLOBAL LIBRES_LoadResource( HINSTANCE hModule, HRSRC hRsrc )
98 {
99   return (HGLOBAL)(((wrc_resource32_t*)hRsrc)->data);
100 }
101
102
103 /**********************************************************************
104  *          LIBRES_SizeofResource    
105  */
106 DWORD LIBRES_SizeofResource( HINSTANCE hModule, HRSRC hRsrc )
107 {
108   return (DWORD)(((wrc_resource32_t*)hRsrc)->datasize);
109 }