home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / example_c_dt / dt_source / startup.c < prev    next >
C/C++ Source or Header  |  1997-06-29  |  4KB  |  193 lines

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