tclStubLib.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:3k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tclStubLib.c --
  3.  *
  4.  * Stub object that will be statically linked into extensions that wish
  5.  * to access Tcl.
  6.  *
  7.  * Copyright (c) 1998-1999 by Scriptics Corporation.
  8.  * Copyright (c) 1998 Paul Duffin.
  9.  *
  10.  * See the file "license.terms" for information on usage and redistribution
  11.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12.  *
  13.  * RCS: @(#) $Id: tclStubLib.c,v 1.6.2.1 2005/11/20 18:23:03 jenglish Exp $
  14.  */
  15. /*
  16.  * We need to ensure that we use the stub macros so that this file contains
  17.  * no references to any of the stub functions.  This will make it possible
  18.  * to build an extension that references Tcl_InitStubs but doesn't end up
  19.  * including the rest of the stub functions.
  20.  */
  21. #ifndef USE_TCL_STUBS
  22. #define USE_TCL_STUBS
  23. #endif
  24. #undef USE_TCL_STUB_PROCS
  25. #include "tclInt.h"
  26. #include "tclPort.h"
  27. /*
  28.  * Ensure that Tcl_InitStubs is built as an exported symbol.  The other stub
  29.  * functions should be built as non-exported symbols.
  30.  */
  31. TclStubs *tclStubsPtr = NULL;
  32. TclPlatStubs *tclPlatStubsPtr = NULL;
  33. TclIntStubs *tclIntStubsPtr = NULL;
  34. TclIntPlatStubs *tclIntPlatStubsPtr = NULL;
  35. static TclStubs * HasStubSupport _ANSI_ARGS_((Tcl_Interp *interp));
  36. static TclStubs *
  37. HasStubSupport (interp)
  38.     Tcl_Interp *interp;
  39. {
  40.     Interp *iPtr = (Interp *) interp;
  41.     if (iPtr->stubTable && (iPtr->stubTable->magic == TCL_STUB_MAGIC)) {
  42. return iPtr->stubTable;
  43.     }
  44.     interp->result = "This interpreter does not support stubs-enabled extensions.";
  45.     interp->freeProc = TCL_STATIC;
  46.     return NULL;
  47. }
  48. /*
  49.  *----------------------------------------------------------------------
  50.  *
  51.  * Tcl_InitStubs --
  52.  *
  53.  * Tries to initialise the stub table pointers and ensures that
  54.  * the correct version of Tcl is loaded.
  55.  *
  56.  * Results:
  57.  * The actual version of Tcl that satisfies the request, or
  58.  * NULL to indicate that an error occurred.
  59.  *
  60.  * Side effects:
  61.  * Sets the stub table pointers.
  62.  *
  63.  *----------------------------------------------------------------------
  64.  */
  65. #ifdef Tcl_InitStubs
  66. #undef Tcl_InitStubs
  67. #endif
  68. CONST char *
  69. Tcl_InitStubs (interp, version, exact)
  70.     Tcl_Interp *interp;
  71.     CONST char *version;
  72.     int exact;
  73. {
  74.     CONST char *actualVersion = NULL;
  75.     ClientData pkgData = NULL;
  76.     /*
  77.      * We can't optimize this check by caching tclStubsPtr because
  78.      * that prevents apps from being able to load/unload Tcl dynamically
  79.      * multiple times. [Bug 615304]
  80.      */
  81.     tclStubsPtr = HasStubSupport(interp);
  82.     if (!tclStubsPtr) {
  83. return NULL;
  84.     }
  85.     actualVersion = Tcl_PkgRequireEx(interp, "Tcl", version, exact, &pkgData);
  86.     if (actualVersion == NULL) {
  87. return NULL;
  88.     }
  89.     tclStubsPtr = (TclStubs*)pkgData;
  90.     if (tclStubsPtr->hooks) {
  91. tclPlatStubsPtr = tclStubsPtr->hooks->tclPlatStubs;
  92. tclIntStubsPtr = tclStubsPtr->hooks->tclIntStubs;
  93. tclIntPlatStubsPtr = tclStubsPtr->hooks->tclIntPlatStubs;
  94.     } else {
  95. tclPlatStubsPtr = NULL;
  96. tclIntStubsPtr = NULL;
  97. tclIntPlatStubsPtr = NULL;
  98.     }
  99.     
  100.     return actualVersion;
  101. }