⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tclioutil.c

📁 tcl是工具命令语言
💻 C
📖 第 1 页 / 共 5 页
字号:
            Tcl_AddErrorInfo(interp, string);            Tcl_AddErrorInfo(interp, "\"");        }        return -1;    }        gotRW = 0;    for (i = 0; i < modeArgc; i++) {	flag = modeArgv[i];	c = flag[0];	if ((c == 'R') && (strcmp(flag, "RDONLY") == 0)) {	    mode = (mode & ~RW_MODES) | O_RDONLY;	    gotRW = 1;	} else if ((c == 'W') && (strcmp(flag, "WRONLY") == 0)) {	    mode = (mode & ~RW_MODES) | O_WRONLY;	    gotRW = 1;	} else if ((c == 'R') && (strcmp(flag, "RDWR") == 0)) {	    mode = (mode & ~RW_MODES) | O_RDWR;	    gotRW = 1;	} else if ((c == 'A') && (strcmp(flag, "APPEND") == 0)) {	    mode |= O_APPEND;            *seekFlagPtr = 1;	} else if ((c == 'C') && (strcmp(flag, "CREAT") == 0)) {	    mode |= O_CREAT;	} else if ((c == 'E') && (strcmp(flag, "EXCL") == 0)) {	    mode |= O_EXCL;	} else if ((c == 'N') && (strcmp(flag, "NOCTTY") == 0)) {#ifdef O_NOCTTY	    mode |= O_NOCTTY;#else	    if (interp != (Tcl_Interp *) NULL) {                Tcl_AppendResult(interp, "access mode \"", flag,                        "\" not supported by this system", (char *) NULL);            }            ckfree((char *) modeArgv);	    return -1;#endif	} else if ((c == 'N') && (strcmp(flag, "NONBLOCK") == 0)) {#if defined(O_NDELAY) || defined(O_NONBLOCK)#   ifdef O_NONBLOCK	    mode |= O_NONBLOCK;#   else	    mode |= O_NDELAY;#   endif#else            if (interp != (Tcl_Interp *) NULL) {                Tcl_AppendResult(interp, "access mode \"", flag,                        "\" not supported by this system", (char *) NULL);            }            ckfree((char *) modeArgv);	    return -1;#endif	} else if ((c == 'T') && (strcmp(flag, "TRUNC") == 0)) {	    mode |= O_TRUNC;	} else {            if (interp != (Tcl_Interp *) NULL) {                Tcl_AppendResult(interp, "invalid access mode \"", flag,                        "\": must be RDONLY, WRONLY, RDWR, APPEND, CREAT",                        " EXCL, NOCTTY, NONBLOCK, or TRUNC", (char *) NULL);            }	    ckfree((char *) modeArgv);	    return -1;	}    }    ckfree((char *) modeArgv);    if (!gotRW) {        if (interp != (Tcl_Interp *) NULL) {            Tcl_AppendResult(interp, "access mode must include either",                    " RDONLY, WRONLY, or RDWR", (char *) NULL);        }	return -1;    }    return mode;}/* *---------------------------------------------------------------------- * * Tcl_FSEvalFile -- * *	Read in a file and process the entire file as one gigantic *	Tcl command. * * Results: *	A standard Tcl result, which is either the result of executing *	the file or an error indicating why the file couldn't be read. * * Side effects: *	Depends on the commands in the file.  During the evaluation *	of the contents of the file, iPtr->scriptFile is made to *	point to pathPtr (the old value is cached and replaced when *	this function returns). * *---------------------------------------------------------------------- */intTcl_FSEvalFile(interp, pathPtr)    Tcl_Interp *interp;		/* Interpreter in which to process file. */    Tcl_Obj *pathPtr;		/* Path of file to process.  Tilde-substitution				 * will be performed on this name. */{    int result, length;    Tcl_StatBuf statBuf;    Tcl_Obj *oldScriptFile;    Interp *iPtr;    char *string;    Tcl_Channel chan;    Tcl_Obj *objPtr;    if (Tcl_FSGetTranslatedPath(interp, pathPtr) == NULL) {	return TCL_ERROR;    }    result = TCL_ERROR;    objPtr = Tcl_NewObj();    if (Tcl_FSStat(pathPtr, &statBuf) == -1) {        Tcl_SetErrno(errno);	Tcl_AppendResult(interp, "couldn't read file \"", 		Tcl_GetString(pathPtr),		"\": ", Tcl_PosixError(interp), (char *) NULL);	goto end;    }    chan = Tcl_FSOpenFileChannel(interp, pathPtr, "r", 0644);    if (chan == (Tcl_Channel) NULL) {        Tcl_ResetResult(interp);	Tcl_AppendResult(interp, "couldn't read file \"", 		Tcl_GetString(pathPtr),		"\": ", Tcl_PosixError(interp), (char *) NULL);	goto end;    }    /*     * The eofchar is \32 (^Z).  This is the usual on Windows, but we     * effect this cross-platform to allow for scripted documents.     * [Bug: 2040]     */    Tcl_SetChannelOption(interp, chan, "-eofchar", "\32");    if (Tcl_ReadChars(chan, objPtr, -1, 0) < 0) {        Tcl_Close(interp, chan);	Tcl_AppendResult(interp, "couldn't read file \"", 		Tcl_GetString(pathPtr),		"\": ", Tcl_PosixError(interp), (char *) NULL);	goto end;    }    if (Tcl_Close(interp, chan) != TCL_OK) {        goto end;    }    iPtr = (Interp *) interp;    oldScriptFile = iPtr->scriptFile;    iPtr->scriptFile = pathPtr;    Tcl_IncrRefCount(iPtr->scriptFile);    string = Tcl_GetStringFromObj(objPtr, &length);    result = Tcl_EvalEx(interp, string, length, 0);    /*      * Now we have to be careful; the script may have changed the     * iPtr->scriptFile value, so we must reset it without     * assuming it still points to 'pathPtr'.     */    if (iPtr->scriptFile != NULL) {	Tcl_DecrRefCount(iPtr->scriptFile);    }    iPtr->scriptFile = oldScriptFile;    if (result == TCL_RETURN) {	result = TclUpdateReturnInfo(iPtr);    } else if (result == TCL_ERROR) {	char msg[200 + TCL_INTEGER_SPACE];	/*	 * Record information telling where the error occurred.	 */	sprintf(msg, "\n    (file \"%.150s\" line %d)", Tcl_GetString(pathPtr),		interp->errorLine);	Tcl_AddErrorInfo(interp, msg);    }    end:    Tcl_DecrRefCount(objPtr);    return result;}/* *---------------------------------------------------------------------- * * Tcl_GetErrno -- * *	Gets the current value of the Tcl error code variable. This is *	currently the global variable "errno" but could in the future *	change to something else. * * Results: *	The value of the Tcl error code variable. * * Side effects: *	None. Note that the value of the Tcl error code variable is *	UNDEFINED if a call to Tcl_SetErrno did not precede this call. * *---------------------------------------------------------------------- */intTcl_GetErrno(){    return errno;}/* *---------------------------------------------------------------------- * * Tcl_SetErrno -- * *	Sets the Tcl error code variable to the supplied value. * * Results: *	None. * * Side effects: *	Modifies the value of the Tcl error code variable. * *---------------------------------------------------------------------- */voidTcl_SetErrno(err)    int err;			/* The new value. */{    errno = err;}/* *---------------------------------------------------------------------- * * Tcl_PosixError -- * *	This procedure is typically called after UNIX kernel calls *	return errors.  It stores machine-readable information about *	the error in $errorCode returns an information string for *	the caller's use. * * Results: *	The return value is a human-readable string describing the *	error. * * Side effects: *	The global variable $errorCode is reset. * *---------------------------------------------------------------------- */CONST char *Tcl_PosixError(interp)    Tcl_Interp *interp;		/* Interpreter whose $errorCode variable				 * is to be changed. */{    CONST char *id, *msg;    msg = Tcl_ErrnoMsg(errno);    id = Tcl_ErrnoId();    Tcl_SetErrorCode(interp, "POSIX", id, msg, (char *) NULL);    return msg;}/* *---------------------------------------------------------------------- * * Tcl_FSStat -- * *	This procedure replaces the library version of stat and lsat. *	 *	The appropriate function for the filesystem to which pathPtr *	belongs will be called. * * Results: *      See stat documentation. * * Side effects: *      See stat documentation. * *---------------------------------------------------------------------- */intTcl_FSStat(pathPtr, buf)    Tcl_Obj *pathPtr;		/* Path of file to stat (in current CP). */    Tcl_StatBuf *buf;		/* Filled with results of stat call. */{    Tcl_Filesystem *fsPtr;#ifdef USE_OBSOLETE_FS_HOOKS    struct stat oldStyleStatBuffer;    int retVal = -1;    /*     * Call each of the "stat" function in succession.  A non-return     * value of -1 indicates the particular function has succeeded.     */    Tcl_MutexLock(&obsoleteFsHookMutex);        if (statProcList != NULL) {	StatProc *statProcPtr;	char *path;	Tcl_Obj *transPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr);	if (transPtr == NULL) {	    path = NULL;	} else {	    path = Tcl_GetString(transPtr);	}	statProcPtr = statProcList;	while ((retVal == -1) && (statProcPtr != NULL)) {	    retVal = (*statProcPtr->proc)(path, &oldStyleStatBuffer);	    statProcPtr = statProcPtr->nextPtr;	}    }        Tcl_MutexUnlock(&obsoleteFsHookMutex);    if (retVal != -1) {	/*	 * Note that EOVERFLOW is not a problem here, and these	 * assignments should all be widening (if not identity.)	 */	buf->st_mode = oldStyleStatBuffer.st_mode;	buf->st_ino = oldStyleStatBuffer.st_ino;	buf->st_dev = oldStyleStatBuffer.st_dev;	buf->st_rdev = oldStyleStatBuffer.st_rdev;	buf->st_nlink = oldStyleStatBuffer.st_nlink;	buf->st_uid = oldStyleStatBuffer.st_uid;	buf->st_gid = oldStyleStatBuffer.st_gid;	buf->st_size = Tcl_LongAsWide(oldStyleStatBuffer.st_size);	buf->st_atime = oldStyleStatBuffer.st_atime;	buf->st_mtime = oldStyleStatBuffer.st_mtime;	buf->st_ctime = oldStyleStatBuffer.st_ctime;#ifdef HAVE_ST_BLOCKS	buf->st_blksize = oldStyleStatBuffer.st_blksize;	buf->st_blocks = Tcl_LongAsWide(oldStyleStatBuffer.st_blocks);#endif        return retVal;    }#endif /* USE_OBSOLETE_FS_HOOKS */    fsPtr = Tcl_FSGetFileSystemForPath(pathPtr);    if (fsPtr != NULL) {	Tcl_FSStatProc *proc = fsPtr->statProc;	if (proc != NULL) {	    return (*proc)(pathPtr, buf);	}    }    Tcl_SetErrno(ENOENT);    return -1;}/* *---------------------------------------------------------------------- * * Tcl_FSLstat -- * *	This procedure replaces the library version of lstat. *	The appropriate function for the filesystem to which pathPtr *	belongs will be called.  If no 'lstat' function is listed, *	but a 'stat' function is, then Tcl will fall back on the *	stat function. * * Results: *      See lstat documentation. * * Side effects: *      See lstat documentation. * *---------------------------------------------------------------------- */intTcl_FSLstat(pathPtr, buf)    Tcl_Obj *pathPtr;		/* Path of file to stat (in current CP). */    Tcl_StatBuf *buf;		/* Filled with results of stat call. */{    Tcl_Filesystem *fsPtr = Tcl_FSGetFileSystemForPath(pathPtr);    if (fsPtr != NULL) {	Tcl_FSLstatProc *proc = fsPtr->lstatProc;	if (proc != NULL) {	    return (*proc)(pathPtr, buf);	} else {	    Tcl_FSStatProc *sproc = fsPtr->statProc;	    if (sproc != NULL) {		return (*sproc)(pathPtr, buf);	    }	}    }    Tcl_SetErrno(ENOENT);    return -1;}/* *---------------------------------------------------------------------- * * Tcl_FSAccess -- * *	This procedure replaces the library version of access. *	The appropriate function for the filesystem to which pathPtr *	belongs will be called. * * Results: *      See access documentation. * * Side effects: *      See access documentation. * *---------------------------------------------------------------------- */intTcl_FSAccess(pathPtr, mode)    Tcl_Obj *pathPtr;		/* Path of file to access (in current CP). */    int mode;                   /* Permission setting. */{    Tcl_Filesystem *fsPtr;#ifdef USE_OBSOLETE_FS_HOOKS    int retVal = -1;    /*

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -