Like Gerd pointed out the trailing slash handing in Posix semantic is
there because a/b/x and a/b/x/ point to the same file. When combined
with naive (but correct in a POSIX setting) application you can end-up
with multiple // in the middle of a path (In posix pathname resolution
multiple /'s are treated exactly like single slashes). This can
happen:

  let mydir = "/a/b/" in
  let myfile = mydir ^ "/myfile" in

now you have myfile = "/a/b//myfile" and (with current ocaml semantic):

  basename (basename myfile) = "a/b"

This can be solved by using a clever Filename.concat (the one in
janestreet's core strips out all the extra '.' and '/' around the
concatenation point) but should really be solved in basename/filename.

Till

On Tue, Dec 27, 2011 at 2:42 PM, Gerd Stolpmann <[email protected]> wrote:
> Hi,
>
> I've done a lot of system programming in the past years, and I cannot
> remember that I had to work around this small incompatibility.
>
> Semantically, the POSIX specs are better, because only directories are
> allowed to have trailing slashes, and if you want to get the basename of
> "path/" you want the name of the directory in >99% of the cases. The
> trailing slash has only the meaning that it is asserted that the path
> refers to a directory. And operations like "basename" better ignore such
> assertions.
>
> There could be a problematic area, though: URLs. A trailing slash means
> here a different resource. I don't know whether anybody is using
> basename in this context.
>
> Gerd
>
> Am Dienstag, den 27.12.2011, 17:29 +0100 schrieb Damien Doligez:
>> Hello,
>>
>> I would like to get some comments from the OCaml community at large about
>> the problem raised in http://caml.inria.fr/mantis/view.php?id=4549
>>
>> In a nutshell, the problem is that our version of basename and dirname
>> are not exactly the same as the Open Group's definition.
>>
>> We can easily implement the standard behaviour for basename and dirname,
>> and it seems desirable, but there is a catch: we will have to change
>> the specification of the standard library slightly.
>>
>> Currently, we specify this:
>>
>>    [concat (dirname name) (basename name)] returns a file name
>>    which is equivalent to [name]. Moreover, after setting the
>>    current directory to [dirname name] (with {!Sys.chdir}),
>>    references to [basename name] (which is a relative file name)
>>    designate the same file as [name] before the call to {!Sys.chdir}.
>>
>> With the Open Group basename and dirname, this becomes false for
>> names that include some trailing slashes, because such slashes
>> are removed by basename.  This means that a name "foo/bar/"
>> becomes "foo/bar" when put through
>>   [concat (dirname name) (basename name)]
>> and opening "foo/bar" may succeed if it is a file, while
>> opening "foo/bar/" would fail.
>>
>> I would like to know if anyone relies on the precise behaviour
>> documented in the standard library, and for everyone else, would
>> you prefer the old behaviour or the new (standard) behaviour?
>>
>> -- Damien
>>
>>
>
>
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa-roc.inria.fr/wws/info/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>


-- 
Caml-list mailing list.  Subscription management and archives:
https://sympa-roc.inria.fr/wws/info/caml-list
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs

Reply via email to