//*************************************************************************//
// Filename:    StartUp.c
// Autor:       Christian Taulien of Strange Intelligence
// Purpose:     Library startup-code and function table definition
// Creation:    18. März 1998
//*************************************************************************//
#include "global.h"
#include "FelixBase.h"
#include "processcomm.h"
#include "funcs.h"
#include "flxclasses.h"
#include "freshlocale.h"
//*/ // Für GoldED 5 aktivieren
#include "golded:developer/api/include/apilib.h"
/*/ // Für GoldED 4 aktivieren
#include "golded:developer/api/include/api.h"
//*/

#include <exec/exec.h>

#include <clib/exec_protos.h>
#include <clib/dos_protos.h>

extern "C" void CleanupModules();
extern "C" void InitModules();

extern ULONG SAVEDS L_OpenLibs(void);
extern void  SAVEDS L_CloseLibs(void);

struct FelixBase *SAVEDS InitLib(register __a6 struct ExecBase *sysbase,
                                    register __a0 APTR           *seglist,
                                    register __d0 struct FelixBase *exb);
struct FelixBase *SAVEDS OpenLib(register __a6 struct FelixBase *FelixBase);
APTR   SAVEDS   CloseLib(register __a6 struct FelixBase *FelixBase);
APTR   SAVEDS ExpungeLib(register __a6 struct FelixBase *exb);
ULONG  ExtFuncLib(void);

APTR glob_SegList = NULL;

LONG LibStart(void)
/*S*/
{
  return(-1);
}
/*E*/
void _abort__STANDARD()
/*S*/
{
}
/*E*/
void exit(void)
/*S*/
{
  CleanupModules();
}
/*E*/

extern APTR FuncTab [];
extern struct MyDataInit DataTab;

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

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

  APIMountClient,
  APICloseClient,
  APIBriefClient,
  APIFree,

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

extern struct FelixBase *FelixBase;

FLXWatchListC *glob_poWatches = NULL;

struct FelixBase * SAVEDS InitLib( register __a6 struct ExecBase *sysbase,
                                   register __a0 APTR           *seglist,
                                   register __d0 struct FelixBase *apib)
/*S*/
{
  InitModules();
  TRACE("");
  FelixBase = apib;
  glob_SegList = seglist;

  if (L_OpenLibs())
  {
    glob_sReturnBuffer = new char [1000];
    glob_poCatalog = new CatalogC("felix.catalog", 1);

    ((struct FelixBase *)FelixBase)->api_Magic = API_MAGIC;
    glob_poWatches = new FLXWatchListC;

    StarteProzess();

    return(FelixBase);
  }
  L_CloseLibs();

return NULL;
}
/*E*/
struct FelixBase * SAVEDS OpenLib(register __a6 struct FelixBase *FelixBase)
/*S*/
{
  TRACE("");
  FelixBase->api_LibNode.lib_OpenCnt++;
  FelixBase->api_LibNode.lib_Flags &= ~LIBF_DELEXP;
return FelixBase;
}
/*E*/
APTR SAVEDS CloseLib(register __a6 struct FelixBase *FelixBase)
/*S*/
{
  TRACE("");
  FelixBase->api_LibNode.lib_OpenCnt--;
  if (!FelixBase->api_LibNode.lib_OpenCnt)
  {
     if (FelixBase->api_LibNode.lib_Flags & LIBF_DELEXP)
     {
       return ExpungeLib(FelixBase);
     } // if
  } // if
  return NULL;
}
/*E*/
APTR SAVEDS ExpungeLib(register __a6 struct FelixBase *api)
/*S*/
{
 TRACE("");
 struct FelixBase *FelixBase = api;
 APTR seglist;

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

    seglist = glob_SegList;

    if (glob_sReturnBuffer)
    {
      delete glob_sReturnBuffer;
      glob_sReturnBuffer = NULL;
    } // if

    if (glob_poWatches)
    {
      delete glob_poWatches;
      glob_poWatches = NULL;
    } // if

    BeendeProzess();

    Remove((struct Node *)FelixBase);

    if (glob_poCatalog)
    {
      delete glob_poCatalog;
      glob_poCatalog = NULL;
    } // if

    L_CloseLibs();

    negsize  = FelixBase->api_LibNode.lib_NegSize;
    possize  = FelixBase->api_LibNode.lib_PosSize;
    fullsize = negsize + possize;
    negptr  -= negsize;

    FreeMem(negptr, fullsize);
    CleanupModules();
    return seglist;
  }
  
 FelixBase->api_LibNode.lib_Flags |= LIBF_DELEXP;

return NULL;
}
/*E*/
ULONG ExtFuncLib(void)
/*S*/
{
return NULL;
}
/*E*/

struct FelixBase *FelixBase = NULL;

