diff options
Diffstat (limited to 'generic/tkStubLib.c')
-rw-r--r-- | generic/tkStubLib.c | 108 |
1 files changed, 70 insertions, 38 deletions
diff --git a/generic/tkStubLib.c b/generic/tkStubLib.c index 29c4851..5349a0b 100644 --- a/generic/tkStubLib.c +++ b/generic/tkStubLib.c @@ -1,4 +1,4 @@ -/* +/* * tkStubLib.c -- * * Stub object that will be statically linked into extensions that wish @@ -7,15 +7,14 @@ * Copyright (c) 1998 Paul Duffin. * Copyright (c) 1998-1999 by Scriptics Corporation. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * 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 Tk_InitStubs but doesn't end up + * 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 Tk_InitStubs but doesn't end up * including the rest of the stub functions. */ @@ -29,53 +28,50 @@ #endif #undef USE_TK_STUB_PROCS -#include "tkPort.h" #include "tkInt.h" #ifdef __WIN32__ #include "tkWinInt.h" #endif -#ifdef MAC_TCL -#include "tkMacInt.h" -#endif - #ifdef MAC_OSX_TK #include "tkMacOSXInt.h" #endif -#include "tkDecls.h" -#include "tkIntDecls.h" +#if !(defined(__WIN32__) || defined(MAC_OSX_TK)) +#include "tkUnixInt.h" +#endif + +/* TODO: These ought to come in some other way */ #include "tkPlatDecls.h" -#include "tkIntPlatDecls.h" #include "tkIntXlibDecls.h" +TkStubs *tkStubsPtr = NULL; +TkPlatStubs *tkPlatStubsPtr = NULL; +TkIntStubs *tkIntStubsPtr = NULL; +TkIntPlatStubs *tkIntPlatStubsPtr = NULL; +TkIntXlibStubs *tkIntXlibStubsPtr = NULL; + /* - * Ensure that Tk_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 - -TkStubs *tkStubsPtr; -TkPlatStubs *tkPlatStubsPtr; -TkIntStubs *tkIntStubsPtr; -TkIntPlatStubs *tkIntPlatStubsPtr; -TkIntXlibStubs *tkIntXlibStubsPtr; - +static int isDigit(const int c) +{ + return (c >= '0' && c <= '9'); +} /* *---------------------------------------------------------------------- * * Tk_InitStubs -- * - * Checks that the correct version of Tk is loaded and that it - * supports stubs. It then initialises the stub table pointers. + * Checks that the correct version of Tk is loaded and that it supports + * stubs. It then initialises the stub table pointers. * * Results: - * The actual version of Tk that satisfies the request, or - * NULL to indicate that an error occurred. + * The actual version of Tk that satisfies the request, or NULL to + * indicate that an error occurred. * * Side effects: * Sets the stub table pointers. @@ -88,18 +84,46 @@ TkIntXlibStubs *tkIntXlibStubsPtr; #endif CONST char * -Tk_InitStubs(interp, version, exact) - Tcl_Interp *interp; - char *version; - int exact; +Tk_InitStubs( + Tcl_Interp *interp, + CONST char *version, + int exact) { CONST char *actualVersion; + TkStubs **stubsPtrPtr = &tkStubsPtr; /* squelch warning */ - actualVersion = Tcl_PkgRequireEx(interp, "Tk", version, exact, - (ClientData *) &tkStubsPtr); + actualVersion = Tcl_PkgRequireEx(interp, "Tk", version, 0, + (ClientData *) stubsPtrPtr); if (!actualVersion) { return NULL; } + if (exact) { + 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) { + /* Construct error message */ + Tcl_PkgRequireEx(interp, "Tk", version, 1, NULL); + return NULL; + + } + } else { + actualVersion = Tcl_PkgRequireEx(interp, "Tk", version, 1, NULL); + if (actualVersion == NULL) { + return NULL; + } + } + } if (!tkStubsPtr) { Tcl_SetResult(interp, @@ -107,11 +131,19 @@ Tk_InitStubs(interp, version, exact) TCL_STATIC); return NULL; } - + tkPlatStubsPtr = tkStubsPtr->hooks->tkPlatStubs; tkIntStubsPtr = tkStubsPtr->hooks->tkIntStubs; tkIntPlatStubsPtr = tkStubsPtr->hooks->tkIntPlatStubs; tkIntXlibStubsPtr = tkStubsPtr->hooks->tkIntXlibStubs; - + return actualVersion; } + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ |