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

📄 tclwinfile.c

📁 这是leon3处理器的交叉编译链
💻 C
📖 第 1 页 / 共 5 页
字号:
    Tcl_DStringFree(&ds);#else /* __CYGWIN__ */    result = (*tclWinProcs->setCurrentDirectoryProc)(nativePath);#endif /* __CYGWIN__ */    if (result == 0) {	TclWinConvertError(GetLastError());	return -1;    }    return 0;}#ifdef __CYGWIN__/* *--------------------------------------------------------------------------- * * TclpReadlink -- * *     This function replaces the library version of readlink(). * * Results: *     The result is a pointer to a string specifying the contents *     of the symbolic link given by 'path', or NULL if the symbolic *     link could not be read.  Storage for the result string is *     allocated in bufferPtr; the caller must call Tcl_DStringFree() *     when the result is no longer needed. * * Side effects: *     See readlink() documentation. * *--------------------------------------------------------------------------- */char *TclpReadlink(path, linkPtr)    CONST char *path;          /* Path of file to readlink (UTF-8). */    Tcl_DString *linkPtr;      /* Uninitialized or free DString filled                                * with contents of link (UTF-8). */{    char link[MAXPATHLEN];    int length;    char *native;    Tcl_DString ds;    native = Tcl_UtfToExternalDString(NULL, path, -1, &ds);    length = readlink(native, link, sizeof(link));     /* INTL: Native. */    Tcl_DStringFree(&ds);        if (length < 0) {	return NULL;    }    Tcl_ExternalToUtfDString(NULL, link, length, linkPtr);    return Tcl_DStringValue(linkPtr);}#endif /* __CYGWIN__ *//* *---------------------------------------------------------------------- * * TclpGetCwd -- * *	This function replaces the library version of getcwd(). * * Results: *	The result is a pointer to a string specifying the current *	directory, or NULL if the current directory could not be *	determined.  If NULL is returned, an error message is left in the *	interp's result.  Storage for the result string is allocated in *	bufferPtr; the caller must call Tcl_DStringFree() when the result *	is no longer needed. * * Side effects: *	None. * *---------------------------------------------------------------------- */CONST char *TclpGetCwd(interp, bufferPtr)    Tcl_Interp *interp;		/* If non-NULL, used for error reporting. */    Tcl_DString *bufferPtr;	/* Uninitialized or free DString filled				 * with name of current directory. */{    WCHAR buffer[MAX_PATH];    char *p;    if ((*tclWinProcs->getCurrentDirectoryProc)(MAX_PATH, buffer) == 0) {	TclWinConvertError(GetLastError());	if (interp != NULL) {	    Tcl_AppendResult(interp,		    "error getting working directory name: ",		    Tcl_PosixError(interp), (char *) NULL);	}	return NULL;    }    /*     * Watch for the weird Windows c:\\UNC syntax.     */    if (tclWinProcs->useWide) {	WCHAR *native;	native = (WCHAR *) buffer;	if ((native[0] != '\0') && (native[1] == ':') 		&& (native[2] == '\\') && (native[3] == '\\')) {	    native += 2;	}	Tcl_WinTCharToUtf((TCHAR *) native, -1, bufferPtr);    } else {	char *native;	native = (char *) buffer;	if ((native[0] != '\0') && (native[1] == ':') 		&& (native[2] == '\\') && (native[3] == '\\')) {	    native += 2;	}	Tcl_WinTCharToUtf((TCHAR *) native, -1, bufferPtr);    }    /*     * Convert to forward slashes for easier use in scripts.     */	          for (p = Tcl_DStringValue(bufferPtr); *p != '\0'; p++) {	if (*p == '\\') {	    *p = '/';	}    }    return Tcl_DStringValue(bufferPtr);}int TclpObjStat(pathPtr, statPtr)    Tcl_Obj *pathPtr;          /* Path of file to stat */    Tcl_StatBuf *statPtr;      /* Filled with results of stat call. */{#ifdef OLD_API    Tcl_Obj *transPtr;    /*     * Eliminate file names containing wildcard characters, or subsequent      * call to FindFirstFile() will expand them, matching some other file.     */    transPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr);    if (transPtr == NULL || (strpbrk(Tcl_GetString(transPtr), "?*") != NULL)) {	Tcl_SetErrno(ENOENT);	return -1;    }#endif        /*     * Ensure correct file sizes by forcing the OS to write any     * pending data to disk. This is done only for channels which are     * dirty, i.e. have been written to since the last flush here.     */    TclWinFlushDirtyChannels ();    return NativeStat((CONST TCHAR*) Tcl_FSGetNativePath(pathPtr), statPtr, 0);}/* *---------------------------------------------------------------------- * * NativeStat -- * *	This function replaces the library version of stat(), fixing  *	the following bugs: * *	1. stat("c:") returns an error. *	2. Borland stat() return time in GMT instead of localtime. *	3. stat("\\server\mount") would return error. *	4. Accepts slashes or backslashes. *	5. st_dev and st_rdev were wrong for UNC paths. * * Results: *	See stat documentation. * * Side effects: *	See stat documentation. * *---------------------------------------------------------------------- */static int NativeStat(nativePath, statPtr, checkLinks)    CONST TCHAR *nativePath;   /* Path of file to stat */    Tcl_StatBuf *statPtr;      /* Filled with results of stat call. */    int checkLinks;            /* If non-zero, behave like 'lstat' */{    Tcl_DString ds;    DWORD attr;    WCHAR nativeFullPath[MAX_PATH];    TCHAR *nativePart;    CONST char *fullPath;    int dev, mode;        if (tclWinProcs->getFileAttributesExProc == NULL) {        /*          * We don't have the faster attributes proc, so we're         * probably running on Win95         */	WIN32_FIND_DATAT data;	HANDLE handle;	handle = (*tclWinProcs->findFirstFileProc)(nativePath, &data);	if (handle == INVALID_HANDLE_VALUE) {	    /* 	     * FindFirstFile() doesn't work on root directories, so call	     * GetFileAttributes() to see if the specified file exists.	     */	    attr = (*tclWinProcs->getFileAttributesProc)(nativePath);	    if (attr == 0xffffffff) {		Tcl_SetErrno(ENOENT);		return -1;	    }	    /* 	     * Make up some fake information for this file.  It has the 	     * correct file attributes and a time of 0.	     */	    memset(&data, 0, sizeof(data));	    data.a.dwFileAttributes = attr;	} else {	    FindClose(handle);	}    	(*tclWinProcs->getFullPathNameProc)(nativePath, MAX_PATH, nativeFullPath,		&nativePart);	fullPath = Tcl_WinTCharToUtf((TCHAR *) nativeFullPath, -1, &ds);	dev = -1;	if ((fullPath[0] == '\\') && (fullPath[1] == '\\')) {	    CONST char *p;	    DWORD dw;	    CONST TCHAR *nativeVol;	    Tcl_DString volString;	    p = strchr(fullPath + 2, '\\');	    p = strchr(p + 1, '\\');	    if (p == NULL) {		/*		 * Add terminating backslash to fullpath or 		 * GetVolumeInformation() won't work.		 */		fullPath = Tcl_DStringAppend(&ds, "\\", 1);		p = fullPath + Tcl_DStringLength(&ds);	    } else {		p++;	    }	    nativeVol = Tcl_WinUtfToTChar(fullPath, p - fullPath, &volString);	    dw = (DWORD) -1;	    (*tclWinProcs->getVolumeInformationProc)(nativeVol, NULL, 0, &dw,		    NULL, NULL, NULL, 0);	    /*	     * GetFullPathName() turns special devices like "NUL" into	     * "\\.\NUL", but GetVolumeInformation() returns failure for	     * "\\.\NUL".  This will cause "NUL" to get a drive number of	     * -1, which makes about as much sense as anything since the	     * special devices don't live on any drive.	     */	    dev = dw;	    Tcl_DStringFree(&volString);	} else if ((fullPath[0] != '\0') && (fullPath[1] == ':')) {	    dev = Tcl_UniCharToLower(fullPath[0]) - 'a';	}	Tcl_DStringFree(&ds);		attr = data.a.dwFileAttributes;	statPtr->st_size  = ((Tcl_WideInt)data.a.nFileSizeLow) |		(((Tcl_WideInt)data.a.nFileSizeHigh) << 32);	statPtr->st_atime = ToCTime(data.a.ftLastAccessTime);	statPtr->st_mtime = ToCTime(data.a.ftLastWriteTime);	statPtr->st_ctime = ToCTime(data.a.ftCreationTime);    } else {	WIN32_FILE_ATTRIBUTE_DATA data;	if((*tclWinProcs->getFileAttributesExProc)(nativePath,						   GetFileExInfoStandard,						   &data) != TRUE) {	    Tcl_SetErrno(ENOENT);	    return -1;	}    	(*tclWinProcs->getFullPathNameProc)(nativePath, MAX_PATH, 					    nativeFullPath, &nativePart);	fullPath = Tcl_WinTCharToUtf((TCHAR *) nativeFullPath, -1, &ds);	dev = -1;	if ((fullPath[0] == '\\') && (fullPath[1] == '\\')) {	    CONST char *p;	    DWORD dw;	    CONST TCHAR *nativeVol;	    Tcl_DString volString;	    p = strchr(fullPath + 2, '\\');	    p = strchr(p + 1, '\\');	    if (p == NULL) {		/*		 * Add terminating backslash to fullpath or 		 * GetVolumeInformation() won't work.		 */		fullPath = Tcl_DStringAppend(&ds, "\\", 1);		p = fullPath + Tcl_DStringLength(&ds);	    } else {		p++;	    }	    nativeVol = Tcl_WinUtfToTChar(fullPath, p - fullPath, &volString);	    dw = (DWORD) -1;	    (*tclWinProcs->getVolumeInformationProc)(nativeVol, NULL, 0, &dw,		    NULL, NULL, NULL, 0);	    /*	     * GetFullPathName() turns special devices like "NUL" into	     * "\\.\NUL", but GetVolumeInformation() returns failure for	     * "\\.\NUL".  This will cause "NUL" to get a drive number of	     * -1, which makes about as much sense as anything since the	     * special devices don't live on any drive.	     */	    dev = dw;	    Tcl_DStringFree(&volString);	} else if ((fullPath[0] != '\0') && (fullPath[1] == ':')) {	    dev = Tcl_UniCharToLower(fullPath[0]) - 'a';	}	Tcl_DStringFree(&ds);		attr = data.dwFileAttributes;		statPtr->st_size  = ((Tcl_WideInt)data.nFileSizeLow) |		(((Tcl_WideInt)data.nFileSizeHigh) << 32);	statPtr->st_atime = ToCTime(data.ftLastAccessTime);	statPtr->st_mtime = ToCTime(data.ftLastWriteTime);	statPtr->st_ctime = ToCTime(data.ftCreationTime);    }    if (checkLinks && (attr & FILE_ATTRIBUTE_REPARSE_POINT)) {	/* It is a link */	mode = S_IFLNK;    } else {	mode  = (attr & FILE_ATTRIBUTE_DIRECTORY) ? S_IFDIR | S_IEXEC : S_IFREG;    }    mode |= (attr & FILE_ATTRIBUTE_READONLY) ? S_IREAD : S_IREAD | S_IWRITE;    if (NativeIsExec(nativePath)) {	mode |= S_IEXEC;    }        /*     * Propagate the S_IREAD, S_IWRITE, S_IEXEC bits to the group and      * other positions.     */    mode |= (mode & 0x0700) >> 3;    mode |= (mode & 0x0700) >> 6;        statPtr->st_dev	= (dev_t) dev;    statPtr->st_ino	= 0;    statPtr->st_mode	= (unsigned short) mode;    statPtr->st_nlink	= 1;    statPtr->st_uid	= 0;    statPtr->st_gid	= 0;    statPtr->st_rdev	= (dev_t) dev;    return 0;}static time_tToCTime(    FILETIME fileTime)		/* UTC Time to convert to local time_t. */{    FILETIME localFileTime;    SYSTEMTIME systemTime;    struct tm tm;    if (FileTimeToLocalFileTime(&fileTime, &localFileTime) == 0) {	return 0;    }    if (FileTimeToSystemTime(&localFileTime, &systemTime) == 0) {	return 0;    }    tm.tm_sec = systemTime.wSecond;    tm.tm_min = systemTime.wMinute;    tm.tm_hour = systemTime.wHour;    tm.tm_mday = systemTime.wDay;    tm.tm_mon = systemTime.wMonth - 1;    tm.tm_year = systemTime.wYear - 1900;    tm.tm_wday = 0;    tm.tm_yday = 0;    tm.tm_isdst = -1;    return mktime(&tm);}#if 0    /*     * Borland's stat doesn't take into account localtime.     */    if ((result == 0) && (buf->st_mtime != 0)) {	TIME_ZONE_INFORMATION tz;	int time, bias;	time = GetTimeZoneInformation(&tz);	bias = tz.Bias;	if (time == TIME_ZONE_ID_DAYLIGHT) {	    bias += tz.DaylightBias;	}	bias *= 60;	buf->st_atime -= bias;	buf->st_ctime -= bias;	buf->st_mtime -= bias;    }#endif#if 0/* *------------------------------------------------------------------------- * * TclWinResolveShortcut -- * *	Resolve a potential Windows shortcut to get the actual file or  *	directory in question.   * * Results: *	Returns 1 if the shortcut could be resolved, or 0 if there was *	an error or if the filename was not a shortcut. *	If bufferPtr did hold the name of a shortcut, it is modified to *	hold the resolved target of the shortcut instead. * * Side effects: *	Loads and unloads OLE package to determine if filename refers to *	a shortcut. * *------------------------------------------------------------------------- */int

⌨️ 快捷键说明

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