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>