guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Windows file name separators


From: Eli Zaretskii
Subject: Re: Windows file name separators
Date: Tue, 10 Jun 2014 19:00:58 +0300

> From: address@hidden (Ludovic Courtès)
> Date: Mon, 09 Jun 2014 21:42:36 +0200
> 
> Eli Zaretskii <address@hidden> skribis:
> 
> > 3. load.test fails:
> >
> >      FAIL: load.test: search-path for "foo.scm" yields "dir1/foo.scm"
> >
> >    (The messages are misleading: "yields" should be "should yield".)
> >
> >    The test fails because:
> >
> >     . it compares file names with equal?, which fails when Windows
> >       file names with mixed forward and backslashes are used, and/or
> >       when the files differ but for letter case
> >
> >     . the expected result uses a relative file name of temp-dir, while
> >       search-path returns absolute file names
> >
> >    Fixed by using "/" to create a file name from its parts in load.c:
> >
> > --- libguile/load.c~        2014-02-28 23:01:27 +0200
> > +++ libguile/load.c 2014-06-08 13:27:24 +0300
> > @@ -452,11 +452,15 @@ scm_c_string_has_an_ext (char *str, size
> >    return 0;
> >  }
> >  
> > +#if 0
> >  #ifdef __MINGW32__
> >  #define FILE_NAME_SEPARATOR_STRING "\\"
> >  #else
> >  #define FILE_NAME_SEPARATOR_STRING "/"
> >  #endif
> > +#else
> > +#define FILE_NAME_SEPARATOR_STRING "/"
> > +#endif
> >  
> >  static int
> >  is_file_name_separator (SCM c)
> >
> >    I don't see any reasons to use the backslashes when constructing
> >    Windows file names.  Unless someone can tell why using backslashes
> >    is a good idea, I propose to remove the Windows setting of
> >    FILE_NAME_SEPARATOR_STRING.
> 
> I’m confused: this was added in 4bab7f01 precisely to support MinGW or
> Windows.  Similarly, boot-9.scm has ‘file-name-separator-string’ and
> related stuff.  This was the result of the discussion at
> <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=10474#89>.

Sorry, that's my fault: I didn't explain the problem in enough detail.

There's nothing wrong with the 4bab7f01 commit per se (and you will
see that its only part that I changed is the definition of
FILE_NAME_SEPARATOR_STRING for MinGW).  The problem is not in that
commit, it is elsewhere: in Scheme code, in this case in the test
suite, that compares file names as simple strings.  Such comparisons
fail if the file names differ by the style of directory separators:
one uses forward slashes, the other backslashes, or some mix thereof.

Now, FILE_NAME_SEPARATOR_STRING is used only for constructing file
names from their parts.  It is not used for testing a particular
file-name character for being a directory separator.  Therefore, we
can discard the separate definition of FILE_NAME_SEPARATOR_STRING for
Windows, and use "/" on all platforms.  This makes the problem of
comparing file names easier, and in particular lets Guile pass
load.test.  But it doesn't solve the problem entirely.

To solve this problem completely, we need a function that
canonicalizes a file name wrt directory separators -- converts all
backslashes to forward slashes.  Does Guile have such a function?  If
it does, then comparing the canonicalized file names will work
reliably on Windows.

I hope I made myself clear this time.

Thanks.

P.S. Please CC me on your responses, as I'm not subscribed to the
list, so I need to download the list archives in order to reply.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]