Listing 2 von main.c (rexxalert.library)

/*--------------------------------------------------------*/
/*    main.c -- abgeguckt und verändert v. Bob Malzan     */
/*                                                        */
/*   Bibliotheksinitialisierung, der Einfachheit halber   */
/*                  in C geschrieben...                   */
/*--------------------------------------------------------*/
#include "main.h"

extern long (*RXALFuncTab[])(); /* Standard-Sprungtabelle */
extern LONG  StartLib();        /* Library-Einsprungadr. */
extern struct Resident RXALRomTag; /* RomTag-Struktur */

/*                InitTable initialisieren                */
struct InitTable RXALInitTab =
{
  sizeof (struct RXALBase),
  RXALFuncTab,
  NULL,
  StartLib
};

/*     hier sollten eigene Vorgaben gemacht werden...     */
#define RXALREVISION 0
char RXALname[] = "rexxalert.library";
char RXALid[]   = "rexxalertlib 1.0 (Sep 91)\r\n";

/*--------------------------------------------------------*/
/* LibMain wird von der StartLib-Routine aufgerufen, weil */
/*       manches eben übersichtlicher in C geht...        */
LONG LibMain(struct RXALBase *base,ULONG seglist)
{
/*                 Segmentliste eintragen                 */
  base->mb_SegList = seglist;
/*         Library Node, Typ und Namen eintragen          */
  base->mb_Lib.lib_Node.ln_Type = NT_LIBRARY;
  base->mb_Lib.lib_Node.ln_Name = (char *) RXALname;

/*   Library wurde verändert: Checksumme neu berechnen    */
  base->mb_Lib.lib_Flags = LIBF_SUMUSED | LIBF_CHANGED;

/*               übrigen Kram verbuchen...                */
  base->mb_Lib.lib_Version = RXALRomTag.rt_Version;
  base->mb_Lib.lib_Revision = RXALREVISION;
  base->mb_Lib.lib_IdString = (APTR) RXALid;

/*             User-Init aufrufen und fertig              */
  return(MyOpen(base));
}

/*--------------------------------------------------------*/
/*                 Standard-Open-Routine                  */
LONG RXALOpen(struct RXALBase *base)
{
/*                 immer schön mitzählen                  */
  base->mb_Lib.lib_OpenCnt++;

/*   die Library bleibt im Speicher (EXPUNGE verbieten)   */
  base->mb_Lib.lib_Flags &= ~LIBF_DELEXP;

/*      Der User (REXX) braucht den Base Pointer...       */
  return ((LONG) base);
}

/*--------------------------------------------------------*/
/*                 Standard-Close-Routine                 */
LONG RXALClose(struct RXALBase *base)
{
  LONG retval = 0;

  if ( !(--base->mb_Lib.lib_OpenCnt) &&
    (base->mb_Lib.lib_Flags & LIBF_DELEXP))
  {
/* wenn 1. keiner mehr die Library offen hält und 2. ein  */
/*    EXPUNGE gewünscht wurde, dann Expunge() aufrufen    */
    retval = RXALExpunge(base);
  }
  return (retval);
}

/*--------------------------------------------------------*/
/*                Standard Expunge-Routine                */
LONG RXALExpunge(struct RXALBase *base)
{
  ULONG SegList = NULL;

/*                    keiner mehr da?                     */
  if (base->mb_Lib.lib_OpenCnt == 0)
  {
    LONG  LibSize; /* eine Hilfsgröße */

/*                  User-Close aufrufen                   */
    MyClose(base);
/*                Segmentliste zurückgeben                */
    SegList   = base->mb_SegList;
    Remove((struct Node *)base);

/*              Speicher der Lib. freigeben               */
/*  Lib. ist Größe(Codesegment)+Größe(Datensegment) groß  */
    LibSize = base->mb_Lib.lib_NegSize+base-mb_Lib.lib_PosSize;
    FreeMem((char *)base-
      base->mb_Lib.lib_NegSize,(LONG)LibSize);
  }
/*        sonst ist EXPUNGE prinzipiell erwünscht         */
  else base->mb_Lib.lib_Flags |= LIBF_DELEXP;

/*    Der letzte macht das Licht aus und die Tür zu...    */
  return ((LONG)SegList);
}
