
/*
$Id: mt_startup.c,v 1.6 1999/09/18 11:53:28 carlos Exp $.
*/

#include "mt_includes.h"
#include <clib/muitoolkit_protos.h>


/*************************************************************
*************************************************************/

extern ULONG SAVEDS STDARGS L_OpenLibs(struct MuiToolkitBase *MuiToolkitBase);
extern void  SAVEDS STDARGS L_CloseLibs(void);

struct MuiToolkitBase *SAVEDS ASM InitLib( REG(a6) struct ExecBase *sysbase, REG(a0) struct SegList  *seglist, REG(d0) struct MuiToolkitBase *exb);
struct MuiToolkitBase *SAVEDS ASM OpenLib( REG(a6) struct MuiToolkitBase *MuiToolkitBase);
struct SegList  *SAVEDS ASM CloseLib( REG(a6) struct MuiToolkitBase *MuiToolkitBase);
struct SegList  *SAVEDS ASM ExpungeLib( REG(a6) struct MuiToolkitBase *exb);
ULONG ASM ExtFuncLib(void);


/*************************************************************
*************************************************************/

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

/*************************************************************
*************************************************************/

extern APTR FuncTab [];
extern DataTab;

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

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

 // v1

 mt_Get,
 mt_ParseHotkey,
 mt_Label,
 mt_PopButton,
 mt_Checkmark,
 mt_Cycle,
 mt_CycleWeight,
 mt_Slider,
 mt_SliderFmt,
 mt_String,
 mt_StringSecret,
 mt_StringAccept,
 mt_StringReject,
 mt_Button,
 mt_ButtonWeight,
 mt_ButtonToggle,
 mt_WinOpen,
 mt_WinAttach,
 mt_WinDetach,
 mt_Text,
 mt_GetStringA,
 mt_GetIntegerA,
 mt_Radio,
 mt_Check,

 // done

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


extern struct MuiToolkitBase *MuiToolkitBase;

/*************************************************************
*************************************************************/

struct MuiToolkitBase * SAVEDS ASM InitLib( REG(a6) struct ExecBase *sysbase,
                                      REG(a0) APTR   seglist,
                                      REG(d0) struct MuiToolkitBase *exb)
{
 MuiToolkitBase = exb;

 MuiToolkitBase->mt_SysBase = sysbase;
 MuiToolkitBase->mt_SegList = seglist;

 if( L_OpenLibs(MuiToolkitBase) )
    return( MuiToolkitBase );

 L_CloseLibs();

  {
   ULONG negsize, possize, fullsize;
   UBYTE *negptr = (UBYTE *) MuiToolkitBase;

   negsize  = MuiToolkitBase->mt_LibNode.lib_NegSize;
   possize  = MuiToolkitBase->mt_LibNode.lib_PosSize;
   fullsize = negsize + possize;
   negptr  -= negsize;

   FreeMem(negptr, fullsize);

  }

 return(NULL);
}

/*************************************************************
*************************************************************/

struct MuiToolkitBase * __saveds ASM OpenLib( REG(a6) struct MuiToolkitBase *MuiToolkitBase)
{
 MuiToolkitBase->mt_LibNode.lib_OpenCnt++;

 MuiToolkitBase->mt_LibNode.lib_Flags &= ~LIBF_DELEXP;

 return(MuiToolkitBase);
}

/*************************************************************
*************************************************************/

struct SegList *  SAVEDS ASM CloseLib( REG(a6) struct MuiToolkitBase *MuiToolkitBase)
{
 MuiToolkitBase->mt_LibNode.lib_OpenCnt--;

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

 return(NULL);
}

/*************************************************************
*************************************************************/

struct SegList * SAVEDS ASM ExpungeLib( REG(a6) struct MuiToolkitBase *exb)
{
 struct MuiToolkitBase *MuiToolkitBase = exb;
 struct SegList *  seglist;

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

   seglist = MuiToolkitBase->mt_SegList;

   Remove((struct Node *)MuiToolkitBase);

   L_CloseLibs();

   negsize  = MuiToolkitBase->mt_LibNode.lib_NegSize;
   possize  = MuiToolkitBase->mt_LibNode.lib_PosSize;
   fullsize = negsize + possize;
   negptr  -= negsize;

   FreeMem(negptr, fullsize);

   return(seglist);
  }

 MuiToolkitBase->mt_LibNode.lib_Flags |= LIBF_DELEXP;

 return(NULL);
}

/*************************************************************
*************************************************************/

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

struct MuiToolkitBase *MuiToolkitBase = NULL;

/*************************************************************
*************************************************************/

#ifdef __SASC

#ifdef ARK_OLD_STDIO_FIX

ULONG XCEXIT       = NULL; /* These symbols may be referenced by    */
ULONG _XCEXIT      = NULL; /* some functions of sc.lib, but should  */
ULONG ONBREAK      = NULL; /* never be used inside a shared library */
ULONG _ONBREAK     = NULL;
ULONG base         = NULL; /* Note, that XCEXIT/ONBREAK actually    */
ULONG _base        = NULL; /* should have been defined as functions */
ULONG ProgramName  = NULL; /* and not as ULONGs...                  */
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) { }  /* a shared library cannot be    */
void __regargs _CXBRK(void)     { }  /* CTRL-C aborted when doing I/O */

#endif /* __SASC */
