This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Subject: [PATCH] Suppress diag msg from IPC::Cmd
[perl5.git] / lib / dumpvar.pl
index 5c9100b..0268cea 100644 (file)
@@ -30,7 +30,8 @@ sub main::dumpValue {
   local $^W=0;
   (print "undef\n"), return unless defined $_[0];
   (print &stringify($_[0]), "\n"), return unless ref $_[0];
-  dumpvar::unwrap($_[0],0, $_[1]);
+  push @_, -1 if @_ == 1;
+  dumpvar::unwrap($_[0], 0, $_[1]);
 }
 
 # This one is good for variable names:
@@ -40,7 +41,12 @@ sub unctrl {
        local($v) ; 
 
        return \$_ if ref \$_ eq "GLOB";
-       s/([\001-\037\177])/'^'.pack('c',ord($1)^64)/eg;
+        if (ord('A') == 193) { # EBCDIC.
+           # EBCDIC has no concept of "\cA" or "A" being related
+           # to each other by a linear/boolean mapping.
+       } else {
+           s/([\001-\037\177])/'^'.pack('c',ord($1)^64)/eg;
+       }
        $_;
 }
 
@@ -62,11 +68,19 @@ sub stringify {
            and %overload:: and defined &{'overload::StrVal'};
        
        if ($tick eq 'auto') {
-         if (/[\000-\011\013-\037\177]/) {
-           $tick = '"';
-         }else {
-           $tick = "'";
-         }
+           if (ord('A') == 193) {
+               if (/[\000-\011]/ or /[\013-\024\31-\037\177]/) {
+                   $tick = '"';
+               } else {
+                   $tick = "'";
+               }
+            }  else {
+               if (/[\000-\011\013-\037\177]/) {
+                   $tick = '"';
+               } else {
+                   $tick = "'";
+               }
+           }
        }
        if ($tick eq "'") {
          s/([\'\\])/\\$1/g;
@@ -79,7 +93,11 @@ sub stringify {
        } elsif ($unctrl eq 'quote') {
          s/([\"\\\$\@])/\\$1/g if $tick eq '"';
          s/\033/\\e/g;
-         s/([\000-\037\177])/'\\c'.chr(ord($1)^64)/eg;
+         if (ord('A') == 193) { # EBCDIC.
+             s/([\000-\037\177])/'\\c'.chr(193)/eg; # Unfinished.
+         } else {
+             s/([\000-\037\177])/'\\c'._escaped_ord($1)/eg;
+         }
        }
        $_ = uniescape($_);
        s/([\200-\377])/'\\'.sprintf('%3o',ord($1))/eg if $quoteHighBit;
@@ -88,6 +106,14 @@ sub stringify {
          : $tick . $_ . $tick;
 }
 
+# Ensure a resulting \ is escaped to be \\
+sub _escaped_ord {
+    my $chr = shift;
+    $chr = chr(ord($chr)^64);
+    $chr =~ s{\\}{\\\\}g;
+    return $chr;
+}
+
 sub ShortArray {
   my $tArrayDepth = $#{$_[0]} ; 
   $tArrayDepth = $#{$_[0]} < $arrayDepth-1 ? $#{$_[0]} : $arrayDepth-1 
@@ -273,14 +299,14 @@ sub unwrap {
       if ($globPrint) {
        $s += 3;
        dumpglob($s, "{$$v}", $$v, 1, $m-1);
-      } elsif (defined ($fileno = fileno($v))) {
+      } elsif (defined ($fileno = eval {fileno($v)})) {
        print( (' ' x ($s+3)) .  "FileHandle({$$v}) => fileno($fileno)\n" );
       }
     } elsif (ref \$v eq 'GLOB') {
       # Raw glob (again?)
       if ($globPrint) {
        dumpglob($s, "{$v}", $v, 1, $m-1) if $globPrint;
-      } elsif (defined ($fileno = fileno(\$v))) {
+      } elsif (defined ($fileno = eval {fileno(\$v)})) {
        print( (' ' x $s) .  "FileHandle({$v}) => fileno($fileno)\n" );
       }
     }
@@ -359,7 +385,7 @@ sub dumpglob {
       unwrap(\%entry,3+$off,$m) ;
       print( (' ' x $off) .  ")\n" );
     }
-    if (defined ($fileno = fileno(*entry))) {
+    if (defined ($fileno = eval{fileno(*entry)})) {
       print( (' ' x $off) .  "FileHandle($key) => fileno($fileno)\n" );
     }
     if ($all) {