Home | History | Annotate | Download | only in amiga
      1 /*
      2 ** Copyright (c) 2001-2007 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 #include <dos/dos.h>
     25 #include <proto/exec.h>
     26 
     27 #define LIBNAME		"expat.library"
     28 #define LIBPRI		0
     29 #define VERSION		4
     30 #define REVISION	2
     31 #define VSTRING		"expat.library 4.2 (2.6.2007)"  /* dd.mm.yyyy */
     32 
     33 
     34 static const char* __attribute__((used)) verstag = "\0$VER: " VSTRING;
     35 
     36 
     37 struct ExpatBase {
     38 	struct Library libNode;
     39 	uint16 pad;
     40 	BPTR SegList;
     41 };
     42 
     43 
     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);
     50 
     51 
     52 static APTR lib_manager_vectors[] = {
     53 	libObtain,
     54 	libRelease,
     55 	NULL,
     56 	NULL,
     57 	libOpen,
     58 	libClose,
     59 	libExpunge,
     60 	NULL,
     61 	(APTR)-1,
     62 };
     63 
     64 
     65 static struct TagItem lib_managerTags[] = {
     66 	{ MIT_Name, (uint32)"__library" },
     67 	{ MIT_VectorTable, (uint32)lib_manager_vectors },
     68 	{ MIT_Version, 1 },
     69 	{ TAG_END, 0 }
     70 };
     71 
     72 
     73 extern void *main_vectors[];
     74 
     75 static struct TagItem lib_mainTags[] = {
     76 	{ MIT_Name, (uint32)"main" },
     77 	{ MIT_VectorTable, (uint32)main_vectors },
     78 	{ MIT_Version, 1 },
     79 	{ TAG_END, 0 }
     80 };
     81 
     82 
     83 static APTR libInterfaces[] = {
     84 	lib_managerTags,
     85 	lib_mainTags,
     86 	NULL
     87 };
     88 
     89 
     90 static struct TagItem libCreateTags[] = {
     91 	{ CLT_DataSize, sizeof(struct ExpatBase) },
     92 	{ CLT_InitFunc, (uint32)libInit },
     93 	{ CLT_Interfaces, (uint32)libInterfaces },
     94 	{ TAG_END, 0 }
     95 };
     96 
     97 
     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
    105 	LIBPRI,			// rt_Pri
    106 	LIBNAME,		// rt_Name
    107 	VSTRING,		// rt_IdString
    108 	libCreateTags	// rt_Init
    109 };
    110 
    111 
    112 struct Library *DOSLib = 0;
    113 struct Library *UtilityBase = 0;
    114 
    115 struct ExecIFace *IExec = 0;
    116 struct DOSIFace *IDOS = 0;
    117 struct UtilityIFace *IUtility = 0;
    118 
    119 
    120 void _start()
    121 {
    122 }
    123 
    124 
    125 struct ExpatBase *libInit(struct ExpatBase *libBase, BPTR seglist, struct ExecIFace *ISys)
    126 {
    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;
    135 
    136 	IExec = ISys;
    137 
    138 	DOSLib = OpenLibrary("dos.library", 51);
    139 	if ( DOSLib != 0 )  {
    140 		IDOS = (struct DOSIFace *)GetInterface(DOSLib, "main", 1, NULL);
    141 		if ( IDOS != 0 )  {
    142 			UtilityBase = OpenLibrary("utility.library", 51);
    143 			if ( UtilityBase != 0 )  {
    144 				IUtility = (struct UtilityIFace*)GetInterface(UtilityBase, "main", 1, NULL);
    145 				if ( IUtility != 0 )  {
    146 					return libBase;
    147 				}
    148 
    149 				CloseLibrary(UtilityBase);
    150 			}
    151 
    152 			DropInterface((struct Interface *)IDOS);
    153 		}
    154 
    155 		CloseLibrary(DOSLib);
    156 	}
    157 
    158 	return NULL;
    159 }
    160 
    161 
    162 uint32 libObtain( struct LibraryManagerInterface *Self )
    163 {
    164 	++Self->Data.RefCount;
    165 	return Self->Data.RefCount;
    166 }
    167 
    168 
    169 uint32 libRelease( struct LibraryManagerInterface *Self )
    170 {
    171 	--Self->Data.RefCount;
    172 	return Self->Data.RefCount;
    173 }
    174 
    175 
    176 struct ExpatBase *libOpen( struct LibraryManagerInterface *Self, uint32 version )
    177 {
    178 	struct ExpatBase *libBase;
    179 
    180 	libBase = (struct ExpatBase *)Self->Data.LibBase;
    181 
    182 	++libBase->libNode.lib_OpenCnt;
    183 	libBase->libNode.lib_Flags &= ~LIBF_DELEXP;
    184 
    185 	return libBase;
    186 }
    187 
    188 
    189 BPTR libClose( struct LibraryManagerInterface *Self )
    190 {
    191 	struct ExpatBase *libBase;
    192 
    193 	libBase = (struct ExpatBase *)Self->Data.LibBase;
    194 
    195 	--libBase->libNode.lib_OpenCnt;
    196 	if ( libBase->libNode.lib_OpenCnt ) {
    197 		return 0;
    198 	}
    199 
    200 	if ( libBase->libNode.lib_Flags & LIBF_DELEXP ) {
    201 		return (BPTR)Self->LibExpunge();
    202 	}
    203 	else {
    204 		return 0;
    205 	}
    206 }
    207 
    208 
    209 BPTR libExpunge( struct LibraryManagerInterface *Self )
    210 {
    211 	struct ExpatBase *libBase;
    212 	BPTR result = 0;
    213 
    214 	libBase = (struct ExpatBase *)Self->Data.LibBase;
    215 
    216 	if (libBase->libNode.lib_OpenCnt == 0) {
    217 		Remove(&libBase->libNode.lib_Node);
    218 
    219 		result = libBase->SegList;
    220 
    221 		DropInterface((struct Interface *)IUtility);
    222 		CloseLibrary(UtilityBase);
    223 		DropInterface((struct Interface *)IDOS);
    224 		CloseLibrary(DOSLib);
    225 
    226 		DeleteLibrary(&libBase->libNode);
    227 	}
    228 	else {
    229 		libBase->libNode.lib_Flags |= LIBF_DELEXP;
    230 	}
    231 
    232 	return result;
    233 }
    234