xmlreaderimpl/support/expat-2.0.1/amiga/expat_lib.c
changeset 300 b6d834208d33
parent 299 f06c5eba524d
child 301 1bfe4ecc6c10
equal deleted inserted replaced
299:f06c5eba524d 300:b6d834208d33
     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 }