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

  1. static int
  2. Critcl_Preload(
  3. ClientData dummy,
  4. Tcl_Interp *interp,
  5. int objc,
  6. Tcl_Obj *objv[])
  7. {
  8. int code;
  9. Tcl_PackageInitProc *proc1, *proc2;
  10. Tcl_LoadHandle loadHandle;
  11. Tcl_FSUnloadFileProc *unLoadProcPtr = NULL;
  12. Tcl_Filesystem *fsPtr;
  13.  
  14. if (objc != 2) {
  15. Tcl_WrongNumArgs(interp, 1, objv, "fileName");
  16. return TCL_ERROR;
  17. }
  18. if (Tcl_FSConvertToPathType(interp, objv[1]) != TCL_OK) {
  19. return TCL_ERROR;
  20. }
  21.  
  22. #ifdef WIN32
  23. // if the filesystem holding the dll doesn't support direct loading
  24. // we need to copy it to a temporary directory and load it from there
  25. // - critcl2::precopy is defined in critcl/lib/app-critcl/runtime.tcl
  26.  
  27. if ((fsPtr = Tcl_FSGetFileSystemForPath(objv[1])) != NULL \
  28. && fsPtr->loadFileProc == NULL) {
  29. objv[0] = Tcl_NewStringObj("::critcl2::precopy", -1);
  30. if ((code = Tcl_EvalObjv(interp, 2, objv, 0)) != TCL_OK) {
  31. Tcl_SetErrorCode(interp, "could not preload ",
  32. Tcl_GetString(objv[1]), 0);
  33. return TCL_ERROR;
  34. }
  35. objv[1] = Tcl_GetObjResult(interp);
  36. Tcl_IncrRefCount(objv[1]);
  37. }
  38. #endif
  39.  
  40. Tcl_MutexLock(&packageMutex);
  41. code = Tcl_FSLoadFile(interp, objv[1], NULL, NULL, NULL, NULL,
  42. &loadHandle, &unLoadProcPtr);
  43. Tcl_MutexUnlock(&packageMutex);
  44. return code;
  45. }