Posted to tcl by stevel at Thu Jan 10 08:55:03 GMT 2008view pretty

static int
Critcl_Preload(
    ClientData dummy,
    Tcl_Interp *interp,
    int objc,
    Tcl_Obj *objv[])
{
    int code;
    Tcl_PackageInitProc *proc1, *proc2;
    Tcl_LoadHandle loadHandle;
    Tcl_FSUnloadFileProc *unLoadProcPtr = NULL;
    Tcl_Filesystem *fsPtr;

    if (objc != 2) {
        Tcl_WrongNumArgs(interp, 1, objv, "fileName");
        return TCL_ERROR;
    }
    if (Tcl_FSConvertToPathType(interp, objv[1]) != TCL_OK) {
        return TCL_ERROR;
    }

#ifdef WIN32
    // if the filesystem holding the dll doesn't support direct loading
    // we need to copy it to a temporary directory and load it from there
    //  - critcl2::precopy is defined in critcl/lib/app-critcl/runtime.tcl

    if ((fsPtr = Tcl_FSGetFileSystemForPath(objv[1])) != NULL \
		&& fsPtr->loadFileProc == NULL) {
	objv[0] = Tcl_NewStringObj("::critcl2::precopy", -1);
	if ((code = Tcl_EvalObjv(interp, 2, objv, 0)) != TCL_OK) {
	    Tcl_SetErrorCode(interp, "could not preload ",
				      Tcl_GetString(objv[1]), 0);
	    return TCL_ERROR;
	}
	objv[1] = Tcl_GetObjResult(interp);
	Tcl_IncrRefCount(objv[1]);
    }
#endif

    Tcl_MutexLock(&packageMutex);
    code = Tcl_FSLoadFile(interp, objv[1], NULL, NULL, NULL, NULL,
				  &loadHandle, &unLoadProcPtr);
    Tcl_MutexUnlock(&packageMutex);
    return code;
}