Annotation of embedaddon/expat/amiga/expat_lib.c, revision 1.1
1.1 ! misho 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: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>