//*************************************************************************//
// Filename:    LibInit.c
// Autor:       Christian Taulien of Strange Intelligence
// Purpose:     Library initializers and functions to be called by StartUp.c
// Creation:    18. März 1998
//*************************************************************************//

#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 <pragma/exec_lib.h>

#include <clib/gadtools_protos.h>

#include "global.h"
#include "FelixBase.h"

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

extern struct FelixBase *FelixBase;

struct ExecBase      *SysBase       = NULL;
struct IntuitionBase *IntuitionBase = NULL;
struct GfxBase       *GfxBase       = NULL;
struct Library       *DOSBase       = NULL;
struct Library       *RexxSysBase   = NULL;
struct Library       *GadToolsBase  = NULL;
struct Library       *UtilityBase   = NULL;
struct Library       *DiskFontBase  = NULL;
struct Library       *LocaleBase    = NULL;

char ExLibName [] = "Felix.api";
char ExLibID   [] = "Felix " VERSION_S " (" __DATE2__ ")\r\n";
char Copyright [] = "Written by Christian <City> Taulien of Strange Intelligence.";

extern ULONG InitTab[];
extern APTR EndResident; /* below */

struct Resident ROMTag =     /* do not change */
{
  RTC_MATCHWORD,
  &ROMTag,
  &EndResident,
  RTF_AUTOINIT,
  VERSION,
  NT_LIBRARY,
  0,
  &ExLibName[0],
  &ExLibID[0],
  &InitTab[0]
};

APTR EndResident;

struct MyDataInit                      /* do not change */
{
  UWORD ln_Type_Init;      UWORD ln_Type_Offset;      UWORD ln_Type_Content;
  UBYTE ln_Name_Init;      UBYTE ln_Name_Offset;      ULONG ln_Name_Content;
  UWORD lib_Flags_Init;    UWORD lib_Flags_Offset;    UWORD lib_Flags_Content;
  UWORD lib_Version_Init;  UWORD lib_Version_Offset;  UWORD lib_Version_Content;
  UWORD lib_Revision_Init; UWORD lib_Revision_Offset; UWORD lib_Revision_Content;
  UBYTE lib_IdString_Init; UBYTE lib_IdString_Offset; ULONG lib_IdString_Content;
  ULONG ENDMARK;
} DataTab =
{
  INITBYTE(OFFSET(Node,         ln_Type),      NT_LIBRARY),
  0x80, (UBYTE) OFFSET(Node,    ln_Name),      (ULONG) &ExLibName[0],
  INITBYTE(OFFSET(Library,      lib_Flags),    LIBF_SUMUSED|LIBF_CHANGED),
  INITWORD(OFFSET(Library,      lib_Version),  VERSION),
  INITWORD(OFFSET(Library,      lib_Revision), REVISION),
  0x80, (UBYTE) OFFSET(Library, lib_IdString), (ULONG) &ExLibID[0],
  (ULONG) 0
};

ULONG SAVEDS L_OpenLibs(void)
/*S*/
{
  TRACE("Entry");
  SysBase = (*((struct ExecBase **) 4));

  if (DOSBase = OpenLibrary("dos.library", 37))
  {
    if (IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 37))
    {
      if (GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 37))
      {
        if (RexxSysBase = OpenLibrary("rexxsyslib.library", 36))
        {
          if (GadToolsBase = OpenLibrary("gadtools.library", 39))
          {
            if (UtilityBase = OpenLibrary("utility.library", 37))
            {
              if (DiskFontBase = OpenLibrary("diskfont.library", 37))
              {
                if (LocaleBase = OpenLibrary("locale.library", 39))
                {
                  return TRUE;
                } // if
              } // if
            } // if
          } // if
        } // if
      } // if
    } // if
  } // if

return FALSE;
}
/*E*/

void SAVEDS L_CloseLibs(void)
/*S*/
{
  TRACE("Entry");
  if(GfxBase)       CloseLibrary((struct Library *) GfxBase);
  if(IntuitionBase) CloseLibrary((struct Library *) IntuitionBase);
  if(DOSBase)       CloseLibrary((struct Library *) DOSBase);
  if(RexxSysBase)   CloseLibrary((struct Library *) RexxSysBase);
  if(GadToolsBase)  CloseLibrary((struct Library *) GadToolsBase);
  if(UtilityBase)   CloseLibrary((struct Library *) UtilityBase);
  if(DiskFontBase)  CloseLibrary((struct Library *) DiskFontBase);
  if(LocaleBase)    CloseLibrary((struct Library *) LocaleBase);
}
/*E*/

