/*
**      $VER: StartUp.c 37.11 (24.6.97)
**
**      Library startup-code and function table definition
**
**      (C) Copyright 1996-97 Andreas R. Kleinert
**      All Rights Reserved.
*/

#define __USE_SYSBASE

#include <exec/types.h>
#include <exec/memory.h>
#include <exec/libraries.h>
#include <exec/execbase.h>
#include <exec/resident.h>
#include <exec/initializers.h>
#include <proto/exec.h>

#include "/include/libraries/imagebase.h"
#include "funcproto.h"

extern ULONG __saveds __stdargs StartLib(void);
extern void  __saveds __stdargs EndLib(void);

struct ImageBase * __saveds __asm InitLib( register __a6 struct ExecBase *sysbase,
                    register __a0 APTR           *seglist,
                    register __d0 struct ImageBase *ib);
struct ImageBase * __saveds __asm OpenLib( register __a6 struct ImageBase *ImageBase);
APTR __saveds __asm CloseLib( register __a6 struct ImageBase *ImageBase);
APTR __saveds __asm ExpungeLib( register __a6 struct ImageBase *ib);
ULONG __asm ExtFuncLib(void);

LONG __asm LibStart(void)
{
 return(-1);
}

extern APTR FuncTab [];
extern struct MyDataInit DataTab;

struct InitTable
{
 ULONG              LibBaseSize;
 APTR              *FunctionTable;
 struct MyDataInit *DataTable;
 APTR               InitLibTable;
} InitTab =
{
 sizeof(struct ImageBase),
 &FuncTab[0],
 &DataTab,
 InitLib
};

APTR FuncTab [] =                      
{
 OpenLib,
 CloseLib,
 ExpungeLib,
 ExtFuncLib,

 DrawBitMap,
 ChunkyToBitMapA,
 FreeChunky,
 DrawTextA,
 Draw3DBoxA,
 ScaleBitMapA,
 ChunkyToHAMA,

 (APTR) ((LONG)-1)
};


extern struct ImageBase *ImageBase;

struct ImageBase * __saveds __asm InitLib( register __a6 struct ExecBase      *sysbase,
                    register __a0 APTR           *seglist,
                    register __d0 struct ImageBase *ib)
{
 ImageBase = ib;

 ImageBase->ib_SysBase = sysbase;
 ImageBase->ib_SegList = seglist;

 if(StartLib()) return(ImageBase);

 EndLib();

 FreeMem(ib, sizeof(struct ImageBase));

 return(NULL);
}

struct ImageBase * __saveds __asm OpenLib( register __a6 struct ImageBase *ImageBase)
{
 ImageBase->ib_LibNode.lib_OpenCnt++;

 ImageBase->ib_LibNode.lib_Flags &= ~LIBF_DELEXP;

 return(ImageBase);
}

APTR __saveds __asm CloseLib( register __a6 struct ImageBase *ImageBase)
{
 ImageBase->ib_LibNode.lib_OpenCnt--;

 if(!ImageBase->ib_LibNode.lib_OpenCnt)
  {
   if(ImageBase->ib_LibNode.lib_Flags & LIBF_DELEXP)
    {
     return( ExpungeLib(ImageBase) );
    }
  }

 return(NULL);
}

APTR __saveds __asm ExpungeLib( register __a6 struct ImageBase *ib)
{
 struct ImageBase *ImageBase = ib;
 APTR seglist;

 if(!ImageBase->ib_LibNode.lib_OpenCnt)
  {
   ULONG negsize, possize, fullsize;
   UBYTE *negptr = (UBYTE *) ImageBase;

   seglist = ImageBase->ib_SegList;

   Remove((struct Node *)ImageBase);

   EndLib();

   negsize  = ImageBase->ib_LibNode.lib_NegSize;
   possize  = ImageBase->ib_LibNode.lib_PosSize;
   fullsize = negsize + possize;
   negptr  -= negsize;

   FreeMem(negptr, fullsize);

   return(seglist);
  }
  
 ImageBase->ib_LibNode.lib_Flags |= LIBF_DELEXP;

 return(NULL);
}

ULONG __asm ExtFuncLib(void)
{
 return(NULL);
}

struct ImageBase *ImageBase = NULL;

#ifdef __SASC

#ifdef ARK_OLD_STDIO_FIX

ULONG XCEXIT       = NULL;
ULONG _XCEXIT      = NULL;
ULONG ONBREAK      = NULL;
ULONG _ONBREAK     = NULL;
ULONG base         = NULL;
ULONG _base        = NULL;
ULONG ProgramName  = NULL;
ULONG _ProgramName = NULL;
ULONG StackPtr     = NULL;
ULONG _StackPtr    = NULL;
ULONG oserr        = NULL;
ULONG _oserr       = NULL;
ULONG OSERR        = NULL;
ULONG _OSERR       = NULL;

#endif /* ARK_OLD_STDIO_FIX */

void __regargs __chkabort(void) { }
void __regargs _CXBRK(void)     { }

#endif /* __SASC */
