Hugs, Mac OS X 10.1.5, and pathnames

Glynn Clements glynn.clements@virgin.net
Sun, 1 Sep 2002 06:02:28 +0100


Hamilton Richards wrote:

> In OS X, pathnames have two distinct syntaxes. The GUI uses the pre-X 
> syntax, in which a pathname begins with a volume name and the 
> separator is `:', as in
> 
> 	Macintosh HD:Users:ham:Documents:whatever.hs
> 
> In the Darwin (i.e., unix) command-line "underworld", a pathname 
> begins with /Volumes, spaces are escaped with `\', and the separator 
> is `/', as in
> 
> 	/Volumes/Macintosh\ HD/Users/ham/Documents/whatever.hs
> 
> When you drag a file icon onto the command line, Terminal does the 
> right thing-- it converts the pathname from the GUI syntax to the 
> Darwin syntax, and utilities such as more work just as they should.
> 
> Hugs, however, doesn't do so well. For example,
> 
>     Prelude> :l /Volumes/Macintosh\ HD/Users/ham/Documents/whatever.hs
>     Reading file "/Volumes/Macintosh\":
>     ERROR "/Volumes/Macintosh\" - Unable to open file "/Volumes/Macintosh\"
> 
> Quoting the pathname changes the problem, but doesn't cure it:
> 
>     Prelude> :l "/Volumes/Macintosh\ HD/Users/ham/Documents/whatever.hs"
>     ERROR - Missing `\' terminating string literal gap
> 
> Apparently what's confusing Hugs is the `\', because removing it 
> cures the problem:
> 
>     Prelude> :l "/Volumes/Macintosh HD/Users/ham/Documents/whatever.hs"
>     Reading file "/Volumes/Macintosh HD/Users/ham/Documents/whatever.hs":
> 
> Is this problem unavoidable, or is it just an oversight?

The backslash isn't actually part of the pathname; it's added to
prevent the shell from splitting the pathname into multiple arguments. 
The shell converts the backslash-space sequence into a space.

The same issue arises in other languages; e.g. in C,

	const char *name = "/Volumes/Macintosh HD/Users/ham/Documents/whatever.hs";
	FILE *fp = fopen(name, "r");

would work, but including the backslash would break it.

-- 
Glynn Clements <glynn.clements@virgin.net>