X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdumpvar.pl;h=0268cea8bc8f66ddd5e6bb5234ce13d172ed2a52;hb=494f1016b728a37665c950a6d0b4ae238a18cc78;hp=f4a4399a263ddbc681add7197d1c20f98d950070;hpb=13438c89a1ee3257cfa5bd96ccd856285fcebedc;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/dumpvar.pl b/lib/dumpvar.pl index f4a4399..0268cea 100644 --- a/lib/dumpvar.pl +++ b/lib/dumpvar.pl @@ -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 @@ -115,7 +141,7 @@ sub DumpElem { join("' '", @{$v}[0..$tArrayDepth]) . "'$shortmore"; } else { print "$short\n"; - unwrap($_[0],$_[1],$_[2]); + unwrap($_[0],$_[1],$_[2]) if ref $_[0]; } } @@ -176,7 +202,7 @@ sub unwrap { if ( $item_type eq 'HASH' ) { # Hash ref or hash-based object. - @sortKeys = sort keys(%$v) ; + my @sortKeys = sort keys(%$v) ; undef $more ; $tHashDepth = $#sortKeys ; $tHashDepth = $#sortKeys < $hashDepth-1 ? $#sortKeys : $hashDepth-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) {