2
** Copyright (c) 2001-2007 Expat maintainers.
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:
12
** The above copyright notice and this permission notice shall be included
13
** in all copies or substantial portions of the Software.
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.
25
#include <proto/exec.h>
27
#define LIBNAME "expat.library"
31
#define VSTRING "expat.library 4.2 (2.6.2007)" /* dd.mm.yyyy */
34
static const char* __attribute__((used)) verstag = "\0$VER: " VSTRING;
38
struct Library libNode;
44
struct ExpatBase * libInit(struct ExpatBase *libBase, BPTR seglist, struct ExecIFace *ISys);
45
uint32 libObtain (struct LibraryManagerInterface *Self);
46
uint32 libRelease (struct LibraryManagerInterface *Self);
47
struct ExpatBase *libOpen (struct LibraryManagerInterface *Self, uint32 version);
48
BPTR libClose (struct LibraryManagerInterface *Self);
49
BPTR libExpunge (struct LibraryManagerInterface *Self);
52
static APTR lib_manager_vectors[] = {
65
static struct TagItem lib_managerTags[] = {
66
{ MIT_Name, (uint32)"__library" },
67
{ MIT_VectorTable, (uint32)lib_manager_vectors },
73
extern void *main_vectors[];
75
static struct TagItem lib_mainTags[] = {
76
{ MIT_Name, (uint32)"main" },
77
{ MIT_VectorTable, (uint32)main_vectors },
83
static APTR libInterfaces[] = {
90
static struct TagItem libCreateTags[] = {
91
{ CLT_DataSize, sizeof(struct ExpatBase) },
92
{ CLT_InitFunc, (uint32)libInit },
93
{ CLT_Interfaces, (uint32)libInterfaces },
98
static struct Resident __attribute__((used)) lib_res = {
99
RTC_MATCHWORD, // rt_MatchWord
100
&lib_res, // rt_MatchTag
101
&lib_res+1, // rt_EndSkip
102
RTF_NATIVE | RTF_AUTOINIT, // rt_Flags
103
VERSION, // rt_Version
104
NT_LIBRARY, // rt_Type
107
VSTRING, // rt_IdString
108
libCreateTags // rt_Init
112
struct Library *DOSLib = 0;
113
struct Library *UtilityBase = 0;
115
struct ExecIFace *IExec = 0;
116
struct DOSIFace *IDOS = 0;
117
struct UtilityIFace *IUtility = 0;
125
struct ExpatBase *libInit(struct ExpatBase *libBase, BPTR seglist, struct ExecIFace *ISys)
127
libBase->libNode.lib_Node.ln_Type = NT_LIBRARY;
128
libBase->libNode.lib_Node.ln_Pri = LIBPRI;
129
libBase->libNode.lib_Node.ln_Name = LIBNAME;
130
libBase->libNode.lib_Flags = LIBF_SUMUSED|LIBF_CHANGED;
131
libBase->libNode.lib_Version = VERSION;
132
libBase->libNode.lib_Revision = REVISION;
133
libBase->libNode.lib_IdString = VSTRING;
134
libBase->SegList = seglist;
138
DOSLib = OpenLibrary("dos.library", 51);
140
IDOS = (struct DOSIFace *)GetInterface(DOSLib, "main", 1, NULL);
142
UtilityBase = OpenLibrary("utility.library", 51);
143
if ( UtilityBase != 0 ) {
144
IUtility = (struct UtilityIFace*)GetInterface(UtilityBase, "main", 1, NULL);
145
if ( IUtility != 0 ) {
149
CloseLibrary(UtilityBase);
152
DropInterface((struct Interface *)IDOS);
155
CloseLibrary(DOSLib);
162
uint32 libObtain( struct LibraryManagerInterface *Self )
164
++Self->Data.RefCount;
165
return Self->Data.RefCount;
169
uint32 libRelease( struct LibraryManagerInterface *Self )
171
--Self->Data.RefCount;
172
return Self->Data.RefCount;
176
struct ExpatBase *libOpen( struct LibraryManagerInterface *Self, uint32 version )
178
struct ExpatBase *libBase;
180
libBase = (struct ExpatBase *)Self->Data.LibBase;
182
++libBase->libNode.lib_OpenCnt;
183
libBase->libNode.lib_Flags &= ~LIBF_DELEXP;
189
BPTR libClose( struct LibraryManagerInterface *Self )
191
struct ExpatBase *libBase;
193
libBase = (struct ExpatBase *)Self->Data.LibBase;
195
--libBase->libNode.lib_OpenCnt;
196
if ( libBase->libNode.lib_OpenCnt ) {
200
if ( libBase->libNode.lib_Flags & LIBF_DELEXP ) {
201
return (BPTR)Self->LibExpunge();
209
BPTR libExpunge( struct LibraryManagerInterface *Self )
211
struct ExpatBase *libBase;
214
libBase = (struct ExpatBase *)Self->Data.LibBase;
216
if (libBase->libNode.lib_OpenCnt == 0) {
217
Remove(&libBase->libNode.lib_Node);
219
result = libBase->SegList;
221
DropInterface((struct Interface *)IUtility);
222
CloseLibrary(UtilityBase);
223
DropInterface((struct Interface *)IDOS);
224
CloseLibrary(DOSLib);
226
DeleteLibrary(&libBase->libNode);
229
libBase->libNode.lib_Flags |= LIBF_DELEXP;