cs. # Switch off our die/warn handlers so we don't wind up in our own # traps. $SIG{__DIE__} = $SIG{__WARN__} = ''; $exception =~ s/\n(?=.)/\n\t/gas; die Carp::longmess("__diagnostics__") =~ s/^__diagnostics__.*?line \d+\.?\n/ "Uncaught exception from user code:\n\t$exception" /re; # up we go; where we stop, nobody knows, but i think we die now # but i'm deeply afraid of the &$olddie guy reraising and us getting # into an indirect recursion loop }; my %exact_duplicate; my %old_diag; my $count; my $wantspace; sub splainthis { return 0 if $TRACEONLY; for (my $tmp = shift) { local $\; local $!; ### &finish_compilation unless %msg; s/(\.\s*)?\n+$//; my $orig = $_; # return unless defined; # get rid of the where-are-we-in-input part s/, <.*?> (?:line|chunk).*$//; # Discard 1st " at line " and all text beyond # but be aware of messages containing " at this-or-that" my $real = 0; my @secs = split( / at / ); return unless @secs; $_ = $secs[0]; for my $i ( 1..$#secs ){ if( $secs[$i] =~ /.+? (?:line|chunk) \d+/ ){ $real = 1; last; } else { $_ .= ' at ' . $secs[$i]; } } # remove parenthesis occurring at the end of some messages s/^\((.*)\)$/$1/; if ($exact_duplicate{$orig}++) { return &transmo; } else { return 0 unless &transmo; } my $short = shorten($orig); if ($old_diag{$_}) { autodescribe(); print THITHER "$short (#$old_diag{$_})\n"; $wantspace = 1; } elsif (!$msg{$_} && $orig =~ /\n./s) { # A multiline message, like "Attempt to reload / # Compilation failed" my $found; for (split /^/, $orig) { splainthis($_) and $found = 1; } return $found; } else { autodescribe(); $old_diag{$_} = ++$count; print THITHER "\n" if $wantspace; $wantspace = 0; print THITHER "$short (#$old_diag{$_})\n"; if ($msg{$_}) { print THITHER $msg{$_}; } else { if (0 and $standalone) { print THITHER " **** Error #$old_diag{$_} ", ($real ? "is" : "appears to be"), " an unknown diagnostic message.\n\n"; } return 0; } } return 1; } } sub autodescribe { if ($VERBOSE and not $count) { print THITHER &{$PRETTY ? \&bold : \&noop}("DESCRIPTION OF DIAGNOSTICS"), "\n$msg{DESCRIPTION}\n"; } } sub unescape { s { E< ( [A-Za-z]+ ) > } { do { exists $HTML_Escapes{$1} ? do { $HTML_Escapes{$1} } : do { warn "Unknown escape: E<$1> in $_"; "E<$1>"; } } }egx; } sub shorten { my $line = $_[0]; if (length($line) > 79 and index($line, "\n") == -1) { my $space_place = rindex($line, ' ', 79); if ($space_place != -1) { substr($line, $space_place, 1) = "\n\t"; } } return $line; } 1 unless $standalone; # or it'll complain about itself __END__ # wish diag dbase were more accessible