home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 545b.lha / RexxHS / sas / libinit.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-09-07  |  4.3 KB  |  142 lines

  1. #include <exec/types.h>
  2. #include <exec/nodes.h>
  3. #include <exec/resident.h>
  4. #include <exec/libraries.h>
  5. #include <libraries/dos.h>
  6. #include <proto/exec.h>
  7. #include <proto/dos.h>
  8. #include <string.h>
  9.  
  10. struct MyLibrary {
  11.         struct       Library ml_Lib;
  12.         ULONG        ml_SegList;
  13.         ULONG        ml_Flags;
  14.         APTR         ml_ExecBase;        /* pointer to exec base */
  15.         LONG         ml_Data;                /* Global data */
  16.         };
  17.  
  18. typedef LONG (*PFL)();   /* pointer to function returning 32-bit int        */
  19.  
  20. /* library initialization table, used for AUTOINIT libraries                */
  21. struct InitTable {
  22.         ULONG        *it_DataSize;        /* library data space size         */
  23.         PFL          *it_FuncTable;      /* table of entry points           */
  24.         APTR         it_DataInit;        /* table of data initializers      */
  25.         PFL          it_InitFunc;        /* initialization function to run  */
  26. };
  27.  
  28. extern PFL _LibFuncTab[];      /* my function table (Generated by Blink) */
  29.  
  30. extern char __far RESLEN;
  31. extern long __far NEWDATAL; /* Generated by BLINK */
  32. #define DATAWORDS ((long)&NEWDATAL)
  33.  
  34. ULONG __saveds __asm _LibExpunge( register __a6 struct MyLibrary *libbase );
  35. ULONG __saveds __asm _LibInit( register __a0 APTR seglist,
  36.                                 register __d0 struct MyLibrary *libbase );
  37.  
  38. struct InitTable __far _LibInitTab =  {
  39.         (long *)(&RESLEN+sizeof(struct MyLibrary)),
  40.         _LibFuncTab,
  41.         NULL,                        /* will initialize my own data */
  42.         _LibInit,
  43. };
  44. extern long far _Libmergeddata;    /* Need this to determine start of MERGED DATA */
  45.  
  46.  
  47. /* These two are defined by blink */
  48. extern char __far _LibID[];
  49. extern char __far _LibName[];
  50.  
  51. #define MYREVISION 1
  52.  
  53. __saveds __asm
  54. ULONG _LibInit( register __a0 APTR seglist,
  55.         register __d0 struct MyLibrary *libbase )
  56. {
  57.     long *sdata, *reloc;
  58.     char *ddata;
  59.     long nrelocs;
  60.  
  61.         libbase->ml_SegList = (ULONG) seglist;
  62.  
  63.         /* init. library structure (since I don't do automatic data init.) */
  64.         libbase->ml_Lib.lib_Node.ln_Type = NT_LIBRARY;
  65.         libbase->ml_Lib.lib_Node.ln_Name =  _LibName;
  66.         libbase->ml_Lib.lib_Flags = LIBF_SUMUSED | LIBF_CHANGED;
  67.         libbase->ml_Lib.lib_Version = 1;
  68.         libbase->ml_Lib.lib_Revision = MYREVISION;
  69.         libbase->ml_Lib.lib_IdString = (APTR) _LibID;
  70.  
  71.     ddata = (char *)&libbase->ml_Data+4;   /* The +4 is a wasted long word,
  72.                           where _Libmergeddata is. */
  73.     sdata = (long *)&_Libmergeddata;
  74.     memcpy(ddata, (char *)sdata, DATAWORDS*4);
  75.  
  76.     sdata = sdata + DATAWORDS;
  77.     nrelocs = *sdata++;
  78.     while (nrelocs > 0)
  79.     {
  80.         reloc = (long *)((long)ddata + *sdata++);
  81.         *reloc += (long)ddata;
  82.         nrelocs--;
  83.     }
  84.  
  85.         /* ----- Do library specific public initialization here ----- */
  86.  
  87.         return ( (ULONG) libbase );
  88. }
  89.  
  90. LONG __saveds __asm
  91. _LibOpen( register __a6 struct        MyLibrary *libbase )
  92. {
  93.         /* mark us as having another customer */
  94.         libbase->ml_Lib.lib_OpenCnt++;
  95.  
  96.         /* clear delayed expunges (standard procedure)                */
  97.         libbase->ml_Lib.lib_Flags &= ~LIBF_DELEXP;
  98.  
  99.         return ( (LONG) libbase );
  100. }
  101.  
  102. ULONG __saveds __asm
  103. _LibClose( register __a6 struct MyLibrary *libbase )
  104. {
  105.         ULONG retval = 0;
  106.  
  107.         if (( --libbase->ml_Lib.lib_OpenCnt == 0 ) &&
  108.                         ( libbase->ml_Lib.lib_Flags & LIBF_DELEXP ))
  109.         {
  110.                 /* no more people have me open,
  111.                  * and I have a delayed expunge pending
  112.                  */
  113.                 retval = _LibExpunge( libbase ); /* return segment list        */
  114.         }
  115.  
  116.         return (retval);
  117. }
  118.  
  119. ULONG __saveds __asm
  120. _LibExpunge( register __a6 struct MyLibrary *libbase )
  121. {
  122.         ULONG seglist = 0;
  123.         LONG  libsize;
  124.  
  125.         libbase->ml_Lib.lib_Flags |= LIBF_DELEXP;
  126.         if ( libbase->ml_Lib.lib_OpenCnt == 0 )
  127.         {
  128.                 /* really expunge: remove libbase and freemem        */
  129.  
  130.                 seglist = libbase->ml_SegList;
  131.  
  132.                 Remove( (struct Node *) libbase);
  133.  
  134.                 libsize = libbase->ml_Lib.lib_NegSize + libbase->ml_Lib.lib_PosSize;
  135.                 FreeMem( (char *) libbase - libbase->ml_Lib.lib_NegSize,(LONG) libsize );
  136.         }
  137.  
  138.         /* return NULL or real seglist                                */
  139.         return ( (ULONG) seglist );
  140. }
  141.  
  142.