diff options
author | stanton <stanton> | 1999-03-03 00:38:35 (GMT) |
---|---|---|
committer | stanton <stanton> | 1999-03-03 00:38:35 (GMT) |
commit | 531a666d600bbb937c43e9ec3a90e230548710a4 (patch) | |
tree | 76e694a9fbdd6ed515de6186a840d8cd40cee06e /generic/tclStubLib.c | |
parent | 8f97fc1f429811f069993f10d6adaff739b6c805 (diff) | |
download | tcl-531a666d600bbb937c43e9ec3a90e230548710a4.zip tcl-531a666d600bbb937c43e9ec3a90e230548710a4.tar.gz tcl-531a666d600bbb937c43e9ec3a90e230548710a4.tar.bz2 |
* unix/Makefile.in:
* unix/configure.in:
* unix/ldAix: Enhanced AIX shared library support.
* win/tclWinSock.c: Removed a bunch of extraneous PASCAL FAR
attributes from internal functions.
* win/tclWinReg.c: Changed registry package to use stubs mechanism
so it no longer depends on the specific version of Tcl.
* doc/AddErrInfo.3:
* doc/Eval.3:
* doc/PkgRequire.3:
* doc/SetResult.3:
* doc/StringObj.3:
* generic/tcl.h:
* generic/tclBasic.c:
* generic/tclPanic.c:
* generic/tclStringObj.c:
* generic/tclUtil.c:
* unix/mkLinks: Added va_list versions of all VARARGS
functions so they can be invoked from the stub functions.
* doc/package.n:
* doc/PkgRequire.3:
* generic/tclPkg.c: Added Tcl_PkgProvideEx, Tcl_RequireEx,
Tcl_PresentEx, and Tcl_PkgPresent. Added "package present"
command.
* generic/tclFileName.c:
* mac/tclMacFile.c:
* mac/tclMacShLib.exp:
* unix/tclUnixFile.c:
* win/tclWinFile.c: Changed so TclGetUserHome is defined on
all platforms, even though it is currently a noop on mac and
windows, and renamed it to TclpGetUserHome.
* generic/tclCkalloc.c: Added stub versions of memory checking
functions when compiling without TCL_MEM_DEBUG.
* doc/ByteArrObj.3:
* generic/tcl.h:
* generic/tclBinary.c:
* generic/tclObj.c: Ported the 8.1 ByteArray type back to 8.0.
* generic/tcl.decls:
* generic/tcl.h:
* generic/tclBasic.c:
* generic/tclDecls.h:
* generic/tclInt.decls:
* generic/tclInt.h:
* generic/tclIntDecls.h:
* generic/tclIntPlatDecls.h:
* generic/tclIntPlatStubs.c:
* generic/tclIntStubs.c:
* generic/tclPlatDecls.h:
* generic/tclPlatStubs.c:
* generic/tclStubInit.c:
* generic/tclStubLib.c:
* generic/tclStubs.c:
* tools/genStubs.tcl:
* unix/configure.in:
* unix/Makefile.in:
* unix/tclConfig.sh.in:
* win/makefile.vc:
* win/tclWinPort.h: Added Tcl stubs implementation. There are
now two new macros USE_TCL_STUBS and USE_TCL_STUB_PROCS that
enable use of stubs and disable stub macros respectively. All of
the public and private function declarations from tcl.h and
tclInt.h have moved into the *.decls files and the *Stubs.c and
*Decls.h files are generated using the genStubs.tcl script.
* generic/tclPanic.c:
* generic/panic.c: renamed panic to Tcl_Panic, added macro for
backwards compatibility, renamed file to tclPanic.c
Diffstat (limited to 'generic/tclStubLib.c')
-rw-r--r-- | generic/tclStubLib.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/generic/tclStubLib.c b/generic/tclStubLib.c new file mode 100644 index 0000000..0c881b0 --- /dev/null +++ b/generic/tclStubLib.c @@ -0,0 +1,104 @@ +/* + * tclStubLib.c -- + * + * Stub object that will be statically linked into extensions that wish + * to access Tcl. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * Copyright (c) 1998 Paul Duffin. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * + * RCS: @(#) $Id: tclStubLib.c,v 1.1 1999/03/03 00:38:43 stanton Exp $ + */ + +/* + * We need to ensure that we use the stub macros so that this file contains + * no references to any of the stub functions. This will make it possible + * to build an extension that references Tcl_InitStubs but doesn't end up + * including the rest of the stub functions. + */ + +#undef TCL_NO_INLINES + +#include "tclInt.h" +#include "tclPort.h" + +/* + * Ensure that Tcl_InitStubs is built as an exported symbol. The other stub + * functions should be built as non-exported symbols. + */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLEXPORT + +TclStubs *tclStubsPtr; +TclPlatStubs *tclPlatStubsPtr; + +static TclStubs * HasStubSupport _ANSI_ARGS_((Tcl_Interp *interp)); + +static TclStubs * +HasStubSupport (interp) + Tcl_Interp *interp; +{ + Interp *iPtr = (Interp *) interp; + + if (iPtr->stubTable && (iPtr->stubTable->magic == TCL_STUB_MAGIC)) { + return iPtr->stubTable; + } + interp->result = "This interpreter does not support stubs-enabled extensions."; + interp->freeProc = TCL_STATIC; + + return NULL; +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_InitStubs -- + * + * Tries to initialise the stub table pointers and ensures that + * the correct version of Tcl is loaded. + * + * Results: + * The actual version of Tcl that satisfies the request, or + * NULL to indicate that an error occurred. + * + * Side effects: + * Sets the stub table pointers. + * + *---------------------------------------------------------------------- + */ + +char * +Tcl_InitStubs (interp, version, exact) + Tcl_Interp *interp; + char *version; + int exact; +{ + char *actualVersion; + TclStubs *tmp; + + if (!tclStubsPtr) { + tclStubsPtr = HasStubSupport(interp); + if (!tclStubsPtr) { + return NULL; + } + } + + actualVersion = Tcl_PkgRequireEx(interp, "Tcl", version, exact, + (ClientData *) &tmp); + if (actualVersion == NULL) { + tclStubsPtr = NULL; + return NULL; + } + + if (tclStubsPtr->hooks) { + tclPlatStubsPtr = tclStubsPtr->hooks->tclPlatStubs; + } else { + tclPlatStubsPtr = NULL; + } + + return actualVersion; +} |