]> git.saurik.com Git - wxWidgets.git/blob - src/expat/amiga/expat_lib.c
Compilation fix for PCH-less build after r74586.
[wxWidgets.git] / src / expat / amiga / expat_lib.c
1 /*
2 ** Copyright (c) 2001-2009 Expat maintainers.
3 **
4 ** Permission is hereby granted, free of charge, to any person obtaining
5 ** a copy of this software and associated documentation files (the
6 ** "Software"), to deal in the Software without restriction, including
7 ** without limitation the rights to use, copy, modify, merge, publish,
8 ** distribute, sublicense, and/or sell copies of the Software, and to
9 ** permit persons to whom the Software is furnished to do so, subject to
10 ** the following conditions:
11 **
12 ** The above copyright notice and this permission notice shall be included
13 ** in all copies or substantial portions of the Software.
14 **
15 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21 ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23
24 #ifdef __USE_INLINE__
25 #undef __USE_INLINE__
26 #endif
27
28 #define __NOLIBBASE__
29 #define __NOGLOBALIFACE__
30
31 #include <dos/dos.h>
32 #include <proto/exec.h>
33
34 #include "expat_base.h"
35
36
37 #define LIBNAME "expat.library"
38 #define LIBPRI 0
39 #define VERSION 53
40 #define REVISION 1
41 #define VSTRING "expat.library 53.1 (7.8.2009)" /* dd.mm.yyyy */
42
43
44 static const char* __attribute__((used)) verstag = "\0$VER: " VSTRING;
45
46
47 struct Interface *INewlib = 0;
48
49
50 struct ExpatBase * libInit(struct ExpatBase *libBase, BPTR seglist, struct ExecIFace *ISys);
51 uint32 libObtain (struct LibraryManagerInterface *Self);
52 uint32 libRelease (struct LibraryManagerInterface *Self);
53 struct ExpatBase *libOpen (struct LibraryManagerInterface *Self, uint32 version);
54 BPTR libClose (struct LibraryManagerInterface *Self);
55 BPTR libExpunge (struct LibraryManagerInterface *Self);
56 struct Interface *openInterface(struct ExecIFace *IExec, CONST_STRPTR libName, uint32 libVer);
57 void closeInterface(struct ExecIFace *IExec, struct Interface *iface);
58
59
60 static APTR lib_manager_vectors[] = {
61 libObtain,
62 libRelease,
63 NULL,
64 NULL,
65 libOpen,
66 libClose,
67 libExpunge,
68 NULL,
69 (APTR)-1,
70 };
71
72
73 static struct TagItem lib_managerTags[] = {
74 { MIT_Name, (uint32)"__library" },
75 { MIT_VectorTable, (uint32)lib_manager_vectors },
76 { MIT_Version, 1 },
77 { TAG_END, 0 }
78 };
79
80
81 extern void *main_vectors[];
82
83 static struct TagItem lib_mainTags[] = {
84 { MIT_Name, (uint32)"main" },
85 { MIT_VectorTable, (uint32)main_vectors },
86 { MIT_Version, 1 },
87 { TAG_END, 0 }
88 };
89
90
91 static APTR libInterfaces[] = {
92 lib_managerTags,
93 lib_mainTags,
94 NULL
95 };
96
97
98 extern void *VecTable68K[];
99
100 static struct TagItem libCreateTags[] = {
101 { CLT_DataSize, sizeof(struct ExpatBase) },
102 { CLT_InitFunc, (uint32)libInit },
103 { CLT_Interfaces, (uint32)libInterfaces },
104 { CLT_Vector68K, (uint32)VecTable68K },
105 { TAG_END, 0 }
106 };
107
108
109 static struct Resident __attribute__((used)) lib_res = {
110 RTC_MATCHWORD, // rt_MatchWord
111 &lib_res, // rt_MatchTag
112 &lib_res+1, // rt_EndSkip
113 RTF_NATIVE | RTF_AUTOINIT, // rt_Flags
114 VERSION, // rt_Version
115 NT_LIBRARY, // rt_Type
116 LIBPRI, // rt_Pri
117 LIBNAME, // rt_Name
118 VSTRING, // rt_IdString
119 libCreateTags // rt_Init
120 };
121
122
123 int32 _start()
124 {
125 return RETURN_FAIL;
126 }
127
128
129 struct ExpatBase *libInit(struct ExpatBase *libBase, BPTR seglist, struct ExecIFace *iexec)
130 {
131 libBase->libNode.lib_Node.ln_Type = NT_LIBRARY;
132 libBase->libNode.lib_Node.ln_Pri = LIBPRI;
133 libBase->libNode.lib_Node.ln_Name = LIBNAME;
134 libBase->libNode.lib_Flags = LIBF_SUMUSED|LIBF_CHANGED;
135 libBase->libNode.lib_Version = VERSION;
136 libBase->libNode.lib_Revision = REVISION;
137 libBase->libNode.lib_IdString = VSTRING;
138
139 libBase->SegList = seglist;
140
141 libBase->IExec = iexec;
142 INewlib = openInterface(iexec, "newlib.library", 0);
143
144 if ( INewlib != 0 ) {
145 return libBase;
146 }
147
148 closeInterface(iexec, INewlib);
149 INewlib = 0;
150
151 iexec->DeleteLibrary(&libBase->libNode);
152
153 return NULL;
154 }
155
156
157 uint32 libObtain( struct LibraryManagerInterface *Self )
158 {
159 ++Self->Data.RefCount;
160 return Self->Data.RefCount;
161 }
162
163
164 uint32 libRelease( struct LibraryManagerInterface *Self )
165 {
166 --Self->Data.RefCount;
167 return Self->Data.RefCount;
168 }
169
170
171 struct ExpatBase *libOpen( struct LibraryManagerInterface *Self, uint32 version )
172 {
173 struct ExpatBase *libBase;
174
175 libBase = (struct ExpatBase *)Self->Data.LibBase;
176
177 ++libBase->libNode.lib_OpenCnt;
178 libBase->libNode.lib_Flags &= ~LIBF_DELEXP;
179
180 return libBase;
181 }
182
183
184 BPTR libClose( struct LibraryManagerInterface *Self )
185 {
186 struct ExpatBase *libBase;
187
188 libBase = (struct ExpatBase *)Self->Data.LibBase;
189
190 --libBase->libNode.lib_OpenCnt;
191 if ( libBase->libNode.lib_OpenCnt ) {
192 return 0;
193 }
194
195 if ( libBase->libNode.lib_Flags & LIBF_DELEXP ) {
196 return (BPTR)Self->LibExpunge();
197 }
198 else {
199 return ZERO;
200 }
201 }
202
203
204 BPTR libExpunge( struct LibraryManagerInterface *Self )
205 {
206 struct ExpatBase *libBase = (struct ExpatBase *)Self->Data.LibBase;
207 BPTR result = ZERO;
208
209 if (libBase->libNode.lib_OpenCnt == 0) {
210 libBase->IExec->Remove(&libBase->libNode.lib_Node);
211
212 result = libBase->SegList;
213
214 closeInterface(libBase->IExec, INewlib);
215 INewlib = 0;
216
217 libBase->IExec->DeleteLibrary(&libBase->libNode);
218 }
219 else {
220 libBase->libNode.lib_Flags |= LIBF_DELEXP;
221 }
222
223 return result;
224 }
225
226
227 struct Interface *openInterface(struct ExecIFace *IExec, CONST_STRPTR libName, uint32 libVer)
228 {
229 struct Library *base = IExec->OpenLibrary(libName, libVer);
230 struct Interface *iface = IExec->GetInterface(base, "main", 1, 0);
231 if (iface == 0) {
232 IExec->CloseLibrary(base);
233 }
234
235 return iface;
236 }
237
238
239 void closeInterface(struct ExecIFace *IExec, struct Interface *iface)
240 {
241 if (iface != 0)
242 {
243 struct Library *base = iface->Data.LibBase;
244 IExec->DropInterface(iface);
245 IExec->CloseLibrary(base);
246 }
247 }