Tcl Source Code

Artifact [3dcac7309b]
Login

Artifact 3dcac7309bdf50e4da6307f5ad8f1472251b9765:

Attachment "tcl-8.4.1-cygwin.diff.3" to ticket [679315ffff] added by mumit 2003-02-03 12:27:56.
The current Cygwin support code in Tcl works well for 8.3.x, but the new
FS code made the following changes necessary. The patch basically moves
around some of the existing Cygwin hacks, er support, code; it also uses
Cygwin chdir instead of Windows to make sure the internal state is 
consistent when the user changes to a directory that is Cygwin mountpoint,
not directly available from the underlying OS.

With the excellent new FS code, the only Cygwin specific code should have 
been in SetFsPathFromAny, but we also need to add the same snippet to 
support globbing without patterns (eg., ``glob /home/foo'').

2003-02-02  Mumit Khan  <[email protected]>

	* generic/tclIOUtil.c (SetFsPathFromAny): Add Cygwin specific
	code to convert POSIX filename to native format.
	* generic/tclFileName.c (Tcl_TranslateFileName): And remove 
	from here.
	(TclDoGlob): Adjust.
	* win/tclWinFile.c (TclpObjChdir): Use chdir on Cygwin.

Index: generic/tclFileName.c
===================================================================
RCS file: /home/khan/src/tcltk/CVSROOT/tcltk8.4.1/tcl/generic/tclFileName.c,v
retrieving revision 1.1.1.1
diff -u -3 -p -r1.1.1.1 tclFileName.c
--- generic/tclFileName.c	2003/01/31 22:26:16	1.1.1.1
+++ generic/tclFileName.c	2003/02/02 04:37:23
@@ -1356,31 +1356,12 @@ Tcl_TranslateFileName(interp, name, buff
      */
 
     if (tclPlatform == TCL_PLATFORM_WINDOWS) {
-#if defined(__CYGWIN__) && defined(__WIN32__)
-
-	extern int cygwin_conv_to_win32_path 
-	    _ANSI_ARGS_((CONST char *, char *));
-	char winbuf[MAX_PATH];
-
-	/*
-	 * In the Cygwin world, call conv_to_win32_path in order to use the
-	 * mount table to translate the file name into something Windows will
-	 * understand.  Take care when converting empty strings!
-	 */
-	if (Tcl_DStringLength(bufferPtr)) {
-	    cygwin_conv_to_win32_path(Tcl_DStringValue(bufferPtr), winbuf);
-	    Tcl_DStringFree(bufferPtr);
-	    Tcl_DStringAppend(bufferPtr, winbuf, -1);
-	}
-#else /* __CYGWIN__ && __WIN32__ */
-
 	register char *p;
 	for (p = Tcl_DStringValue(bufferPtr); *p != '\0'; p++) {
 	    if (*p == '/') {
 		*p = '\\';
 	    }
 	}
-#endif /* __CYGWIN__ && __WIN32__ */
     }
     return Tcl_DStringValue(bufferPtr);
 }
