Release 980517
[wine] / loader / libres.c
1 /*
2  * WINElib-Resources
3  *
4  * Copied and modified heavily from loader/resource.c
5  */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include "debug.h"
10 #include "libres.h"
11 #include "heap.h"
12 #include "windows.h"
13 #include "xmalloc.h"
14
15 typedef struct RLE
16 {
17     const struct resource* const * Resources;  /* NULL-terminated array of pointers */
18     struct RLE* next;
19 } ResListE;
20
21 static ResListE* ResourceList=NULL;
22
23 void LIBRES_RegisterResources(const struct resource* const * Res)
24 {
25   ResListE** Curr;
26   ResListE* n;
27   for(Curr=&ResourceList; *Curr; Curr=&((*Curr)->next)) { }
28   n=xmalloc(sizeof(ResListE));
29   n->Resources=Res;
30   n->next=NULL;
31   *Curr=n;
32 }
33
34 /**********************************************************************
35  *          LIBRES_FindResource
36  */
37 HRSRC32 LIBRES_FindResource( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type )
38 {
39   int nameid=0,typeid;
40   ResListE* ResBlock;
41   const struct resource* const * Res;
42
43   if(HIWORD(name))
44   {
45     if(*name=='#')
46     {
47         LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
48         nameid = atoi(nameA+1);
49         HeapFree( GetProcessHeap(), 0, nameA );
50         name=NULL;
51     }
52   }
53   else
54   {
55     nameid=LOWORD(name);
56     name=NULL;
57   }
58   if(HIWORD(type))
59   {
60     if(*type=='#')
61     {
62         LPSTR typeA = HEAP_strdupWtoA( GetProcessHeap(), 0, type );
63         typeid=atoi(typeA+1);
64         HeapFree( GetProcessHeap(), 0, typeA );
65     }
66     else
67     {
68       TRACE(resource, "(*,*,type=string): Returning 0\n");
69       return 0;
70     }
71   }
72   else
73     typeid=LOWORD(type);
74   
75   for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next)
76     for(Res=ResBlock->Resources; *Res; Res++)
77       if(name)
78       {
79         if((*Res)->type==typeid && !lstrcmpi32W((LPCWSTR)(*Res)->name,name))
80           return (HRSRC32)*Res;
81       }
82       else
83         if((*Res)->type==typeid && (*Res)->id==nameid)
84           return (HRSRC32)*Res;
85   return 0;
86 }
87
88
89 /**********************************************************************
90  *          LIBRES_LoadResource    
91  */
92 HGLOBAL32 LIBRES_LoadResource( HINSTANCE32 hModule, HRSRC32 hRsrc )
93 {
94   return (HGLOBAL32)(((struct resource*)hRsrc)->bytes);
95 }
96
97
98 /**********************************************************************
99  *          LIBRES_SizeofResource    
100  */
101 DWORD LIBRES_SizeofResource( HINSTANCE32 hModule, HRSRC32 hRsrc )
102 {
103   return (DWORD)(((struct resource*)hRsrc)->size);
104 }