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

📄 tclwinfcmd.c

📁 这是leon3处理器的交叉编译链
💻 C
📖 第 1 页 / 共 4 页
字号:
				 * causing error. */{    /*     * The RemoveDirectory API acts differently under Win95/98 and NT     * WRT NULL and "". Avoid passing these values.     */    if (nativePath == NULL || nativePath[0] == '\0') {	Tcl_SetErrno(ENOENT);	goto end;    }    if ((*tclWinProcs->removeDirectoryProc)(nativePath) != FALSE) {	return TCL_OK;    }    TclWinConvertError(GetLastError());    if (Tcl_GetErrno() == EACCES) {	DWORD attr = (*tclWinProcs->getFileAttributesProc)(nativePath);	if (attr != 0xffffffff) {	    if ((attr & FILE_ATTRIBUTE_DIRECTORY) == 0) {		/* 		 * Windows 95 reports calling RemoveDirectory on a file as an 		 * EACCES, not an ENOTDIR.		 */				Tcl_SetErrno(ENOTDIR);		goto end;	    }	    if (attr & FILE_ATTRIBUTE_REPARSE_POINT) {		/* It is a symbolic link -- remove it */		if (TclWinSymLinkDelete(nativePath, 1) != 0) {		    goto end;		}	    }	    	    if (attr & FILE_ATTRIBUTE_READONLY) {		attr &= ~FILE_ATTRIBUTE_READONLY;		if ((*tclWinProcs->setFileAttributesProc)(nativePath, attr) == FALSE) {		    goto end;		}		if ((*tclWinProcs->removeDirectoryProc)(nativePath) != FALSE) {		    return TCL_OK;		}		TclWinConvertError(GetLastError());		(*tclWinProcs->setFileAttributesProc)(nativePath, 			attr | FILE_ATTRIBUTE_READONLY);	    }	    /* 	     * Windows 95 and Win32s report removing a non-empty directory 	     * as EACCES, not EEXIST.  If the directory is not empty,	     * change errno so caller knows what's going on.	     */	    if (TclWinGetPlatformId() != VER_PLATFORM_WIN32_NT) {		CONST char *path, *find;		HANDLE handle;		WIN32_FIND_DATAA data;		Tcl_DString buffer;		int len;		path = (CONST char *) nativePath;		Tcl_DStringInit(&buffer);		len = strlen(path);		find = Tcl_DStringAppend(&buffer, path, len);		if ((len > 0) && (find[len - 1] != '\\')) {		    Tcl_DStringAppend(&buffer, "\\", 1);		}		find = Tcl_DStringAppend(&buffer, "*.*", 3);		handle = FindFirstFileA(find, &data);		if (handle != INVALID_HANDLE_VALUE) {		    while (1) {			if ((strcmp(data.cFileName, ".") != 0)				&& (strcmp(data.cFileName, "..") != 0)) {			    /*			     * Found something in this directory.			     */			    Tcl_SetErrno(EEXIST);			    break;			}			if (FindNextFileA(handle, &data) == FALSE) {			    break;			}		    }		    FindClose(handle);		}		Tcl_DStringFree(&buffer);	    }	}    }    if (Tcl_GetErrno() == ENOTEMPTY) {	/* 	 * The caller depends on EEXIST to signify that the directory is	 * not empty, not ENOTEMPTY. 	 */	Tcl_SetErrno(EEXIST);    }    if ((ignoreError != 0) && (Tcl_GetErrno() == EEXIST)) {	/* 	 * If we're being recursive, this error may actually	 * be ok, so we don't want to initialise the errorPtr	 * yet.	 */	return TCL_ERROR;    }    end:    if (errorPtr != NULL) {	Tcl_WinTCharToUtf(nativePath, -1, errorPtr);    }    return TCL_ERROR;}static intDoRemoveDirectory(    Tcl_DString *pathPtr,	/* Pathname of directory to be removed				 * (native). */    int recursive,		/* If non-zero, removes directories that				 * are nonempty.  Otherwise, will only remove				 * empty directories. */    Tcl_DString *errorPtr)	/* If non-NULL, uninitialized or free				 * DString filled with UTF-8 name of file				 * causing error. */{    int res = DoRemoveJustDirectory(Tcl_DStringValue(pathPtr), recursive, 				    errorPtr);        if ((res == TCL_ERROR) && (recursive != 0) && (Tcl_GetErrno() == EEXIST)) {	/*	 * The directory is nonempty, but the recursive flag has been	 * specified, so we recursively remove all the files in the directory.	 */	return TraverseWinTree(TraversalDelete, pathPtr, NULL, errorPtr);    } else {	return res;    }}/* *--------------------------------------------------------------------------- * * TraverseWinTree -- * *      Traverse directory tree specified by sourcePtr, calling the function  *	traverseProc for each file and directory encountered.  If destPtr  *	is non-null, each of name in the sourcePtr directory is appended to  *	the directory specified by destPtr and passed as the second argument  *	to traverseProc() . * * Results: *      Standard Tcl result. * * Side effects: *      None caused by TraverseWinTree, however the user specified  *	traverseProc() may change state.  If an error occurs, the error will *      be returned immediately, and remaining files will not be processed. * *--------------------------------------------------------------------------- */static int TraverseWinTree(    TraversalProc *traverseProc,/* Function to call for every file and				 * directory in source hierarchy. */    Tcl_DString *sourcePtr,	/* Pathname of source directory to be				 * traversed (native). */    Tcl_DString *targetPtr,	/* Pathname of directory to traverse in				 * parallel with source directory (native),				 * may be NULL. */    Tcl_DString *errorPtr)	/* If non-NULL, uninitialized or free				 * DString filled with UTF-8 name of file				 * causing error. */{    DWORD sourceAttr;    TCHAR *nativeSource, *nativeTarget, *nativeErrfile;    int result, found, sourceLen, targetLen, oldSourceLen, oldTargetLen;    HANDLE handle;    WIN32_FIND_DATAT data;    nativeErrfile = NULL;    result = TCL_OK;    oldTargetLen = 0;		/* lint. */    nativeSource = (TCHAR *) Tcl_DStringValue(sourcePtr);    nativeTarget = (TCHAR *) (targetPtr == NULL ? NULL : Tcl_DStringValue(targetPtr));        oldSourceLen = Tcl_DStringLength(sourcePtr);    sourceAttr = (*tclWinProcs->getFileAttributesProc)(nativeSource);    if (sourceAttr == 0xffffffff) {	nativeErrfile = nativeSource;	goto end;    }    if ((sourceAttr & FILE_ATTRIBUTE_DIRECTORY) == 0) {	/*	 * Process the regular file	 */	return (*traverseProc)(nativeSource, nativeTarget, DOTREE_F, errorPtr);    }    if (tclWinProcs->useWide) {	Tcl_DStringAppend(sourcePtr, (char *) L"\\*.*", 4 * sizeof(WCHAR) + 1);	Tcl_DStringSetLength(sourcePtr, Tcl_DStringLength(sourcePtr) - 1);    } else {	Tcl_DStringAppend(sourcePtr, "\\*.*", 4);    }    nativeSource = (TCHAR *) Tcl_DStringValue(sourcePtr);    handle = (*tclWinProcs->findFirstFileProc)(nativeSource, &data);    if (handle == INVALID_HANDLE_VALUE) {      	/* 	 * Can't read directory	 */	TclWinConvertError(GetLastError());	nativeErrfile = nativeSource;	goto end;    }    nativeSource[oldSourceLen + 1] = '\0';    Tcl_DStringSetLength(sourcePtr, oldSourceLen);    result = (*traverseProc)(nativeSource, nativeTarget, DOTREE_PRED, errorPtr);    if (result != TCL_OK) {	FindClose(handle);	return result;    }    sourceLen = oldSourceLen;    if (tclWinProcs->useWide) {	sourceLen += sizeof(WCHAR);	Tcl_DStringAppend(sourcePtr, (char *) L"\\", sizeof(WCHAR) + 1);	Tcl_DStringSetLength(sourcePtr, sourceLen);    } else {	sourceLen += 1;	Tcl_DStringAppend(sourcePtr, "\\", 1);    }    if (targetPtr != NULL) {	oldTargetLen = Tcl_DStringLength(targetPtr);	targetLen = oldTargetLen;	if (tclWinProcs->useWide) {	    targetLen += sizeof(WCHAR);	    Tcl_DStringAppend(targetPtr, (char *) L"\\", sizeof(WCHAR) + 1);	    Tcl_DStringSetLength(targetPtr, targetLen);	} else {	    targetLen += 1;	    Tcl_DStringAppend(targetPtr, "\\", 1);	}    }    found = 1;    for ( ; found; found = (*tclWinProcs->findNextFileProc)(handle, &data)) {	TCHAR *nativeName;	int len;	if (tclWinProcs->useWide) {	    WCHAR *wp;	    wp = data.w.cFileName;	    if (*wp == '.') {		wp++;		if (*wp == '.') {		    wp++;		}		if (*wp == '\0') {		    continue;		}	    }	    nativeName = (TCHAR *) data.w.cFileName;	    len = Tcl_UniCharLen(data.w.cFileName) * sizeof(WCHAR);	} else {	    if ((strcmp(data.a.cFileName, ".") == 0) 		    || (strcmp(data.a.cFileName, "..") == 0)) {		continue;	    }	    nativeName = (TCHAR *) data.a.cFileName;	    len = strlen(data.a.cFileName);	}	/* 	 * Append name after slash, and recurse on the file. 	 */	Tcl_DStringAppend(sourcePtr, (char *) nativeName, len + 1);	Tcl_DStringSetLength(sourcePtr, Tcl_DStringLength(sourcePtr) - 1);	if (targetPtr != NULL) {	    Tcl_DStringAppend(targetPtr, (char *) nativeName, len + 1);	    Tcl_DStringSetLength(targetPtr, Tcl_DStringLength(targetPtr) - 1);	}	result = TraverseWinTree(traverseProc, sourcePtr, targetPtr, 		errorPtr);	if (result != TCL_OK) {	    break;	}	/*	 * Remove name after slash.	 */	Tcl_DStringSetLength(sourcePtr, sourceLen);	if (targetPtr != NULL) {	    Tcl_DStringSetLength(targetPtr, targetLen);	}    }    FindClose(handle);    /*     * Strip off the trailing slash we added     */    Tcl_DStringSetLength(sourcePtr, oldSourceLen + 1);    Tcl_DStringSetLength(sourcePtr, oldSourceLen);    if (targetPtr != NULL) {	Tcl_DStringSetLength(targetPtr, oldTargetLen + 1);	Tcl_DStringSetLength(targetPtr, oldTargetLen);    }    if (result == TCL_OK) {	/*	 * Call traverseProc() on a directory after visiting all the	 * files in that directory.	 */	result = (*traverseProc)(Tcl_DStringValue(sourcePtr), 			(targetPtr == NULL ? NULL : Tcl_DStringValue(targetPtr)), 			DOTREE_POSTD, errorPtr);    }    end:    if (nativeErrfile != NULL) {	TclWinConvertError(GetLastError());	if (errorPtr != NULL) {	    Tcl_WinTCharToUtf(nativeErrfile, -1, errorPtr);	}	result = TCL_ERROR;    }	        return result;}/* *---------------------------------------------------------------------- * * TraversalCopy * *      Called from TraverseUnixTree in order to execute a recursive *      copy of a directory. * * Results: *      Standard Tcl result. * * Side effects: *      Depending on the value of type, src may be copied to dst. *       *---------------------------------------------------------------------- */static int TraversalCopy(    CONST TCHAR *nativeSrc,	/* Source pathname to copy. */    CONST TCHAR *nativeDst,	/* Destination pathname of copy. */    int type,			/* Reason for call - see TraverseWinTree() */    Tcl_DString *errorPtr)	/* If non-NULL, initialized DString filled				 * with UTF-8 name of file causing error. */{    switch (type) {	case DOTREE_F: {	    if (DoCopyFile(nativeSrc, nativeDst) == TCL_OK) {		return TCL_OK;	    }	    break;	}	case DOTREE_PRED: {	    if (DoCreateDirectory(nativeDst) == TCL_OK) {		DWORD attr = (*tclWinProcs->getFileAttributesProc)(nativeSrc);		if ((*tclWinProcs->setFileAttributesProc)(nativeDst, attr) != FALSE) {		    return TCL_OK;		}		TclWinConvertError(GetLastError());	    }	    break;	}        case DOTREE_POSTD: {	    return TCL_OK;	}    }    /*     * There shouldn't be a problem with src, because we already     * checked it to get here.     */    if (errorPtr != NULL) {	Tcl_WinTCharToUtf(nativeDst, -1, errorPtr);    }    return TCL_ERROR;}/* *---------------------------------------------------------------------- * * TraversalDelete -- * *      Called by procedure TraverseWinTree for every file and *      directory that it encounters in a directory hierarchy. This *      procedure unlinks files, and removes directories after all the *      containing files have been processed. * * Results: *      Standard Tcl result. * * Side effects: *      Files or directory specified by src will be deleted. If an *      error occurs, the windows error is converted to a Posix error *      and errno is set accordingly. * *---------------------------------------------------------------------- */static intTraversalDelete(     CONST TCHAR *nativeSrc,	/* Source pathname to delete. */    CONST TCHAR *dstPtr,	/* Not used. */    int type,			/* Reason for call - see TraverseWinTree() */    Tcl_DString *errorPtr)	/* If non-NULL, initialized DString filled				 * with UTF-8 name of file causing error. */{    switch (type) {	case DOTREE_F: {	    if (TclpDeleteFile(nativeSrc) == TCL_OK) {		return TCL_OK;	    }	    break;	}	case DOTREE_PRED: {	    return TCL_OK;	}	case DOTREE_POSTD: {	    if (DoRemoveJustDirectory(nativeSrc, 0, NULL) == TCL_OK) {		return TCL_OK;	    }	    break;	}    }    if (errorPtr != NULL) {	Tcl_WinTCharToUtf(nativeSrc, -1, errorPtr);    }    return TCL_ERROR;}/* *---------------------------------------------------------------------- * * StatError -- * *	Sets the object result with the appropriate error. * * Results: *      None. * * Side effects: *      The interp's object result is set with an error message *	based on the objIndex, fileName and errno. * *---------------------------------------------------------------------- */static voidStatError(

⌨️ 快捷键说明

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