Annotation of embedaddon/expat/amiga/expat_lib.c, revision 1.1.1.2
1.1 misho 1: /*
1.1.1.2 ! misho 2: ** Copyright (c) 2001-2009 Expat maintainers.
1.1 misho 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:
1.1.1.2 ! misho 11: **
1.1 misho 12: ** The above copyright notice and this permission notice shall be included
13: ** in all copies or substantial portions of the Software.
1.1.1.2 ! misho 14: **
1.1 misho 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:
1.1.1.2 ! misho 24: #ifdef __USE_INLINE__
! 25: #undef __USE_INLINE__
! 26: #endif
! 27:
! 28: #define __NOLIBBASE__
! 29: #define __NOGLOBALIFACE__
! 30:
1.1 misho 31: #include <dos/dos.h>
32: #include <proto/exec.h>
33:
1.1.1.2 ! misho 34: #include "expat_base.h"
! 35:
! 36:
1.1 misho 37: #define LIBNAME "expat.library"
38: #define LIBPRI 0
1.1.1.2 ! misho 39: #define VERSION 53
! 40: #define REVISION 1
! 41: #define VSTRING "expat.library 53.1 (7.8.2009)" /* dd.mm.yyyy */
1.1 misho 42:
43:
44: static const char* __attribute__((used)) verstag = "\0$VER: " VSTRING;
45:
46:
1.1.1.2 ! misho 47: struct Interface *INewlib = 0;
1.1 misho 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);
1.1.1.2 ! misho 56: struct Interface *openInterface(struct ExecIFace *IExec, CONST_STRPTR libName, uint32 libVer);
! 57: void closeInterface(struct ExecIFace *IExec, struct Interface *iface);
1.1 misho 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:
1.1.1.2 ! misho 98: extern void *VecTable68K[];
! 99:
1.1 misho 100: static struct TagItem libCreateTags[] = {
101: { CLT_DataSize, sizeof(struct ExpatBase) },
102: { CLT_InitFunc, (uint32)libInit },
103: { CLT_Interfaces, (uint32)libInterfaces },
1.1.1.2 ! misho 104: { CLT_Vector68K, (uint32)VecTable68K },
1.1 misho 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:
1.1.1.2 ! misho 123: int32 _start()
1.1 misho 124: {
1.1.1.2 ! misho 125: return RETURN_FAIL;
1.1 misho 126: }
127:
128:
1.1.1.2 ! misho 129: struct ExpatBase *libInit(struct ExpatBase *libBase, BPTR seglist, struct ExecIFace *iexec)
1.1 misho 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:
1.1.1.2 ! misho 139: libBase->SegList = seglist;
1.1 misho 140:
1.1.1.2 ! misho 141: libBase->IExec = iexec;
! 142: INewlib = openInterface(iexec, "newlib.library", 0);
1.1 misho 143:
1.1.1.2 ! misho 144: if ( INewlib != 0 ) {
! 145: return libBase;
! 146: }
1.1 misho 147:
1.1.1.2 ! misho 148: closeInterface(iexec, INewlib);
! 149: INewlib = 0;
1.1 misho 150:
1.1.1.2 ! misho 151: iexec->DeleteLibrary(&libBase->libNode);
1.1 misho 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 {
1.1.1.2 ! misho 199: return ZERO;
1.1 misho 200: }
201: }
202:
203:
204: BPTR libExpunge( struct LibraryManagerInterface *Self )
205: {
1.1.1.2 ! misho 206: struct ExpatBase *libBase = (struct ExpatBase *)Self->Data.LibBase;
! 207: BPTR result = ZERO;
1.1 misho 208:
209: if (libBase->libNode.lib_OpenCnt == 0) {
1.1.1.2 ! misho 210: libBase->IExec->Remove(&libBase->libNode.lib_Node);
1.1 misho 211:
212: result = libBase->SegList;
213:
1.1.1.2 ! misho 214: closeInterface(libBase->IExec, INewlib);
! 215: INewlib = 0;
1.1 misho 216:
1.1.1.2 ! misho 217: libBase->IExec->DeleteLibrary(&libBase->libNode);
1.1 misho 218: }
219: else {
220: libBase->libNode.lib_Flags |= LIBF_DELEXP;
221: }
222:
223: return result;
224: }
1.1.1.2 ! misho 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: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>