/*
**      $VER: LibInit.c 1.0
**
**      Library initializers and functions to be called by StartUp.c
**
**      Based on CExecLib sources from Andreas R. Kleinert
*/

#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 "ixdtbase.h"

ULONG __saveds __stdargs L_OpenLibs(void);
void  __saveds __stdargs L_CloseLibs(void);

extern struct IXDTBase *IXDTBase;

struct ExecBase      *SysBase       = NULL;
struct DosLibrary    *DOSBase       = NULL;

#define VERSION  12
#define REVISION 26

#define IXDTNAME      "csource.ixdt"
#define IXDTID        "C source iX Datatype 12.26 (26.12.96)"
#define IXDTCOPYRIGHT "(C)opyright 1996 by Ivan Sturlic"

char __aligned ixdtName [] = IXDTNAME;
char __aligned ixdtID   [] = IXDTID;
char __aligned Copyright [] = IXDTCOPYRIGHT;

extern ULONG InitTab[];

extern APTR EndResident; /* below */

struct Resident __aligned ROMTag =     /* do not change */
{
 RTC_MATCHWORD,
 &ROMTag,
 &EndResident,
 RTF_AUTOINIT,
 VERSION,
 NT_LIBRARY,
 REVISION,
 &ixdtName[0],
 &ixdtID[0],
 &InitTab[0]
};

APTR EndResident;

struct MyDataInit                      /* do not change */
{
 UWORD ainit1; UWORD binit1; UWORD ln_type;
 UBYTE ainit2; UBYTE binit2; ULONG ln_name2;
 UWORD ainit3; UWORD binit3; UWORD lib_flags;
 UWORD ainit4; UWORD binit4; UWORD lib_version;
 UWORD ainit5; UWORD binit5; UWORD lib_revision;
 UBYTE ainit6; UBYTE binit6; ULONG lib_idstring2;
 ULONG end;
} DataTab =
{
 INITBYTE(OFFSET(Node,         ln_Type),      NT_LIBRARY),
 0x80, (UBYTE) OFFSET(Node,    ln_Name),      (ULONG) &ixdtName[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) &ixdtID[0],
 (ULONG) 0
};

ULONG __saveds __stdargs L_OpenLibs(void)
{ 
 SysBase = (*((struct ExecBase **) 4));
 if (!(DOSBase = (struct DosLibrary *)OpenLibrary("dos.library",0L)))
  return(FALSE);
 
 IXDTBase->dtb_DOSBase = DOSBase;
 
  return(TRUE);
}

void __saveds __stdargs L_CloseLibs(void)
{
 if (DOSBase) CloseLibrary((APTR)DOSBase);
}
