Hmm, I found a small bug.  A file spec. []FOO wasn't reduced to FOO by
my changes.  The attached patch contains one more line that takes care
of that particular thing.

I'm going through the rest of File::Spec::VMS right now, finding more
things that aren't at all consistent with proper directory mangling on
VMS.  There will be more patches, one for each function I correct...

Cheers,
Richard

-----
Please consider sponsoring my work on free software.
See http://www.free.lp.se/sponsoring.html for details.

-- 
Richard Levitte     | http://richard.levitte.org/ | Tunnlandsv. 52
Levitte Programming | http://www.lp.se/           | S-168 36 Bromma
T: +46-708-26 53 44 |                             | SWEDEN
     "Price, performance, quality...  choose the two you like"
--- /usr/share/perl/5.8.4/File/Spec/VMS.pm      2004-05-11 16:59:22.000000000 +0200
+++ VMS.pm      2004-07-23 01:58:24.000000000 +0200
@@ -155,16 +155,35 @@
       else          { return vmsify($path);  }
     }
     else {
-      $path =~ s/([\[<])000000\./$1/g;                  # [000000.foo     ==> [foo
-      $path =~ s/([^-]+)\.(\]\[|><)?000000([\]\>])/$1$3/g;  # foo.000000] ==> foo]
-      $path =~ s-\]\[--g;  $path =~ s/><//g;            # foo.][bar       ==> foo.bar
-      1 while $path =~ s{([\[<-])\.-}{$1-};             # [.-.-           ==> [--
-      $path =~ s/\.[^\[<\.]+\.-([\]\>])/$1/;            # bar.foo.-]      ==> bar]
-      $path =~ s/([\[<])(-+)/$1 . "\cx" x length($2)/e; # encode leading '-'s
-      $path =~ s/([\[<\.])([^\[<\.\cx]+)\.-\.?/$1/g;    # bar.-.foo       ==> foo
-      $path =~ s/([\[<])(\cx+)/$1 . '-' x length($2)/e; # then decode
-      $path =~ s/^[\[<\]>]{2}//;                        # []foo           ==> foo
-      return $path;
+       $path =~ tr/<>/[]/;                     # < and >       ==> [ and ]
+       $path =~ s/\]\[\./\.\]\[/g;             # ][.           ==> .][
+       $path =~ s/\[000000\.\]\[/\[/g;         # [000000.][    ==> [
+       $path =~ s/\[000000\./\[/g;             # [000000.      ==> [
+       $path =~ s/\.\]\[000000\]/\]/g;         # .][000000]    ==> ]
+       $path =~ s/\.\]\[/\./g;                 # foo.][bar     ==> foo.bar
+       while ($path =~ s/([\[\.])(-+)\.(-+)([\.\]])/$1$2$3$4/) {}
+                                               # That loop does the following
+                                               # with any amount of dashes:
+                                               # .-.-.         ==> .--.
+                                               # [-.-.         ==> [--.
+                                               # .-.-]         ==> .--]
+                                               # [-.-]         ==> [--]
+       while ($path =~ s/([\[\.])[^\]\.]+\.-(-+)([\]\.])/$1$2$3/) {}
+                                               # That loop does the following
+                                               # with any amount (minimum 2)
+                                               # of dashes:
+                                               # .foo.--.      ==> .-.
+                                               # .foo.--]      ==> .-]
+                                               # [foo.--.      ==> [-.
+                                               # [foo.--]      ==> [-]
+                                               #
+                                               # And then, the remaining cases
+       $path =~ s/\.[^\]\.]+\.-\./\./g;        # .foo.-.       ==> .
+       $path =~ s/\[[^\]\.]+\.-\./\[/g;        # [foo.-.       ==> [
+       $path =~ s/\.[^\]\.]+\.-\]/\]/g;        # .foo.-]       ==> ]
+       $path =~ s/\[[^\]\.]+\.-\]/\[\]/g;      # [foo.-]       ==> []
+       $path =~ s/\[\]//;                      # []            ==>
+       return $path;
     }
 }
 

Reply via email to