
 /* SV_RecogSubs.c
    - Functions for External Module Recognition and Binding -
    (c) 1993-95 by Andreas R. Kleinert
    Last changes : 16.12.1995
 */


#include "svobject.h"

#include <exec/execbase.h>
#include <exec/resident.h>
#include <exec/initializers.h>

ULONG __saveds __stdargs SVLI_OpenLibs(void);
void  __saveds __stdargs SVLI_CloseLibs(void);
void  __saveds __stdargs SVLI_InitSVOList(void);

struct ExecBase      *SysBase               = N;
struct DosLibrary    *DOSBase               = N;
struct IntuitionBase *IntuitionBase         = N;
struct GfxBase       *GfxBase               = N;
struct Library       *UtilityBase           = N;
struct SVSupportBase *SVSupportBase         = N;
struct Library       *MathBase              = N;

#define VERSION  3
#define REVISION 3

char __aligned SVLibName   [] = "UtahRLE.svobject";
char __aligned SVLibID     [] = "UtahRLE 3.3 (16.12.95)\15\12\0";
char __aligned AKCopyright [] = "(c) 1994-95 by Andreas R. Kleinert";

extern ULONG InitTab[];

extern APTR EndResident; /* below */

struct Resident ROMTag =
{
 RTC_MATCHWORD,
 &ROMTag,
 &EndResident,
 RTF_AUTOINIT,
 VERSION,
 NT_LIBRARY,
 REVISION,
 &SVLibName[0],
 &SVLibID[0],
 &InitTab[0]
};

APTR EndResident;

struct MyDataInit
{
 UWORD ainit1; UWORD binit1; UWORD ln_type;
 UWORD ainit2; UWORD 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;
 UWORD ainit6; UWORD binit6; ULONG lib_idstring2;
 ULONG end;
} DataTab =
{
 INITBYTE(OFFSET(Node,         ln_Type),      NT_LIBRARY),
 0x80, (UBYTE) OFFSET(Node,    ln_Name),      (ULONG) &SVLibName[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) &SVLibID[0],
 (ULONG) 0
};

ULONG __saveds __stdargs SVLI_OpenLibs(void)
{
 SysBase = (*((struct ExecBase **) 4)); 

 DOSBase = (APTR) OpenLibrary("dos.library", 37);
 if(!DOSBase) return(FALSE);

 IntuitionBase = (APTR) OpenLibrary("intuition.library", 37);
 if(!IntuitionBase) return(FALSE);

 GfxBase = (APTR) OpenLibrary("graphics.library", 37);
 if(!GfxBase) return(FALSE);

 UtilityBase = (APTR) OpenLibrary("utility.library", 37);
 if(!UtilityBase) return(FALSE);

 SVSupportBase = (APTR) OpenLibrary("superviewsupport.library", 6);
 if(!SVSupportBase) return(FALSE);

 MathBase = (APTR) OpenLibrary("mathffp.library", 33);
 if(!MathBase) return(FALSE);

 return(TRUE);
}

void __saveds __stdargs SVLI_CloseLibs(void)
{
 if(DOSBase)               CloseLibrary((APTR) DOSBase);
 if(IntuitionBase)         CloseLibrary((APTR) IntuitionBase);
 if(GfxBase)               CloseLibrary((APTR) GfxBase);
 if(UtilityBase)           CloseLibrary((APTR) UtilityBase);
 if(SVSupportBase)         CloseLibrary((APTR) SVSupportBase);
 if(MathBase)              CloseLibrary((APTR) MathBase);
}

void __saveds __stdargs SVLI_InitSVOList(void)
{
 struct SVO_ObjectNode *svo_node = N;

 SVObjectBase->svb_SVObject = N;

 if(FindName(&SysBase->LibList, "superview.library"))
  {
   struct SuperViewBase *SuperViewBase = (APTR) OpenLibrary("superview.library", 2);

   if(SuperViewBase)
    {
     SVObjectBase->svb_SVObject = (APTR) FindName((APTR) &SuperViewBase->svb_SVObjectList, "MAC.svobject");

     CloseLibrary((APTR) SuperViewBase);
    }
  }else
  {
   svo_node = AllocVec(sizeof(struct SVO_ObjectNode), (MEMF_CLEAR|MEMF_PUBLIC));

   if(!svo_node) return;

   SVObjectBase->svb_SVObject = svo_node;

   ((struct Node *)svo_node)->ln_Type = NT_UNKNOWN;
   ((struct Node *)svo_node)->ln_Pri  = -40;
   ((struct Node *)svo_node)->ln_Name = N;

   svo_node->svo_Version = LibVer(SVObjectBase);
   svo_node->svo_ObjectType = SVO_OBJECTTYPE_EXTERNAL;

   strcpy(svo_node->svo_FileName, "UtahRLE.svobject");

   strcpy(svo_node->svo_TypeID, "UtahRLE");
   svo_node->svo_TypeCode = N;                /* set by superview.library */

   svo_node->svo_SubTypeNum = 1;

   strcpy(svo_node->svo_SubTypeID[0], "RayTrace");

   svo_node->svo_SubTypeCode[0] = N;          /* set by superview.library */

   svo_node->svo_Flags =   SVO_FLAG_READS_TO_BUFFER    | SVO_FLAG_READS_TO_SCREEN
                         | SVO_FLAG_WRITES_FROM_BUFFER | SVO_FLAG_WRITES_FROM_SCREEN
                         | SVO_FLAG_SVDRIVER;
  }
}
