home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / tkisrc04.zip / tcl / os2 / tclOS2DLL.c < prev    next >
C/C++ Source or Header  |  1998-09-09  |  4KB  |  180 lines

  1. /* 
  2.  * tclOS2Dll.c --
  3.  *
  4.  *    This file contains the DLL entry point.
  5.  *
  6.  * Copyright (c) 1995-1996 Sun Microsystems, Inc.
  7.  * Copyright (c) 1996-1997 Illya Vaes
  8.  *
  9.  * See the file "license.terms" for information on usage and redistribution
  10.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11.  */
  12.  
  13.  
  14. #include "tclInt.h"
  15. #include "tclPort.h"
  16.  
  17. int _CRT_init(void);
  18. void _CRT_term(void);
  19.  
  20. /*
  21.  * The following data structure is used to keep track of all of the DLL's
  22.  * opened by Tcl so that they can be freed with the Tcl.dll is unloaded.
  23.  */
  24.  
  25. typedef struct LibraryList {
  26.     HMODULE handle;
  27.     struct LibraryList *nextPtr;
  28. } LibraryList;
  29.  
  30. static LibraryList *libraryList = NULL;    /* List of currently loaded DLL's. */
  31.  
  32. static HMODULE tclInstance;    /* Global library instance handle */
  33.  
  34. static void         UnloadLibraries _ANSI_ARGS_((void));
  35.  
  36.  
  37. /*
  38.  *----------------------------------------------------------------------
  39.  *
  40.  * _DLL_InitTerm --
  41.  *
  42.  *    DLL entry point.
  43.  *
  44.  * Results:
  45.  *    TRUE on sucess, FALSE on failure.
  46.  *
  47.  * Side effects:
  48.  *    None.
  49.  *
  50.  *----------------------------------------------------------------------
  51.  */
  52. unsigned long /*MM* add { */
  53. #ifdef __IBMC__
  54. _System
  55. #endif
  56. /*MM* } */
  57. _DLL_InitTerm(
  58.     unsigned long hInst,    /* Library instance handle. */
  59.     unsigned long reason    /* Reason this function is being called. */
  60. )
  61. {
  62.     switch (reason) {
  63.     case 0:    /* INIT */
  64.     tclInstance = (HMODULE)hInst;
  65. /*MM* add { */
  66. #if defined(__IBMC__) && !defined(DYNAMICLIBS)
  67.     _CRT_init();
  68. #endif
  69. /*MM* } */
  70.         return TRUE; 
  71.     case 1:    /* TERM */
  72.         UnloadLibraries();
  73. /*MM* add { */
  74. #if defined(__IBMC__) && !defined(DYNAMICLIBS)
  75.     _CRT_term();
  76. #endif
  77. /*MM* } */
  78.         return TRUE; 
  79.     }
  80.  
  81.     return FALSE; 
  82. }
  83.  
  84. /*
  85.  *----------------------------------------------------------------------
  86.  *
  87.  * TclOS2LoadLibrary --
  88.  *
  89.  *    This function is a wrapper for the system DosLoadModule.  It is
  90.  *    responsible for adding library handles to the library list so
  91.  *    the libraries can be freed when tcl.dll is unloaded.
  92.  *
  93.  * Results:
  94.  *    Returns the handle of the newly loaded library, or NULL on
  95.  *    failure.
  96.  *
  97.  * Side effects:
  98.  *    Loads the specified library into the process.
  99.  *
  100.  *----------------------------------------------------------------------
  101.  */
  102.  
  103. HMODULE
  104. TclOS2LoadLibrary(name)
  105.     char *name;            /* Library file to load. */
  106. {
  107.     HMODULE handle;
  108.     LibraryList *ptr;
  109.     APIRET rc;
  110.     UCHAR LoadError[256];    /* Area for name of DLL that we failed on */
  111.  
  112.     rc = DosLoadModule(LoadError, sizeof(LoadError), name, &handle);
  113.     if (rc == NO_ERROR) {
  114. #ifdef DEBUG
  115.         printf("DosLoadModule %s OK\n", name);
  116. #endif
  117.     ptr = (LibraryList*) ckalloc(sizeof(LibraryList));
  118.     ptr->handle = handle;
  119.     ptr->nextPtr = libraryList;
  120.     libraryList = ptr;
  121.         return handle;
  122.     } else {
  123. #ifdef DEBUG
  124.         printf("DosLoadModule %s ERROR %d on %s\n", name, rc, LoadError);
  125. #endif
  126.         return NULLHANDLE;
  127.     }
  128. }
  129.  
  130. /*
  131.  *----------------------------------------------------------------------
  132.  *
  133.  * UnloadLibraries --
  134.  *
  135.  *    Frees any dynamically allocated libraries loaded by Tcl.
  136.  *
  137.  * Results:
  138.  *    None.
  139.  *
  140.  * Side effects:
  141.  *    Frees the libraries on the library list as well as the list.
  142.  *
  143.  *----------------------------------------------------------------------
  144.  */
  145.  
  146. static void
  147. UnloadLibraries()
  148. {
  149.     LibraryList *ptr;
  150.  
  151.     while (libraryList != NULL) {
  152.     DosFreeModule(libraryList->handle);
  153.     ptr = libraryList->nextPtr;
  154.     ckfree((char *)libraryList);
  155.     libraryList = ptr;
  156.     }
  157. }
  158.  
  159. /*
  160.  *----------------------------------------------------------------------
  161.  *
  162.  * TclOS2GetTclInstance --
  163.  *
  164.  *      Retrieves the global library instance handle.
  165.  *
  166.  * Results:
  167.  *      Returns the global library instance handle.
  168.  *
  169.  * Side effects:
  170.  *      None.
  171.  *
  172.  *----------------------------------------------------------------------
  173.  */
  174.  
  175. HMODULE
  176. TclOS2GetTclInstance()
  177. {
  178.     return tclInstance;
  179. }
  180.