delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2002/05/06/11:15:56

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Date: Mon, 6 May 2002 17:05:56 +0200
From: "Gerrit P. Haase" <freeweb AT nyckelpiga DOT de>
Reply-To: "Gerrit P. Haase" <freeweb AT nyckelpiga DOT de>
Organization: Esse keine toten Tiere
X-Priority: 3 (Normal)
Message-ID: <112356158649.20020506170556@familiehaase.de>
To: cygwin AT cygwin DOT com, "Christopher Murray" <CJM4 AT nrc DOT gov>
Subject: Re: canonpath in perl as it relates to cygwin
In-Reply-To: <scd65601.074@nrcgwia.nrc.gov>
References: <scd65601 DOT 074 AT nrcgwia DOT nrc DOT gov>
MIME-Version: 1.0

Christopher schrieb:

> My question concerns the use of File::Spec->canonpath in perl (for cygwin).
> I did a search of the relevant mailing list archives, as well as google
> newsgroups, but did not seem to come across any hits that seem to discuss
> this specific issue.

> As it currently stands, canonpath will not strip out multiple occurrences
> of // in file paths when the script is executed from within a cygwin shell.
> The relevant line from /usr/lib/perl5/5.6.1/File/Spec/Unix.pm that strips
> out multiple /'s is

> $path =~ s|/+|/|g unless ($^O eq 'cygwin');

> I assume this regexp substitution is ignored for cygwin because we would
> not want to munge instances where // refers to a network share (something
> regular unix doesn't need to worry about), but is it wise to also ignore
> all multiple forward slashes when they occur in the middle of a path?  Or
> is this simply a non-issue because, for the most part, it seems like most
> (if not all?)  programs don't really seem to care about multiple path
> separators?

> For what it's worth, canonpath in ExtUtils::MM_Unix (and MM_Cygwin), uses

> $path =~ s|(?<=[^/])/+|/|g;

> which seems to do what I expect (leaves // at the front of a path alone,
> but replaces all remaining // with /).  The only weakness I see with this
> is that it will not replace ///shareName/path with //shareName/path, but
> that is a minor matter, at least as it concerns me.

> Any thoughts on this matter would be most appreciated.

Perl 5.8:
=========
sub canonpath {
    my ($self,$path) = @_;
    
    # Handle POSIX-style node names beginning with double slash
    my $node = '';
    if ( $^O =~ m/^(?:qnx|nto)$/ && $path =~ s:^(//[^/]+)(/|\z):/:s ) {
      $node = $1;
    }
    # This used to be
    # $path =~ s|/+|/|g unless($^O eq 'cygwin');
    # but that made tests 29, 30, 35, 46, and 213 (as of #13272) to fail
    # (Mainly because trailing "" directories didn't get stripped).
    # Why would cygwin avoid collapsing multiple slashes into one? --jhi
    $path =~ s|/+|/|g;                             # xx////xx  -> xx/xx
    $path =~ s@(/\.)+(/|\Z(?!\n))@/@g;             # xx/././xx -> xx/xx
    $path =~ s|^(\./)+||s unless $path eq "./";    # ./xx      -> xx
    $path =~ s|^/(\.\./)+|/|s;                     # /../../xx -> xx
    $path =~ s|/\Z(?!\n)|| unless $path eq "/";          # xx/       -> xx
    return "$node$path";
}

Looks more sophisticated?


Gerrit
-- 
=^..^=


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019