Annotation of embedaddon/expat/amiga/expat_lib.c, revision 1.1.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>