home *** CD-ROM | disk | FTP | other *** search
/ The Best of Mecomp Multimedia 2 / MECOMP-CD-II.iso / amiga / datatypes / mididt / source / startup.c < prev   
Encoding:
C/C++ Source or Header  |  1997-10-04  |  4.4 KB  |  202 lines

  1. /*
  2. ** $PROJECT: midi.datatype
  3. **
  4. ** $VER: startup.c 40.0 (11.09.97)
  5. **
  6. ** Copyright 1997 by Martin Gierich.
  7. **
  8. ** Library startup-code and function table definition
  9. **
  10. ** Based on Datatype in 100% C created by Andreas R. Kleinert.
  11. ** Adapted by Martin Gierich.
  12. ** All Rights Reserved !
  13. **
  14. ** $HISTORY:
  15. ** 11.09.97 : 40.00 : Initial BETA release
  16. **
  17. ** $TABSIZE: 8
  18. */
  19.  
  20.  
  21. #define __USE_SYSBASE
  22.  
  23. #include <exec/types.h>
  24. #include <exec/memory.h>
  25. #include <exec/libraries.h>
  26. #include <exec/execbase.h>
  27. #include <exec/resident.h>
  28. #include <exec/initializers.h>
  29.  
  30. #include <proto/exec.h>
  31.  
  32. #include "register.h"
  33.  
  34.  
  35. extern ULONG __saveds __stdargs L_OpenLibs(void);
  36. extern void  __saveds __stdargs L_CloseLibs(void);
  37. LibCall Class *ObtainMidiEngine ( REGA6 struct ClassBase *cb );
  38.  
  39.  
  40. struct ClassBase * __saveds __asm InitLib( register __a6 struct ExecBase      *sysbase,
  41.                                              register __a0 struct SegList       *seglist,
  42.                                              register __d0 struct ClassBase *exb);
  43.  
  44. struct ClassBase * __saveds __asm OpenLib( register __a6 struct ClassBase *ClassBase);
  45. struct SegList * __saveds __asm CloseLib( register __a6 struct ClassBase *ClassBase);
  46. struct SegList * __saveds __asm ExpungeLib( register __a6 struct ClassBase *exb);
  47. ULONG __saveds __asm ExtFuncLib(void);
  48.  
  49.  
  50. LONG __saveds __asm LibStart(void)
  51. {
  52.  return(-1);
  53. }
  54.  
  55. extern APTR FuncTab [];
  56. extern struct MyDataInit DataTab;
  57.  
  58. struct InitTable
  59. {
  60.  ULONG              LibBaseSize;
  61.  APTR              *FunctionTable;
  62.  struct MyDataInit *DataTable;
  63.  APTR               InitLibTable;
  64. } InitTab =
  65. {
  66.  sizeof(struct ClassBase),
  67.  &FuncTab[0],
  68.  &DataTab,
  69.  InitLib
  70. };
  71.  
  72. APTR FuncTab [] =
  73. {
  74.  OpenLib,
  75.  CloseLib,
  76.  ExpungeLib,
  77.  ExtFuncLib,
  78.  
  79.  ObtainMidiEngine,
  80.  
  81.  (APTR) ((LONG)-1)
  82. };
  83.  
  84.  
  85. extern struct ClassBase *ClassBase;
  86.  
  87.  
  88. struct ClassBase * __saveds __asm InitLib( register __a6 struct ExecBase      *sysbase,
  89.                                              register __a0 struct SegList       *seglist,
  90.                                              register __d0 struct ClassBase *exb)
  91. {
  92.  ClassBase = exb;
  93.  ClassBase->cb_SegList = seglist;
  94.  
  95.  if(L_OpenLibs()) return(ClassBase);
  96.  
  97.  L_CloseLibs();
  98.  
  99.   {
  100.    ULONG negsize, possize, fullsize;
  101.    UBYTE *negptr = (UBYTE *) ClassBase;
  102.  
  103.    negsize  = ClassBase->cb_LibNode.lib_NegSize;
  104.    possize  = ClassBase->cb_LibNode.lib_PosSize;
  105.    fullsize = negsize + possize;
  106.    negptr  -= negsize;
  107.  
  108.    FreeMem(negptr, fullsize);
  109.   }
  110.  
  111.  return(NULL);
  112. }
  113.  
  114. struct ClassBase * __saveds __asm OpenLib( register __a6 struct ClassBase *ClassBase)
  115. {
  116.  ClassBase->cb_LibNode.lib_OpenCnt++;
  117.  
  118.  ClassBase->cb_LibNode.lib_Flags &= ~LIBF_DELEXP;
  119.  
  120.  return(ClassBase);
  121. }
  122.  
  123. struct SegList * __saveds __asm CloseLib( register __a6 struct ClassBase *ClassBase)
  124. {
  125.  ClassBase->cb_LibNode.lib_OpenCnt--;
  126.  
  127.  if(!ClassBase->cb_LibNode.lib_OpenCnt)
  128.   {
  129.    if(ClassBase->cb_LibNode.lib_Flags & LIBF_DELEXP)
  130.     {
  131.      return( ExpungeLib(ClassBase) );
  132.     }
  133.   }
  134.  
  135.  return(NULL);
  136. }
  137.  
  138. struct SegList * __saveds __asm ExpungeLib( register __a6 struct ClassBase *exb)
  139. {
  140.  struct ClassBase *ClassBase = exb;
  141.  struct SegList       *seglist;
  142.  
  143.  if(!ClassBase->cb_LibNode.lib_OpenCnt)
  144.   {
  145.    ULONG negsize, possize, fullsize;
  146.    UBYTE *negptr = (UBYTE *) ClassBase;
  147.  
  148.    seglist = ClassBase->cb_SegList;
  149.  
  150.    Remove(ClassBase);
  151.  
  152.    L_CloseLibs();
  153.  
  154.    negsize  = ClassBase->cb_LibNode.lib_NegSize;
  155.    possize  = ClassBase->cb_LibNode.lib_PosSize;
  156.    fullsize = negsize + possize;
  157.    negptr  -= negsize;
  158.  
  159.    FreeMem(negptr, fullsize);
  160.  
  161.    return(seglist);
  162.   }
  163.  
  164.  ClassBase->cb_LibNode.lib_Flags |= LIBF_DELEXP;
  165.  
  166.  return(NULL);
  167. }
  168.  
  169. ULONG __saveds __asm ExtFuncLib(void)
  170. {
  171.  return(NULL);
  172. }
  173.  
  174. struct ClassBase *ClassBase = NULL;
  175.  
  176.  
  177. #ifdef __SASC
  178.  
  179. #ifdef ARK_OLD_STDIO_FIX
  180.  
  181. ULONG XCEXIT       = NULL; /* these symbols may be referenced by    */
  182. ULONG _XCEXIT      = NULL; /* some functions of sc.lib, but should  */
  183. ULONG ONBREAK      = NULL; /* never be used inside a shared library */
  184. ULONG _ONBREAK     = NULL;
  185. ULONG base         = NULL;
  186. ULONG _base        = NULL;
  187. ULONG ProgramName  = NULL;
  188. ULONG _ProgramName = NULL;
  189. ULONG StackPtr     = NULL;
  190. ULONG _StackPtr    = NULL;
  191. ULONG oserr        = NULL;
  192. ULONG _oserr       = NULL;
  193. ULONG OSERR        = NULL;
  194. ULONG _OSERR       = NULL;
  195.  
  196. #endif /* ARK_OLD_STDIO_FIX */
  197.  
  198. void __regargs __chkabort(void) { }  /* a shared library cannot be    */
  199. void __regargs _CXBRK(void)     { }  /* CTRL-C aborted when doing I/O */
  200.  
  201. #endif /* __SASC */
  202.