/*
* ORIGINAL SOURCE: tk/generic/tkStubLib.c, version 1.9 2004/03/17
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
/*
* Need to ensure that this file is built without any external references.
*/
#undef USE_TCL_STUBS
#undef USE_TCLOO_STUBS
#define USE_TCL_STUBS 1
#define USE_TCLOO_STUBS 1
#include "tcl.h"
#include "tclOO.h"
#include "tclOOInt.h"
MODULE_SCOPE const TclOOStubs *tclOOStubsPtr;
MODULE_SCOPE const TclOOIntStubs *tclOOIntStubsPtr;
const TclOOStubs *tclOOStubsPtr = NULL;
const TclOOIntStubs *tclOOIntStubsPtr = NULL;
/*
*----------------------------------------------------------------------
*
* support functions --
* These ensure that this file has no dependence on the version of the C
* library that was used during the build (an issue on Windows).
*
*----------------------------------------------------------------------
*/
static inline int
isDigit(
const int c)
{
return (c >= '0' && c <= '9'); /* Assume ASCII */
}
static inline const char *
RequireExactVersion(
Tcl_Interp *interp,
const char *packageName,
const char *desiredVersion,
const char *actualVersion)
{
const char *p = desiredVersion;
int count = 0;
while (*p) {
count += !isDigit(*p++);
}
if (count == 1) {
const char *q = actualVersion;
p = desiredVersion;
while (*p && (*p == *q)) {
p++; q++;
}
if (*p) {
/* Construct error message */
Tcl_PkgRequireEx(interp, packageName, desiredVersion, 1, NULL);
return NULL;
}
} else {
actualVersion = Tcl_PkgRequireEx(interp, packageName, desiredVersion,
1, NULL);
if (actualVersion == NULL) {
return NULL;
}
}
return actualVersion;
}
/*
*----------------------------------------------------------------------
*
* TclOOInitializeStubs --
* Load the tclOO package, initialize stub table pointer. Do not call
* this function directly, use Tcl_OOInitStubs() macro instead.
*
* Results:
* The actual version of the package that satisfies the request, or NULL
* to indicate that an error occurred.
*
* Side effects:
* Sets the stub table pointer.
*
*----------------------------------------------------------------------
*/
#undef TclOOInitializeStubs
MODULE_SCOPE const char *
TclOOInitializeStubs(
Tcl_Interp *interp,
const char *version)
{
const TclOOStubs **stubsPtrPtr = &tclOOStubsPtr;
const char *gotVer = Tcl_PkgRequireEx(interp, "TclOO", version, 0,
(ClientData *) stubsPtrPtr);
if (gotVer == NULL) {
return NULL;
}
/* Cargo-culted logic alert! */
if (tclOOStubsPtr == NULL) {
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "Error loading TclOO package; ",
"package not present or incomplete", NULL);
return NULL;
}
tclOOIntStubsPtr = tclOOStubsPtr->hooks->tclOOIntStubs;
return gotVer;
}
/*
* Local Variables:
* mode: c
* c-basic-offset: 4
* fill-column: 78
* End:
*/