diff options
Diffstat (limited to 'generic/tclStubLib.c')
| -rw-r--r-- | generic/tclStubLib.c | 152 | 
1 files changed, 80 insertions, 72 deletions
| diff --git a/generic/tclStubLib.c b/generic/tclStubLib.c index c650dac..5261591 100644 --- a/generic/tclStubLib.c +++ b/generic/tclStubLib.c @@ -1,121 +1,129 @@ -/*  +/*   * tclStubLib.c --   * - *	Stub object that will be statically linked into extensions that wish + *	Stub object that will be statically linked into extensions that want   *	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.6 2002/12/04 07:07:59 hobbs Exp $ + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES.   */ -/* - * 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. - */ +#include "tclInt.h" -#ifndef USE_TCL_STUBS -#define USE_TCL_STUBS -#endif -#undef USE_TCL_STUB_PROCS +MODULE_SCOPE const TclStubs *tclStubsPtr; +MODULE_SCOPE const TclPlatStubs *tclPlatStubsPtr; +MODULE_SCOPE const TclIntStubs *tclIntStubsPtr; +MODULE_SCOPE const TclIntPlatStubs *tclIntPlatStubsPtr; -#include "tclInt.h" -#include "tclPort.h" +const TclStubs *tclStubsPtr = NULL; +const TclPlatStubs *tclPlatStubsPtr = NULL; +const TclIntStubs *tclIntStubsPtr = NULL; +const TclIntPlatStubs *tclIntPlatStubsPtr = NULL;  /* - * Ensure that Tcl_InitStubs is built as an exported symbol.  The other stub - * functions should be built as non-exported symbols. + * Use our own ISDIGIT to avoid linking to libc on windows   */ -#undef TCL_STORAGE_CLASS -#define TCL_STORAGE_CLASS DLLEXPORT - -TclStubs *tclStubsPtr = NULL; -TclPlatStubs *tclPlatStubsPtr = NULL; -TclIntStubs *tclIntStubsPtr = NULL; -TclIntPlatStubs *tclIntPlatStubsPtr = NULL; - -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; -} +#define ISDIGIT(c) (((unsigned)((c)-'0')) <= 9)  /*   *----------------------------------------------------------------------   *   * Tcl_InitStubs --   * - *	Tries to initialise the stub table pointers and ensures that - *	the correct version of Tcl is loaded. + *	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. + *	The actual version of Tcl that satisfies the request, or NULL to + *	indicate that an error occurred.   *   * Side effects:   *	Sets the stub table pointers.   *   *----------------------------------------------------------------------   */ - -#ifdef Tcl_InitStubs  #undef Tcl_InitStubs -#endif - -CONST char * -Tcl_InitStubs (interp, version, exact) -    Tcl_Interp *interp; -    CONST char *version; -    int exact; +MODULE_SCOPE const char * +Tcl_InitStubs( +    Tcl_Interp *interp, +    const char *version, +    int exact, +    int magic)  { -    CONST char *actualVersion = NULL; -    TclStubs *tmp; +    Interp *iPtr = (Interp *) interp; +    const char *actualVersion = NULL; +    ClientData pkgData = NULL; +    const TclStubs *stubsPtr = iPtr->stubTable;      /* -     * We can't optimize this check by caching tclStubsPtr because -     * that prevents apps from being able to load/unload Tcl dynamically -     * multiple times. [Bug 615304] +     * We can't optimize this check by caching tclStubsPtr because that +     * prevents apps from being able to load/unload Tcl dynamically multiple +     * times. [Bug 615304]       */ -    tclStubsPtr = HasStubSupport(interp); -    if (!tclStubsPtr) { +    if (!stubsPtr || (stubsPtr->magic != (((exact&0xff00) >= 0x900) ? magic : TCL_STUB_MAGIC))) { +	iPtr->result = (char *)"interpreter uses an incompatible stubs mechanism"; +	iPtr->freeProc = 0;  	return NULL;      } -    actualVersion = Tcl_PkgRequireEx(interp, "Tcl", version, exact, -	    (ClientData *) &tmp); +    actualVersion = stubsPtr->tcl_PkgRequireEx(interp, "Tcl", version, 0, &pkgData);      if (actualVersion == NULL) { -	tclStubsPtr = NULL;  	return NULL;      } +    if (exact&1) { +	const char *p = version; +	int count = 0; + +	while (*p) { +	    count += !ISDIGIT(*p++); +	} +	if (count == 1) { +	    const char *q = actualVersion; + +	    p = version; +	    while (*p && (*p == *q)) { +		p++; q++; +	    } +	    if (*p || ISDIGIT(*q)) { +		/* Construct error message */ +		stubsPtr->tcl_PkgRequireEx(interp, "Tcl", version, 1, NULL); +		return NULL; +	    } +	} else { +	    actualVersion = stubsPtr->tcl_PkgRequireEx(interp, "Tcl", version, 1, NULL); +	    if (actualVersion == NULL) { +		return NULL; +	    } +	} +    } +    if (((exact&0xff00) < 0x900)) { +	/* We are running Tcl 8.x */ +	stubsPtr = (TclStubs *)pkgData; +    } +    tclStubsPtr = stubsPtr; -    if (tclStubsPtr->hooks) { -	tclPlatStubsPtr = tclStubsPtr->hooks->tclPlatStubs; -	tclIntStubsPtr = tclStubsPtr->hooks->tclIntStubs; -	tclIntPlatStubsPtr = tclStubsPtr->hooks->tclIntPlatStubs; +    if (stubsPtr->hooks) { +	tclPlatStubsPtr = stubsPtr->hooks->tclPlatStubs; +	tclIntStubsPtr = stubsPtr->hooks->tclIntStubs; +	tclIntPlatStubsPtr = stubsPtr->hooks->tclIntPlatStubs;      } else {  	tclPlatStubsPtr = NULL;  	tclIntStubsPtr = NULL;  	tclIntPlatStubsPtr = NULL;      } -     +      return actualVersion;  } + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ | 
