public inbox for insight@sourceware.org
 help / color / mirror / Atom feed
* [khan@nanotech.wisc.edu: [patch] Tcl 20030128-3 changes to handle cygwin pathnames]
@ 2003-02-03  5:17 Christopher Faylor
  2003-02-07 20:41 ` Christopher Faylor
  0 siblings, 1 reply; 2+ messages in thread
From: Christopher Faylor @ 2003-02-03  5:17 UTC (permalink / raw)
  To: insight

Do these make sense?

cgf

----- Forwarded message from Mumit Khan <khan@nanotech.wisc.edu> -----

From: Mumit Khan <khan@nanotech.wisc.edu>
To: <cygwin-patches@cygwin.com>
cc: Mumit Khan <khan@nanotech.wisc.edu>
Subject: [patch] Tcl 20030128-3 changes to handle Cygwin pathnames
Date: Sun, 2 Feb 2003 18:26:03 -0600 (CST)

Jeff Hobbs had put in some of my changes that allows Cygwin pathnames
into Tcl 8.3.5, but it doesn't work with the new filesystem code in Tcl
8.4. The new filesystem code does make it a bit easier to support such
"non-native" filenames. Hopefully these will go into Tcl core at some
point.

The 3 cases that the appended patch fixes:

1. Translate Cygwin POSIX path correctly into native form.

   $ /usr/local/tcl8.4.1-redhat/bin/tclsh84 /tmp/foo.tcl

   will do the right thing.

   $ /usr/local/tcl8.4.1-redhat/bin/tclsh84
   % file native /
   C:\cygwin
   %

2. Support globbing with Cygwin POSIX pathnames.

   $ /usr/local/tcl8.4.1-redhat/bin/tclsh84
   % glob /
   C:/cygwin
   % glob /home
   C:/cygwin/home
   % glob "/home/Mumit Khan/.bash*"
   {C:/cygwin/home/Mumit Khan/.bash_profile}

3. Chdir. Use Cygwin's chdir to keep the internal state consistent.

2003-02-02  Mumit Khan  <khan@nanotech.wisc.edu>

	* 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());

----- End forwarded message -----

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [khan@nanotech.wisc.edu: [patch] Tcl 20030128-3 changes to handle cygwin pathnames]
  2003-02-03  5:17 [khan@nanotech.wisc.edu: [patch] Tcl 20030128-3 changes to handle cygwin pathnames] Christopher Faylor
@ 2003-02-07 20:41 ` Christopher Faylor
  0 siblings, 0 replies; 2+ messages in thread
From: Christopher Faylor @ 2003-02-07 20:41 UTC (permalink / raw)
  To: insight

Ok to check this in or are there insight ramifications if I do?

cgf

On Mon, Feb 03, 2003 at 12:18:36AM -0500, Christopher Faylor wrote:
>Do these make sense?
>
>cgf
>
>----- Forwarded message from Mumit Khan <khan@nanotech.wisc.edu> -----
>
>From: Mumit Khan <khan@nanotech.wisc.edu>
>To: <cygwin-patches@cygwin.com>
>cc: Mumit Khan <khan@nanotech.wisc.edu>
>Subject: [patch] Tcl 20030128-3 changes to handle Cygwin pathnames
>Date: Sun, 2 Feb 2003 18:26:03 -0600 (CST)
>
>Jeff Hobbs had put in some of my changes that allows Cygwin pathnames
>into Tcl 8.3.5, but it doesn't work with the new filesystem code in Tcl
>8.4. The new filesystem code does make it a bit easier to support such
>"non-native" filenames. Hopefully these will go into Tcl core at some
>point.
>
>The 3 cases that the appended patch fixes:
>
>1. Translate Cygwin POSIX path correctly into native form.
>
>   $ /usr/local/tcl8.4.1-redhat/bin/tclsh84 /tmp/foo.tcl
>
>   will do the right thing.
>
>   $ /usr/local/tcl8.4.1-redhat/bin/tclsh84
>   % file native /
>   C:\cygwin
>   %
>
>2. Support globbing with Cygwin POSIX pathnames.
>
>   $ /usr/local/tcl8.4.1-redhat/bin/tclsh84
>   % glob /
>   C:/cygwin
>   % glob /home
>   C:/cygwin/home
>   % glob "/home/Mumit Khan/.bash*"
>   {C:/cygwin/home/Mumit Khan/.bash_profile}
>
>3. Chdir. Use Cygwin's chdir to keep the internal state consistent.
>
>2003-02-02  Mumit Khan  <khan@nanotech.wisc.edu>
>
>	* 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());
>
>----- End forwarded message -----

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-02-07 20:41 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-02-03  5:17 [khan@nanotech.wisc.edu: [patch] Tcl 20030128-3 changes to handle cygwin pathnames] Christopher Faylor
2003-02-07 20:41 ` Christopher Faylor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).