@@ -2336,25 +2317,6 @@ TclDoGlob(interp, separators, headPtr, t
 	     * element.  Add an extra slash if this is a UNC path.
 	     */
 
-#if defined(__CYGWIN__) && defined(__WIN32__)
-	    {
-
-	    extern int cygwin_conv_to_win32_path 
-	    	_ANSI_ARGS_((CONST char *, char *));
-	    char winbuf[MAX_PATH];
-
-	    /*
-	     * In the Cygwin world, call conv_to_win32_path in order to use
-	     * the mount table to translate the file name into something
-	     * Windows will understand.
-	     */
-	    cygwin_conv_to_win32_path(Tcl_DStringValue(headPtr), winbuf);
-	    Tcl_DStringFree(headPtr);
-	    Tcl_DStringAppend(headPtr, winbuf, -1);
-
-	    }
-#endif /* __CYGWIN__ && __WIN32__ */
-
 	    if (*name == ':') {
 		Tcl_DStringAppend(headPtr, ":", 1);
 		if (count > 1) {
@@ -2570,11 +2532,24 @@ TclDoGlob(interp, separators, headPtr, t
 		if (Tcl_DStringLength(headPtr) == 0) {
 		    if (((*name == '\\') && (name[1] == '/' || name[1] == '\\'))
 			    || (*name == '/')) {
-			Tcl_DStringAppend(headPtr, "\\", 1);
+			Tcl_DStringAppend(headPtr, "/", 1);
 		    } else {
 			Tcl_DStringAppend(headPtr, ".", 1);
 		    }
 		}
+#if defined(__CYGWIN__) && defined(__WIN32__)
+		{
+
+		extern int cygwin_conv_to_win32_path 
+		    _ANSI_ARGS_((CONST char *, char *));
+		char winbuf[MAX_PATH+1];
+
+		cygwin_conv_to_win32_path(Tcl_DStringValue(headPtr), winbuf);
+		Tcl_DStringFree(headPtr);
+		Tcl_DStringAppend(headPtr, winbuf, -1);
+
+		}
+#endif /* __CYGWIN__ && __WIN32__ */
 		/* 
 		 * Convert to forward slashes.  This is required to pass
 		 * some Tcl tests.  We should probably remove the conversions
Index: generic/tclIOUtil.c
===================================================================
RCS file: /home/khan/src/tcltk/CVSROOT/tcltk8.4.1/tcl/generic/tclIOUtil.c,v
retrieving revision 1.1.1.1
diff -u -3 -p -r1.1.1.1 tclIOUtil.c
--- generic/tclIOUtil.c	2003/01/31 22:26:18	1.1.1.1
+++ generic/tclIOUtil.c	2003/02/03 00:16:51
@@ -3947,6 +3947,28 @@ SetFsPathFromAny(interp, objPtr)
 	transPtr = Tcl_FSJoinToPath(objPtr,0,NULL);
     }
 
+#if defined(__CYGWIN__) && defined(__WIN32__)
+    {
+
+    extern int cygwin_conv_to_win32_path 
+	_ANSI_ARGS_((CONST char *, char *));
+    char winbuf[MAX_PATH+1];
+
+    /*
+     * In the Cygwin world, call conv_to_win32_path in order to use the
+     * mount table to translate the file name into something Windows will
+     * understand.  Take care when converting empty strings!
+     */
+    name = Tcl_GetStringFromObj(transPtr, &len);
+    if (len > 0) {
+	cygwin_conv_to_win32_path(name, winbuf);
+	TclWinNoBackslash(winbuf);
+	Tcl_SetStringObj(transPtr, winbuf, -1);
+    }
+
+    }
+#endif /* __CYGWIN__ && __WIN32__ */
+
     /* 
      * Now we have a translated filename in 'transPtr'.  This will have
      * forward slashes on Windows, and will not contain any ~user
Index: win/tclWinFile.c
===================================================================
RCS file: /home/khan/src/tcltk/CVSROOT/tcltk8.4.1/tcl/win/tclWinFile.c,v
retrieving revision 1.1.1.1
diff -u -3 -p -r1.1.1.1 tclWinFile.c
--- win/tclWinFile.c	2003/01/31 22:27:10	1.1.1.1
+++ win/tclWinFile.c	2003/02/01 01:01:15
@@ -1330,9 +1330,25 @@ TclpObjChdir(pathPtr)
 {
     int result;
     CONST TCHAR *nativePath;
+#ifdef __CYGWIN__
+    extern int cygwin_conv_to_posix_path 
+	_ANSI_ARGS_((CONST char *, char *));
+    char posixPath[MAX_PATH+1];
+    CONST char *path;
+    Tcl_DString ds;
+#endif /* __CYGWIN__ */
 
+
     nativePath = (CONST TCHAR *) Tcl_FSGetNativePath(pathPtr);
+#ifdef __CYGWIN__
+    /* Cygwin chdir only groks POSIX path. */
+    path = Tcl_WinTCharToUtf(nativePath, -1, &ds);
+    cygwin_conv_to_posix_path(path, posixPath);
+    result = (chdir(posixPath) == 0 ? 1 : 0);
+    Tcl_DStringFree(&ds);
+#else /* __CYGWIN__ */
     result = (*tclWinProcs->setCurrentDirectoryProc)(nativePath);
+#endif /* __CYGWIN__ */
 
     if (result == 0) {
 	TclWinConvertError(GetLastError());