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; }