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

📄 tclwinfcmd.c

📁 这是leon3处理器的交叉编译链
💻 C
📖 第 1 页 / 共 4 页
字号:
    Tcl_Interp *interp,		/* The interp that has the error */    Tcl_Obj *fileName)	        /* The name of the file which caused the 				 * error. */{    TclWinConvertError(GetLastError());    Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), 			   "could not read \"", Tcl_GetString(fileName), 			   "\": ", Tcl_PosixError(interp), 			   (char *) NULL);}/* *---------------------------------------------------------------------- * * GetWinFileAttributes -- * *      Returns a Tcl_Obj containing the value of a file attribute. *	This routine gets the -hidden, -readonly or -system attribute. * * Results: *      Standard Tcl result and a Tcl_Obj in attributePtrPtr. The object *	will have ref count 0. If the return value is not TCL_OK, *	attributePtrPtr is not touched. * * Side effects: *      A new object is allocated if the file is valid. * *---------------------------------------------------------------------- */static intGetWinFileAttributes(    Tcl_Interp *interp,		/* The interp we are using for errors. */    int objIndex,		/* The index of the attribute. */    Tcl_Obj *fileName,	        /* The name of the file. */    Tcl_Obj **attributePtrPtr)	/* A pointer to return the object with. */{    DWORD result;    CONST TCHAR *nativeName;    int attr;        nativeName = Tcl_FSGetNativePath(fileName);    result = (*tclWinProcs->getFileAttributesProc)(nativeName);    if (result == 0xffffffff) {	StatError(interp, fileName);	return TCL_ERROR;    }    attr = (int)(result & attributeArray[objIndex]);    if ((objIndex == WIN_HIDDEN_ATTRIBUTE) && (attr != 0)) {	/* 	 * It is hidden.  However there is a bug on some Windows	 * OSes in which root volumes (drives) formatted as NTFS	 * are declared hidden when they are not (and cannot be).	 * 	 * We test for, and fix that case, here.	 */	int len;	char *str = Tcl_GetStringFromObj(fileName,&len);	if (len < 4) {	    if (len == 0) {		/* 		 * Not sure if this is possible, but we pass it on		 * anyway 		 */	    } else if (len == 1 && (str[0] == '/' || str[0] == '\\')) {		/* Path is pointing to the root volume */		attr = 0;	    } else if ((str[1] == ':') 		       && (len == 2 || (str[2] == '/' || str[2] == '\\'))) {		/* Path is of the form 'x:' or 'x:/' or 'x:\' */		attr = 0;	    }	}    }    *attributePtrPtr = Tcl_NewBooleanObj(attr);    return TCL_OK;}/* *---------------------------------------------------------------------- * * ConvertFileNameFormat -- * *      Returns a Tcl_Obj containing either the long or short version of the  *	file name. * * Results: *      Standard Tcl result and a Tcl_Obj in attributePtrPtr. The object *	will have ref count 0. If the return value is not TCL_OK, *	attributePtrPtr is not touched. *	 *	Warning: if you pass this function a drive name like 'c:' it *	will actually return the current working directory on that *	drive.  To avoid this, make sure the drive name ends in a *	slash, like this 'c:/'. * * Side effects: *      A new object is allocated if the file is valid. * *---------------------------------------------------------------------- */static intConvertFileNameFormat(    Tcl_Interp *interp,		/* The interp we are using for errors. */    int objIndex,		/* The index of the attribute. */    Tcl_Obj *fileName,   	/* The name of the file. */    int longShort,		/* 0 to short name, 1 to long name. */    Tcl_Obj **attributePtrPtr)	/* A pointer to return the object with. */{    int pathc, i;    Tcl_Obj *splitPath;    int result = TCL_OK;    splitPath = Tcl_FSSplitPath(fileName, &pathc);    if (splitPath == NULL || pathc == 0) {	if (interp != NULL) {	    Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), 		"could not read \"", Tcl_GetString(fileName),		"\": no such file or directory", 		(char *) NULL);	}	result = TCL_ERROR;	goto cleanup;    }        for (i = 0; i < pathc; i++) {	Tcl_Obj *elt;	char *pathv;	int pathLen;	Tcl_ListObjIndex(NULL, splitPath, i, &elt);		pathv = Tcl_GetStringFromObj(elt, &pathLen);	if ((pathv[0] == '/')		|| ((pathLen == 3) && (pathv[1] == ':'))		|| (strcmp(pathv, ".") == 0)		|| (strcmp(pathv, "..") == 0)) {	    /*	     * Handle "/", "//machine/export", "c:/", "." or ".." by just	     * copying the string literally.  Uppercase the drive letter,	     * just because it looks better under Windows to do so.	     */	    simple:	    /* Here we are modifying the string representation in place */	    /* I believe this is legal, since this won't affect any 	     * file representation this thing may have. */	    pathv[0] = (char) Tcl_UniCharToUpper(UCHAR(pathv[0]));	} else {	    Tcl_Obj *tempPath;	    Tcl_DString ds;	    Tcl_DString dsTemp;	    TCHAR *nativeName;	    char *tempString;	    int tempLen;	    WIN32_FIND_DATAT data;	    HANDLE handle;	    DWORD attr;	    tempPath = Tcl_FSJoinPath(splitPath, i+1);	    Tcl_IncrRefCount(tempPath);	    /* 	     * We'd like to call Tcl_FSGetNativePath(tempPath)	     * but that is likely to lead to infinite loops 	     */	    Tcl_DStringInit(&ds);	    tempString = Tcl_GetStringFromObj(tempPath,&tempLen);	    nativeName = Tcl_WinUtfToTChar(tempString, tempLen, &ds);	    Tcl_DecrRefCount(tempPath);	    handle = (*tclWinProcs->findFirstFileProc)(nativeName, &data);	    if (handle == INVALID_HANDLE_VALUE) {		/*		 * FindFirstFile() doesn't like root directories.  We 		 * would only get a root directory here if the caller		 * specified "c:" or "c:." and the current directory on the		 * drive was the root directory		 */		attr = (*tclWinProcs->getFileAttributesProc)(nativeName);		if ((attr != 0xFFFFFFFF) && (attr & FILE_ATTRIBUTE_DIRECTORY)) {		    Tcl_DStringFree(&ds);		    goto simple;		}	    }	    if (handle == INVALID_HANDLE_VALUE) {		Tcl_DStringFree(&ds);		if (interp != NULL) {		    StatError(interp, fileName);		}		result = TCL_ERROR;		goto cleanup;	    }	    if (tclWinProcs->useWide) {		nativeName = (TCHAR *) data.w.cAlternateFileName;		if (longShort) {		    if (data.w.cFileName[0] != '\0') {			nativeName = (TCHAR *) data.w.cFileName;		    } 		} else {		    if (data.w.cAlternateFileName[0] == '\0') {			nativeName = (TCHAR *) data.w.cFileName;		    }		}	    } else {		nativeName = (TCHAR *) data.a.cAlternateFileName;		if (longShort) {		    if (data.a.cFileName[0] != '\0') {			nativeName = (TCHAR *) data.a.cFileName;		    } 		} else {		    if (data.a.cAlternateFileName[0] == '\0') {			nativeName = (TCHAR *) data.a.cFileName;		    }		}	    }	    /*	     * Purify reports a extraneous UMR in Tcl_WinTCharToUtf() trying 	     * to dereference nativeName as a Unicode string.  I have proven 	     * to myself that purify is wrong by running the following 	     * example when nativeName == data.w.cAlternateFileName and 	     * noting that purify doesn't complain about the first line,	     * but does complain about the second.	     *	     *	fprintf(stderr, "%d\n", data.w.cAlternateFileName[0]);	     *	fprintf(stderr, "%d\n", ((WCHAR *) nativeName)[0]);	     */	    Tcl_DStringInit(&dsTemp);	    Tcl_WinTCharToUtf(nativeName, -1, &dsTemp);	    /* Deal with issues of tildes being absolute */	    if (Tcl_DStringValue(&dsTemp)[0] == '~') {		tempPath = Tcl_NewStringObj("./",2);		Tcl_AppendToObj(tempPath, Tcl_DStringValue(&dsTemp), 				Tcl_DStringLength(&dsTemp));	    } else {		tempPath = Tcl_NewStringObj(Tcl_DStringValue(&dsTemp), 					    Tcl_DStringLength(&dsTemp));	    }	    Tcl_ListObjReplace(NULL, splitPath, i, 1, 1, &tempPath);	    Tcl_DStringFree(&ds);	    Tcl_DStringFree(&dsTemp);	    FindClose(handle);	}    }    *attributePtrPtr = Tcl_FSJoinPath(splitPath, -1);cleanup:    if (splitPath != NULL) {	Tcl_DecrRefCount(splitPath);    }      return result;}/* *---------------------------------------------------------------------- * * GetWinFileLongName -- * *      Returns a Tcl_Obj containing the long version of the file *	name. * * Results: *      Standard Tcl result and a Tcl_Obj in attributePtrPtr. The object *	will have ref count 0. If the return value is not TCL_OK, *	attributePtrPtr is not touched. * * Side effects: *      A new object is allocated if the file is valid. * *---------------------------------------------------------------------- */static intGetWinFileLongName(    Tcl_Interp *interp,		/* The interp we are using for errors. */    int objIndex,		/* The index of the attribute. */    Tcl_Obj *fileName,  	/* The name of the file. */    Tcl_Obj **attributePtrPtr)	/* A pointer to return the object with. */{    return ConvertFileNameFormat(interp, objIndex, fileName, 1, attributePtrPtr);}/* *---------------------------------------------------------------------- * * GetWinFileShortName -- * *      Returns a Tcl_Obj containing the short version of the file *	name. * * Results: *      Standard Tcl result and a Tcl_Obj in attributePtrPtr. The object *	will have ref count 0. If the return value is not TCL_OK, *	attributePtrPtr is not touched. * * Side effects: *      A new object is allocated if the file is valid. * *---------------------------------------------------------------------- */static intGetWinFileShortName(    Tcl_Interp *interp,		/* The interp we are using for errors. */    int objIndex,		/* The index of the attribute. */    Tcl_Obj *fileName,  	/* The name of the file. */    Tcl_Obj **attributePtrPtr)	/* A pointer to return the object with. */{    return ConvertFileNameFormat(interp, objIndex, fileName, 0, attributePtrPtr);}/* *---------------------------------------------------------------------- * * SetWinFileAttributes -- * *	Set the file attributes to the value given by attributePtr. *	This routine sets the -hidden, -readonly, or -system attributes. * * Results: *      Standard TCL error. * * Side effects: *      The file's attribute is set. * *---------------------------------------------------------------------- */static intSetWinFileAttributes(    Tcl_Interp *interp,		/* The interp we are using for errors. */    int objIndex,		/* The index of the attribute. */    Tcl_Obj *fileName,  	/* The name of the file. */    Tcl_Obj *attributePtr)	/* The new value of the attribute. */{    DWORD fileAttributes;    int yesNo;    int result;    CONST TCHAR *nativeName;    nativeName = Tcl_FSGetNativePath(fileName);    fileAttributes = (*tclWinProcs->getFileAttributesProc)(nativeName);    if (fileAttributes == 0xffffffff) {	StatError(interp, fileName);	return TCL_ERROR;    }    result = Tcl_GetBooleanFromObj(interp, attributePtr, &yesNo);    if (result != TCL_OK) {	return result;    }    if (yesNo) {	fileAttributes |= (attributeArray[objIndex]);    } else {	fileAttributes &= ~(attributeArray[objIndex]);    }    if (!(*tclWinProcs->setFileAttributesProc)(nativeName, fileAttributes)) {	StatError(interp, fileName);	return TCL_ERROR;    }    return result;}/* *---------------------------------------------------------------------- * * SetWinFileLongName -- * *	The attribute in question is a readonly attribute and cannot *	be set. * * Results: *      TCL_ERROR * * Side effects: *      The object result is set to a pertinent error message. * *---------------------------------------------------------------------- */static intCannotSetAttribute(    Tcl_Interp *interp,		/* The interp we are using for errors. */    int objIndex,		/* The index of the attribute. */    Tcl_Obj *fileName,	        /* The name of the file. */    Tcl_Obj *attributePtr)	/* The new value of the attribute. */{    Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), 	    "cannot set attribute \"", tclpFileAttrStrings[objIndex],	    "\" for file \"", Tcl_GetString(fileName), 	    "\": attribute is readonly", 	    (char *) NULL);    return TCL_ERROR;}/* *--------------------------------------------------------------------------- * * TclpObjListVolumes -- * *	Lists the currently mounted volumes * * Results: *	The list of volumes. * * Side effects: *	None * *--------------------------------------------------------------------------- */Tcl_Obj*TclpObjListVolumes(void){    Tcl_Obj *resultPtr, *elemPtr;    char buf[40 * 4];		/* There couldn't be more than 30 drives??? */    int i;    char *p;    resultPtr = Tcl_NewObj();    /*     * On Win32s:     * GetLogicalDriveStrings() isn't implemented.     * GetLogicalDrives() returns incorrect information.     */    if (GetLogicalDriveStringsA(sizeof(buf), buf) == 0) {	/*	 * GetVolumeInformation() will detects all drives, but causes	 * chattering on empty floppy drives.  We only do this if 	 * GetLogicalDriveStrings() didn't work.  It has also been reported	 * that on some laptops it takes a while for GetVolumeInformation()	 * to return when pinging an empty floppy drive, another reason to 	 * try to avoid calling it.	 */	buf[1] = ':';	buf[2] = '/';	buf[3] = '\0';	for (i = 0; i < 26; i++) {	    buf[0] = (char) ('a' + i);	    if (GetVolumeInformationA(buf, NULL, 0, NULL, NULL, NULL, NULL, 0)  		    || (GetLastError() == ERROR_NOT_READY)) {		elemPtr = Tcl_NewStringObj(buf, -1);		Tcl_ListObjAppendElement(NULL, resultPtr, elemPtr);	    }	}    } else {	for (p = buf; *p != '\0'; p += 4) {	    p[2] = '/';	    elemPtr = Tcl_NewStringObj(p, -1);	    Tcl_ListObjAppendElement(NULL, resultPtr, elemPtr);	}    }        Tcl_IncrRefCount(resultPtr);    return resultPtr;}

⌨️ 快捷键说明

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