home *** CD-ROM | disk | FTP | other *** search
- /* $Revision Header * Header built automatically - do not edit! *************
- *
- * (C) Copyright 1990 by MXM
- *
- * Name .....: LibMain.c
- * Created ..: Saturday 06-Jan-90 23:30
- * Revision .: 8
- *
- * Date Author Comment
- * ========= ======== ====================
- * 26-Apr-90 Olsen Opened dos.library (always forgot it!)
- * 13-Apr-90 Olsen Added NULL-function
- * 01-Apr-90 Olsen Moved library calls
- * 27-Mar-90 Olsen Added alerts/moved flag checks
- * 26-Mar-90 Olsen Rearranged LibExpunge/LibClose
- * 16-Mar-90 Olsen Rework for Aztec 5.0 release
- * 07-Jan-90 Olsen - Empty log message -
- * 07-Jan-90 Olsen Moved OpenLibrary call
- * 07-Jan-90 Olsen - Empty log message -
- * 07-Jan-90 Olsen Created this file!
- *
- * $Revision Header *********************************************************
- *
- * This file contains the skeleton library functions employed by
- * rexxhost.library.
- *
- ***************************************************************************/
-
- /* Imported from RexxHostLib.c */
-
- extern LONG Revision;
-
- /* ASCII library ID. */
-
- char *LibName = "rexxhost.library";
- char *LibId = "rexxhost.library 34.12 (26 Apr 1990)\r\n";
-
- /* External data, defined in asm startup code. */
-
- extern struct Resident LibRomTag;
- extern LONG LibInit();
-
- /* Main rexx library base. */
-
- struct RxsLib *RexxSysBase;
-
- /* External reference to DOSBase pointer. */
-
- extern APTR DOSBase;
-
- /* Pointer to library segment list. */
-
- BPTR LibSegList = ZERO;
-
- /* Protos for this module. */
-
- struct RexxHostBase * LibMain(struct RexxHostBase *,BPTR);
-
- struct RexxHostBase * LibOpen(VOID);
- BPTR LibClose(VOID);
- BPTR LibExpunge(VOID);
- LONG LibNull(VOID);
-
- /* And now for the pragmas... */
-
- #pragma amicall(RexxHostBase, 0x06, LibOpen())
- #pragma amicall(RexxHostBase, 0x0c, LibClose())
- #pragma amicall(RexxHostBase, 0x12, LibExpunge())
- #pragma amicall(RexxHostBase, 0x18, LibNull())
-
- /* The library initialization. */
-
- #pragma regcall(LibMain(d0,a0))
-
- /* The structure expected by the library loader (auto-init). */
-
- struct InitTable
- {
- ULONG it_DataSize; /* Data size to allocate. */
- APTR *it_FuncTable; /* Pointer to function table. */
- APTR it_DataInit; /* Pointer to data initializers (remember InitStruct?). */
- APTR it_InitFunc; /* The real library init function. */
- };
-
- /* The list of library functions. */
-
- APTR LibFuncTab[] =
- {
- LibOpen, /* Standard library routines. */
- LibClose,
- LibExpunge,
- LibNull,
-
- CreateRexxHost, /* Now for the real stuff. */
- DeleteRexxHost,
- SendRexxCommand,
- FreeRexxCommand,
- ReplyRexxCommand,
- GetRexxCommand,
- GetRexxArg,
- GetRexxResult1,
- GetRexxResult2,
- GetToken,
- GetStringValue,
- BuildValueString,
- RexxStrCmp,
-
- (APTR)-1 /* End marker. */
- };
-
- /* The romtag needs this. */
-
- struct InitTable LibInitTab =
- {
- sizeof(struct RexxHostBase), /* Lib base. */
- LibFuncTab, /* Function table. */
- NULL, /* No data init table (we'll do autoinit). */
- LibInit /* Lib init routine. */
- };
-
- /* LibMain(RexxHostBase,SegList):
- *
- * Does the main library initialization, expects
- * all arguments in registers.
- */
-
- struct RexxHostBase *
- LibMain(struct RexxHostBase *RexxHostBase,BPTR SegList)
- {
- struct RexxHostBase *LibBase = NULL;
-
- /* We want to be initialized only once, the empty
- * seglist will (hopefully) guarantee that.
- */
-
- if(!LibSegList)
- {
- if(DOSBase = (APTR)OpenLibrary("dos.library",0))
- {
- /* Try to open rexxsyslib.library. */
-
- if(RexxSysBase = (struct RxsLib *)OpenLibrary(RXSNAME,0))
- {
- /* Remember segment list. */
-
- LibSegList = SegList;
-
- /* Seems that all initialization went fine. */
-
- LibBase = RexxHostBase;
-
- /* Fill in the library node head. */
-
- RexxHostBase -> LibNode . lib_Node . ln_Type = NT_LIBRARY;
- RexxHostBase -> LibNode . lib_Node . ln_Name = LibName;
-
- /* Set the remaining flags. */
-
- RexxHostBase -> LibNode . lib_Flags = LIBF_SUMUSED | LIBF_CHANGED;
- RexxHostBase -> LibNode . lib_Version = LibRomTag . rt_Version;
- RexxHostBase -> LibNode . lib_Revision = Revision;
- RexxHostBase -> LibNode . lib_IdString = (APTR)LibId;
-
- /* Fill in the pointer. */
-
- RexxHostBase -> RexxSysBase = RexxSysBase;
- }
- else
- {
- /* Help! Can't open the rexx library! */
-
- Alert(AT_Recovery | AG_OpenLib,"REXX");
- }
- }
- else
- {
- /* Arrgh! Can't open dos.library! */
-
- Alert(AT_Recovery | AG_OpenLib | AO_DOSLib,"REXX");
- }
- }
-
- /* Return the result (surprise!). */
-
- return(LibBase);
- }
-
- /* LibOpen():
- *
- * Library open routine.
- */
-
- struct RexxHostBase *
- LibOpen()
- {
- struct RexxHostBase *RexxHostBase;
-
- /* If rexxsyslib.library didn't open we refuse
- * to go any further.
- */
-
- if(!RexxSysBase)
- return(NULL);
-
- /* Increment open count and prevent delayed
- * expunges.
- */
-
- RexxHostBase -> LibNode . lib_OpenCnt++;
- RexxHostBase -> LibNode . lib_Flags &= ~LIBF_DELEXP;
-
- /* Return base pointer. */
-
- return(RexxHostBase);
- }
-
- /* LibClose():
- *
- * Closes the library.
- */
-
- BPTR
- LibClose()
- {
- struct RexxHostBase *RexxHostBase;
- BPTR SegList = ZERO;
-
- /* Is the library user count ok? */
-
- if(RexxHostBase -> LibNode . lib_OpenCnt > 0)
- {
- /* Decrement user count. */
-
- RexxHostBase -> LibNode . lib_OpenCnt--;
-
- /* Try the expunge. */
-
- SegList = LibExpunge();
- }
- else
- {
- /* One close request after the lib has already
- * shut down? We'll call Mr. Guru.
- */
-
- Alert(AT_Recovery | AG_CloseLib,"HOST");
- }
-
- /* Return the segment list, ramlib will know
- * what to do with it.
- */
-
- return(SegList);
- }
-
- /* LibExpunge(RexxHostBase):
- *
- * Expunge library, careful: this can be called by
- * ramlib without the rest of the library knowing
- * about it.
- */
-
- BPTR
- LibExpunge()
- {
- struct RexxHostBase *RexxHostBase;
- BPTR SegList = ZERO;
-
- /* Is the user count zero, the delayed expunge flag
- * set and do we have a valid segment list?
- */
-
- if(RexxHostBase -> LibNode . lib_OpenCnt == 0 && (RexxHostBase -> LibNode . lib_Flags & LIBF_DELEXP) && LibSegList)
- {
- /* Remember segment list. */
-
- SegList = LibSegList;
-
- /* Set real segment list to zero which will
- * hopefully keep us from getting expunged
- * twice.
- */
-
- LibSegList = ZERO;
-
- /* Remove library from lib list. */
-
- Remove((struct Node *)RexxHostBase);
-
- /* Close the libraries. */
-
- if(RexxSysBase)
- CloseLibrary(RexxSysBase);
-
- if(DOSBase)
- CloseLibrary(DOSBase);
-
- /* Free library/jumptable memory. */
-
- FreeMem((char *)RexxHostBase - RexxHostBase -> LibNode . lib_NegSize,RexxHostBase -> LibNode . lib_NegSize + RexxHostBase -> LibNode . lib_PosSize);
- }
- else
- {
- /* In any other case we'll set the delayed
- * expunge flag (so next expunge call will
- * hopefully wipe us from the lib list).
- */
-
- RexxHostBase -> LibNode . lib_Flags |= LIBF_DELEXP;
- }
-
- /* Return segment list pointer. */
-
- return(SegList);
- }
-
- /* LibNull():
- *
- * Dummy routine, always returns NULL.
- */
-
- LONG
- LibNull()
- {
- struct RexxHostBase *RexxHostBase;
-
- /* Do nothing useful, return NULL. */
-
- return(NULL);
- }
-