/usr/bin
NameSizeModeActions
aclocal363760755editdlrm
aclocal-1.16363760755editdlrm
addr2line284080755editdlrm
agentxtrap279600755editdlrm
animate154560755editdlrm
ar573280755editdlrm
arch322240755editdlrm
arpaname154720755editdlrm
as7273600755editdlrm
aspell1547440755editdlrm
at60090755editdlrm
atq60110755editdlrm
atrm60130755editdlrm
autoconf147710755editdlrm
autoheader85340755editdlrm
autom4te321810755editdlrm
automake2579810755editdlrm
automake-1.162579810755editdlrm
autoreconf210660755editdlrm
autoscan171240755editdlrm
autoupdate338720755editdlrm
awk7149280755editdlrm
b2sum528320755editdlrm
base32363440755editdlrm
base64363440755editdlrm
basename322400755editdlrm
basenc489760755editdlrm
bash13890240755editdlrm
bashbug-6470790755editdlrm
batch1400755editdlrm
bison5066320755editdlrm
bunzip2403920755editdlrm
bzcat403920755editdlrm
bzcmp21440755editdlrm
bzdiff21440755editdlrm
bzgrep20580755editdlrm
bzip2403920755editdlrm
bzip2recover155920755editdlrm
bzless12630755editdlrm
bzmore12630755editdlrm
c++10972240755editdlrm
c++filt278400755editdlrm
c892280755editdlrm
c992190755editdlrm
cagefs_enter.proxied60290755editdlrm
cal530640755editdlrm
captoinfo898960755editdlrm
cat363120755editdlrm
catchsegv32890755editdlrm
cc10931280755editdlrm
chcon614880755editdlrm
chgrp573200755editdlrm
chmod573040755editdlrm
chown614320755editdlrm
chrt279600755editdlrm
cksum321360755editdlrm
cldetect112220755editdlrm
clear155120755editdlrm
cloudlinux-awp-user18180755editdlrm
clwpos-user18180755editdlrm
cmp410960755editdlrm
col237920755editdlrm
colcrt155520755editdlrm
colrm155280755editdlrm
column361840755editdlrm
comm364080755editdlrm
compare154560755editdlrm
composite154560755editdlrm
conjure154640755editdlrm
convert154640755editdlrm
cp1444000755editdlrm
cpan85710755editdlrm
cpp10972240755editdlrm
crontab58260755editdlrm
crontab.cagefs414400755editdlrm
csplit1112720755editdlrm
curl2544560755editdlrm
cut446560755editdlrm
cyrusbdb2current16518240755editdlrm
date1063360755editdlrm
dbiprof62060755editdlrm
dd695760755editdlrm
delv455440755editdlrm
df824640755editdlrm
diff1993680755editdlrm
diff3535600755editdlrm
dig1398720755editdlrm
dir1407520755editdlrm
dircolors405680755editdlrm
dirname279520755editdlrm
display154560755editdlrm
dnstap-read237440755editdlrm
du1528480755editdlrm
echo279440755editdlrm
ed537680755editdlrm
egrep320755editdlrm
enc2xs416630755editdlrm
enchant242960755editdlrm
enchant-lsmod161840755editdlrm
env450880755editdlrm
eps2eps6430755editdlrm
eqn1940640755editdlrm
ex14522560755editdlrm
expand404880755editdlrm
expr1110400755editdlrm
factor735920755editdlrm
false279360755editdlrm
fc-cache1390755editdlrm
fc-cache-64237280755editdlrm
fc-cat196160755editdlrm
fc-conflist154960755editdlrm
fc-list154960755editdlrm
fc-match154960755editdlrm
fc-pattern155040755editdlrm
fc-query154960755editdlrm
fc-scan155040755editdlrm
fc-validate155040755editdlrm
fgrep320755editdlrm
file282880755editdlrm
find2917920755editdlrm
flex4225440755editdlrm
flex++4225440755editdlrm
flock239280755editdlrm
fmt405280755editdlrm
fold404560755editdlrm
free239200755editdlrm
freetype-config44230755editdlrm
funzip320000755editdlrm
g++10972240755editdlrm
gawk7149280755editdlrm
gcc10931280755editdlrm
gcc-ar283360755editdlrm
gcc-nm283120755editdlrm
gcc-ranlib283360755editdlrm
gcov4885760755editdlrm
gcov-dump2987680755editdlrm
gcov-tool3281600755editdlrm
gencat281040755editdlrm
geoiplookup162480755editdlrm
geoiplookup6162000755editdlrm
geqn1940640755editdlrm
GET162000755editdlrm
getconf360800755editdlrm
getent367200755editdlrm
getopt238240755editdlrm
ghostscript154880755editdlrm
git43973520755editdlrm
git-receive-pack43973520755editdlrm
git-shell8269600755editdlrm
git-upload-archive43973520755editdlrm
git-upload-pack43973520755editdlrm
gm160480755editdlrm
gmake2557920755editdlrm
gneqn9160755editdlrm
gnroff32850755editdlrm
gpg11236240755editdlrm
gpg-agent3504880755editdlrm
gpg-error369680755editdlrm
gpgsplit281600755editdlrm
gpgv3025200755editdlrm
gpic2065600755editdlrm
gprof1039200755editdlrm
grep1582000755editdlrm
groff990880755editdlrm
grops1712720755editdlrm
grotty1251280755editdlrm
groups363280755editdlrm
gs154880755editdlrm
gsnd2810755editdlrm
gsoelim-0editdlrm
gtar5348240755editdlrm
gtbl1340000755editdlrm
gtroff7496400755editdlrm
gunzip23500755editdlrm
gzexe64840755editdlrm
gzip910880755editdlrm
h2ph293820755editdlrm
h2xs609310755editdlrm
head405600755editdlrm
hexdump526400755editdlrm
host1111760755editdlrm
hostid322240755editdlrm
hostname244080755editdlrm
hunspell1051360755editdlrm
iconv656240755editdlrm
icu-config2050755editdlrm
icu-config-64221890755editdlrm
icuinfo158640755editdlrm
id404720755editdlrm
identify154640755editdlrm
idn366640755editdlrm
ifnames41280755editdlrm
import154560755editdlrm
infocmp652080755editdlrm
infotocap898960755editdlrm
install1526560755editdlrm
instmodsh41940755editdlrm
ionice155760755editdlrm
ipcrm196880755editdlrm
ipcs402800755editdlrm
isosize155120755editdlrm
ispell9920755editdlrm
join529280755editdlrm
kill320320755editdlrm
ld17916000755editdlrm
ld.bfd17916000755editdlrm
ldd54460755editdlrm
less2024400755editdlrm
lessecho155360755editdlrm
lesskey252000755editdlrm
lesspipe.sh35800755editdlrm
lex4225440755editdlrm
libnetcfg157750755editdlrm
libtool3678020755editdlrm
libtoolize1292000755editdlrm
link322320755editdlrm
ln572880755editdlrm
locale604960755editdlrm
localedef3215840755editdlrm
logger368400755editdlrm
login445040755editdlrm
logname322240755editdlrm
look196320755editdlrm
ls1407440755editdlrm
lto-dump278825680755editdlrm
m42461680755editdlrm
Mail-0editdlrm
mail-0editdlrm
mailx-0editdlrm
make2557920755editdlrm
make-dummy-cert6140755editdlrm
mariadb52462000755editdlrm
mariadb-access1119610755editdlrm
mariadb-admin50133920755editdlrm
mariadb-binlog53032320755editdlrm
mariadb-check50104240755editdlrm
mariadb-conv47310240755editdlrm
mariadb-convert-table-format42200755editdlrm
mariadb-dump51070000755editdlrm
mariadb-dumpslow82420755editdlrm
mariadb-embedded243730960755editdlrm
mariadb-find-rows32900755editdlrm
mariadb-hotcopy353590755editdlrm
mariadb-import50052560755editdlrm
mariadb-plugin47057840755editdlrm
mariadb-secure-installation138030755editdlrm
mariadb-setpermission179770755editdlrm
mariadb-show50036560755editdlrm
mariadb-slap50232000755editdlrm
mariadb-tzinfo-to-sql47092080755editdlrm
mariadb-waitpid46965040755editdlrm
mcookie279600755editdlrm
md5sum403920755editdlrm
mesg155040755editdlrm
mkdir697600755editdlrm
mkfifo405920755editdlrm
mknod447280755editdlrm
mktemp405680755editdlrm
mogrify154640755editdlrm
montage154640755editdlrm
more444640755editdlrm
msql2mysql14500755editdlrm
mv1443280755editdlrm
mysql52462000755editdlrm
mysqlaccess1119610755editdlrm
mysqladmin50133920755editdlrm
mysqlbinlog53032320755editdlrm
mysqlcheck50104240755editdlrm
mysqldump51070000755editdlrm
mysqlimport50052560755editdlrm
mysqlshow50036560755editdlrm
mysql_config46080755editdlrm
mysql_find_rows32900755editdlrm
mysql_waitpid46965040755editdlrm
mytop737570755editdlrm
my_print_defaults46970080755editdlrm
namei237840755editdlrm
nano3545040755editdlrm
neqn9160755editdlrm
net-snmp-create-v3-user33710755editdlrm
nice363360755editdlrm
nl1029200755editdlrm
nm457920755editdlrm
nohup362480755editdlrm
nproc363520755editdlrm
nroff32850755editdlrm
nslookup1152240755editdlrm
nsupdate735280755editdlrm
numfmt569680755editdlrm
objcopy1898160755editdlrm
objdump4230000755editdlrm
od654080755editdlrm
openssl11224720755editdlrm
pango-list195680755editdlrm
pango-segmentation195840755editdlrm
pango-view616160755editdlrm
passwd60170755editdlrm
paste362400755editdlrm
patch1996960755editdlrm
pathchk363280755editdlrm
pdf2dsc7010755editdlrm
pdf2ps9130755editdlrm
perl154880755editdlrm
perl5.32.1154880755editdlrm
perlbug448630755editdlrm
perldoc1180755editdlrm
perlivp108130755editdlrm
perlml148400755editdlrm
perlthanks448630755editdlrm
pgrep321760755editdlrm
php9370755editdlrm
pic2065600755editdlrm
piconv82710755editdlrm
ping914720755editdlrm
pinky362640755editdlrm
pkg-config3350755editdlrm
pkill321760755editdlrm
pl2pm45330755editdlrm
pmap362400755editdlrm
pod2html41340755editdlrm
pod2man150340755editdlrm
pod2text108030755editdlrm
pod2usage41070755editdlrm
podchecker36580755editdlrm
post-grohtml2045520755editdlrm
pr738320755editdlrm
pre-grohtml951520755editdlrm
precat56600755editdlrm
preunzip56600755editdlrm
prezip56600755editdlrm
prezip-bin160640755editdlrm
printenv320400755editdlrm
printf528160755editdlrm
prove135620755editdlrm
ps1445360755editdlrm
ps2ascii6350755editdlrm
ps2epsi12680755editdlrm
ps2pdf2760755editdlrm
ps2pdf122190755editdlrm
ps2pdf132190755editdlrm
ps2pdf142190755editdlrm
ps2pdfwr10820755editdlrm
ps2ps6510755editdlrm
ps2ps26730755editdlrm
ptx1319120755editdlrm
pwd363760755editdlrm
pwdx156480755editdlrm
pydoc780755editdlrm
pydoc3780755editdlrm
pydoc3.9780755editdlrm
ranlib573360755editdlrm
readelf6832960755editdlrm
readlink404560755editdlrm
realpath405360755editdlrm
recode326960755editdlrm
red920755editdlrm
rename237840755editdlrm
renew-dummy-cert7290755editdlrm
renice155280755editdlrm
replace46790320755editdlrm
reset279920755editdlrm
rev155200755editdlrm
rm614320755editdlrm
rmdir444640755editdlrm
rnano3545040755editdlrm
run-with-aspell890755editdlrm
runcon363120755editdlrm
rvi14522560755editdlrm
rview14522560755editdlrm
scalar8769680755editdlrm
scl404960755editdlrm
scl_enabled2620755editdlrm
scl_source19290755editdlrm
scp1361040755editdlrm
script528160755editdlrm
sdiff452640755editdlrm
sed1155440755editdlrm
selectorctl82760755editdlrm
seq487360755editdlrm
setsid155120755editdlrm
setterm361760755editdlrm
sftp1608400755editdlrm
sh13890240755editdlrm
sha1sum403920755editdlrm
sha224sum403920755editdlrm
sha256sum403920755editdlrm
sha384sum403920755editdlrm
sha512sum403920755editdlrm
shred529200755editdlrm
shuf489520755editdlrm
size323680755editdlrm
skill321520755editdlrm
slabtop239840755editdlrm
sleep322240755editdlrm
snice321520755editdlrm
snmpconf260510755editdlrm
soelim-0editdlrm
sort1156080755editdlrm
spell1250755editdlrm
splain194110755editdlrm
split533600755editdlrm
sprof362960755editdlrm
sqlite316102240755editdlrm
ssh9178800755editdlrm
ssh-add3130560755editdlrm
ssh-agent3253200755editdlrm
ssh-copy-id141740755editdlrm
ssh-keygen4868320755editdlrm
ssh-keyscan3463520755editdlrm
stat817680755editdlrm
stdbuf446000755editdlrm
strace21766640755editdlrm
stream154560755editdlrm
strings325040755editdlrm
strip1898080755editdlrm
stty774560755editdlrm
sum362320755editdlrm
sync362000755editdlrm
tabs196240755editdlrm
tac1028080755editdlrm
tail695360755editdlrm
tar5348240755editdlrm
taskset237840755editdlrm
tbl1340000755editdlrm
tclsh160640755editdlrm
tclsh8.6160640755editdlrm
tee363440755editdlrm
test446640755editdlrm
tic898960755editdlrm
timeout368480755editdlrm
tload198000755editdlrm
tmpwatch368960755editdlrm
toe237840755editdlrm
top1354480755editdlrm
touch940480755editdlrm
tput279040755editdlrm
tr447280755editdlrm
troff7496400755editdlrm
true279360755editdlrm
truncate363280755editdlrm
tset279920755editdlrm
tsort487440755editdlrm
tty322240755editdlrm
tzselect153520755editdlrm
uapi60130755editdlrm
ul238160755editdlrm
uname322320755editdlrm
unexpand404800755editdlrm
uniq446800755editdlrm
unlink322240755editdlrm
unzip2006880755editdlrm
unzipsfx898080755editdlrm
uptime156560755editdlrm
users322560755editdlrm
utmpdump237680755editdlrm
vdir1407520755editdlrm
vi14522560755editdlrm
view1460755editdlrm
vmstat403600755editdlrm
watch285360755editdlrm
wc445760755editdlrm
wget5337200755editdlrm
whereis326080755editdlrm
which285600755editdlrm
who528320755editdlrm
whoami322240755editdlrm
word-list-compress160800755editdlrm
x86_64-redhat-linux-c++10972240755editdlrm
x86_64-redhat-linux-g++10972240755editdlrm
x86_64-redhat-linux-gcc10931280755editdlrm
x86_64-redhat-linux-gcc-1110931280755editdlrm
xargs656320755editdlrm
xmlcatalog237120755editdlrm
xmllint824880755editdlrm
xmlwf405760755editdlrm
xsltproc319840755editdlrm
xsubpp50800755editdlrm
yes320640755editdlrm
zcat19880755editdlrm
zcmp16820755editdlrm
zdiff64510755editdlrm
zegrep330755editdlrm
zfgrep330755editdlrm
zforce20850755editdlrm
zgrep81160755editdlrm
zip2264000755editdlrm
zipcloak775120755editdlrm
zipgrep29570755editdlrm
zipinfo2006880755editdlrm
zipnote692320755editdlrm
zipsplit651040755editdlrm
zless22100755editdlrm
zmore18460755editdlrm
znew45810755editdlrm
zsoelim-0editdlrm
[528720755editdlrm
Edit: /usr/bin/splain (19411B)
#!/usr/bin/perl eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' if $running_under_some_shell; BEGIN { pop @INC if $INC[-1] eq '.' } =head1 NAME diagnostics, splain - produce verbose warning diagnostics =head1 SYNOPSIS Using the C pragma: use diagnostics; use diagnostics -verbose; enable diagnostics; disable diagnostics; Using the C standalone filter program: perl program 2>diag.out splain [-v] [-p] diag.out Using diagnostics to get stack traces from a misbehaving script: perl -Mdiagnostics=-traceonly my_script.pl =head1 DESCRIPTION =head2 The C Pragma This module extends the terse diagnostics normally emitted by both the perl compiler and the perl interpreter (from running perl with a -w switch or C), augmenting them with the more explicative and endearing descriptions found in L. Like the other pragmata, it affects the compilation phase of your program rather than merely the execution phase. To use in your program as a pragma, merely invoke use diagnostics; at the start (or near the start) of your program. (Note that this I enable perl's B<-w> flag.) Your whole compilation will then be subject(ed :-) to the enhanced diagnostics. These still go out B. Due to the interaction between runtime and compiletime issues, and because it's probably not a very good idea anyway, you may not use C to turn them off at compiletime. However, you may control their behaviour at runtime using the disable() and enable() methods to turn them off and on respectively. The B<-verbose> flag first prints out the L introduction before any other diagnostics. The $diagnostics::PRETTY variable can generate nicer escape sequences for pagers. Warnings dispatched from perl itself (or more accurately, those that match descriptions found in L) are only displayed once (no duplicate descriptions). User code generated warnings a la warn() are unaffected, allowing duplicate user messages to be displayed. This module also adds a stack trace to the error message when perl dies. This is useful for pinpointing what caused the death. The B<-traceonly> (or just B<-t>) flag turns off the explanations of warning messages leaving just the stack traces. So if your script is dieing, run it again with perl -Mdiagnostics=-traceonly my_bad_script to see the call stack at the time of death. By supplying the B<-warntrace> (or just B<-w>) flag, any warnings emitted will also come with a stack trace. =head2 The I Program While apparently a whole nuther program, I is actually nothing more than a link to the (executable) F module, as well as a link to the F documentation. The B<-v> flag is like the C directive. The B<-p> flag is like the $diagnostics::PRETTY variable. Since you're post-processing with I, there's no sense in being able to enable() or disable() processing. Output from I is directed to B, unlike the pragma. =head1 EXAMPLES The following file is certain to trigger a few errors at both runtime and compiletime: use diagnostics; print NOWHERE "nothing\n"; print STDERR "\n\tThis message should be unadorned.\n"; warn "\tThis is a user warning"; print "\nDIAGNOSTIC TESTER: Please enter a here: "; my $a, $b = scalar ; print "\n"; print $x/$y; If you prefer to run your program first and look at its problem afterwards, do this: perl -w test.pl 2>test.out ./splain < test.out Note that this is not in general possible in shells of more dubious heritage, as the theoretical (perl -w test.pl >/dev/tty) >& test.out ./splain < test.out Because you just moved the existing B to somewhere else. If you don't want to modify your source code, but still have on-the-fly warnings, do this: exec 3>&1; perl -w test.pl 2>&1 1>&3 3>&- | splain 1>&2 3>&- Nifty, eh? If you want to control warnings on the fly, do something like this. Make sure you do the C first, or you won't be able to get at the enable() or disable() methods. use diagnostics; # checks entire compilation phase print "\ntime for 1st bogus diags: SQUAWKINGS\n"; print BOGUS1 'nada'; print "done with 1st bogus\n"; disable diagnostics; # only turns off runtime warnings print "\ntime for 2nd bogus: (squelched)\n"; print BOGUS2 'nada'; print "done with 2nd bogus\n"; enable diagnostics; # turns back on runtime warnings print "\ntime for 3rd bogus: SQUAWKINGS\n"; print BOGUS3 'nada'; print "done with 3rd bogus\n"; disable diagnostics; print "\ntime for 4th bogus: (squelched)\n"; print BOGUS4 'nada'; print "done with 4th bogus\n"; =head1 INTERNALS Diagnostic messages derive from the F file when available at runtime. Otherwise, they may be embedded in the file itself when the splain package is built. See the F for details. If an extant $SIG{__WARN__} handler is discovered, it will continue to be honored, but only after the diagnostics::splainthis() function (the module's $SIG{__WARN__} interceptor) has had its way with your warnings. There is a $diagnostics::DEBUG variable you may set if you're desperately curious what sorts of things are being intercepted. BEGIN { $diagnostics::DEBUG = 1 } =head1 BUGS Not being able to say "no diagnostics" is annoying, but may not be insurmountable. The C<-pretty> directive is called too late to affect matters. You have to do this instead, and I you load the module. BEGIN { $diagnostics::PRETTY = 1 } I could start up faster by delaying compilation until it should be needed, but this gets a "panic: top_level" when using the pragma form in Perl 5.001e. While it's true that this documentation is somewhat subserious, if you use a program named I, you should expect a bit of whimsy. =head1 AUTHOR Tom Christiansen >, 25 June 1995. =cut use strict; use 5.009001; use Carp; $Carp::Internal{__PACKAGE__.""}++; our $VERSION = '1.37'; our $DEBUG; our $VERBOSE; our $PRETTY; our $TRACEONLY = 0; our $WARNTRACE = 0; use Config; use Text::Tabs 'expand'; my $privlib = $Config{privlibexp}; if ($^O eq 'VMS') { require VMS::Filespec; $privlib = VMS::Filespec::unixify($privlib); } my @trypod = ( "$privlib/pod/perldiag.pod", "$privlib/pods/perldiag.pod", ); # handy for development testing of new warnings etc unshift @trypod, "./pod/perldiag.pod" if -e "pod/perldiag.pod"; (my $PODFILE) = ((grep { -e } @trypod), $trypod[$#trypod])[0]; $DEBUG ||= 0; local $| = 1; local $_; local $.; my $standalone; my(%HTML_2_Troff, %HTML_2_Latin_1, %HTML_2_ASCII_7); CONFIG: { our $opt_p = our $opt_d = our $opt_v = our $opt_f = ''; unless (caller) { $standalone++; require Getopt::Std; Getopt::Std::getopts('pdvf:') or die "Usage: $0 [-v] [-p] [-f splainpod]"; $PODFILE = $opt_f if $opt_f; $DEBUG = 2 if $opt_d; $VERBOSE = $opt_v; $PRETTY = $opt_p; } if (open(POD_DIAG, '<', $PODFILE)) { warn "Happy happy podfile from real $PODFILE\n" if $DEBUG; last CONFIG; } if (caller) { INCPATH: { for my $file ( (map { "$_/".__PACKAGE__.".pm" } @INC), $0) { warn "Checking $file\n" if $DEBUG; if (open(POD_DIAG, '<', $file)) { while () { next unless /^__END__\s*# wish diag dbase were more accessible/; print STDERR "podfile is $file\n" if $DEBUG; last INCPATH; } } } } } else { print STDERR "podfile is \n" if $DEBUG; *POD_DIAG = *main::DATA; } } if (eof(POD_DIAG)) { die "couldn't find diagnostic data in $PODFILE @INC $0"; } %HTML_2_Troff = ( 'amp' => '&', # ampersand 'lt' => '<', # left chevron, less-than 'gt' => '>', # right chevron, greater-than 'quot' => '"', # double quote 'sol' => '/', # forward slash / solidus 'verbar' => '|', # vertical bar "Aacute" => "A\\*'", # capital A, acute accent # etc ); %HTML_2_Latin_1 = ( 'amp' => '&', # ampersand 'lt' => '<', # left chevron, less-than 'gt' => '>', # right chevron, greater-than 'quot' => '"', # double quote 'sol' => '/', # Forward slash / solidus 'verbar' => '|', # vertical bar "Aacute" => "\xC1" # capital A, acute accent # etc ); %HTML_2_ASCII_7 = ( 'amp' => '&', # ampersand 'lt' => '<', # left chevron, less-than 'gt' => '>', # right chevron, greater-than 'quot' => '"', # double quote 'sol' => '/', # Forward slash / solidus 'verbar' => '|', # vertical bar "Aacute" => "A" # capital A, acute accent # etc ); our %HTML_Escapes; *HTML_Escapes = do { if ($standalone) { $PRETTY ? \%HTML_2_Latin_1 : \%HTML_2_ASCII_7; } else { \%HTML_2_Latin_1; } }; *THITHER = $standalone ? *STDOUT : *STDERR; my %transfmt = (); my $transmo = <) { sub _split_pod_link { $_[0] =~ m'(?:([^|]*)\|)?([^/]*)(?:/("?)(.*)\3)?'s; ($1,$2,$4); } unescape(); if ($PRETTY) { sub noop { return $_[0] } # spensive for a noop sub bold { my $str =$_[0]; $str =~ s/(.)/$1\b$1/g; return $str; } sub italic { my $str = $_[0]; $str =~ s/(.)/_\b$1/g; return $str; } s/C<<< (.*?) >>>|C<< (.*?) >>|[BC]<(.*?)>/bold($+)/ges; s/[IF]<(.*?)>/italic($1)/ges; s/L<(.*?)>/ my($text,$page,$sect) = _split_pod_link($1); defined $text ? $text : defined $sect ? italic($sect) . ' in ' . italic($page) : italic($page) /ges; s/S<(.*?)>/ $1 /ges; } else { s/C<<< (.*?) >>>|C<< (.*?) >>|[BC]<(.*?)>/$+/gs; s/[IF]<(.*?)>/$1/gs; s/L<(.*?)>/ my($text,$page,$sect) = _split_pod_link($1); defined $text ? $text : defined $sect ? qq '"$sect" in $page' : $page /ges; s/S<(.*?)>/ $1 /ges; } unless (/^=/) { if (defined $header) { if ( $header eq 'DESCRIPTION' && ( /Optional warnings are enabled/ || /Some of these messages are generic./ ) ) { next; } $_ = expand $_; s/^/ /gm; $msg{$header} .= $_; for my $h(@headers) { $msg{$h} .= $_ } ++$seen_body; undef $for_item; } next; } # If we have not come across the body of the description yet, then # the previous header needs to share the same description. if ($seen_body) { @headers = (); } else { push @headers, $header if defined $header; } if ( ! s/=item (.*?)\s*\z//s || $over_level != 1) { if ( s/=head1\sDESCRIPTION//) { $msg{$header = 'DESCRIPTION'} = ''; undef $for_item; } elsif( s/^=for\s+diagnostics\s*\n(.*?)\s*\z// ) { $for_item = $1; } elsif( /^=over\b/ ) { $over_level++; } elsif( /^=back\b/ ) { # Stop processing body here $over_level--; if ($over_level == 0) { undef $header; undef $for_item; $seen_body = 0; next; } } next; } if( $for_item ) { $header = $for_item; undef $for_item } else { $header = $1; $header =~ s/\n/ /gs; # Allow multi-line headers } # strip formatting directives from =item line $header =~ s/[A-Z]<(.*?)>/$1/g; # Since we strip "(\.\s*)\n" when we search a warning, strip it here as well $header =~ s/(\.\s*)?$//; my @toks = split( /(%l?[dxX]|%[ucp]|%(?:\.\d+)?[fs])/, $header ); if (@toks > 1) { my $conlen = 0; for my $i (0..$#toks){ if( $i % 2 ){ if( $toks[$i] eq '%c' ){ $toks[$i] = '.'; } elsif( $toks[$i] =~ /^%(?:d|u)$/ ){ $toks[$i] = '\d+'; } elsif( $toks[$i] =~ '^%(?:s|.*f)$' ){ $toks[$i] = $i == $#toks ? '.*' : '.*?'; } elsif( $toks[$i] =~ '%.(\d+)s' ){ $toks[$i] = ".{$1}"; } elsif( $toks[$i] =~ '^%l*([pxX])$' ){ $toks[$i] = $1 eq 'X' ? '[\dA-F]+' : '[\da-f]+'; } } elsif( length( $toks[$i] ) ){ $toks[$i] = quotemeta $toks[$i]; $conlen += length( $toks[$i] ); } } my $lhs = join( '', @toks ); $lhs =~ s/(\\\s)+/\\s+/g; # Replace lit space with multi-space match $transfmt{$header}{pat} = " s^\\s*$lhs\\s*\Q$header\Es\n\t&& return 1;\n"; $transfmt{$header}{len} = $conlen; } else { my $lhs = "\Q$header\E"; $lhs =~ s/(\\\s)+/\\s+/g; # Replace lit space with multi-space match $transfmt{$header}{pat} = " s^\\s*$lhs\\s*\Q$header\E\n\t && return 1;\n"; $transfmt{$header}{len} = length( $header ); } print STDERR __PACKAGE__.": Duplicate entry: \"$header\"\n" if $msg{$header}; $msg{$header} = ''; $seen_body = 0; } close POD_DIAG unless *main::DATA eq *POD_DIAG; die "No diagnostics?" unless %msg; # Apply patterns in order of decreasing sum of lengths of fixed parts # Seems the best way of hitting the right one. for my $hdr ( sort { $transfmt{$b}{len} <=> $transfmt{$a}{len} } keys %transfmt ){ $transmo .= $transfmt{$hdr}{pat}; } $transmo .= " return 0;\n}\n"; print STDERR $transmo if $DEBUG; eval $transmo; die $@ if $@; } if ($standalone) { if (!@ARGV and -t STDIN) { print STDERR "$0: Reading from STDIN\n" } while (defined (my $error = <>)) { splainthis($error) || print THITHER $error; } exit; } my $olddie; my $oldwarn; sub import { shift; $^W = 1; # yup, clobbered the global variable; # tough, if you want diags, you want diags. return if defined $SIG{__WARN__} && ($SIG{__WARN__} eq \&warn_trap); for (@_) { /^-d(ebug)?$/ && do { $DEBUG++; next; }; /^-v(erbose)?$/ && do { $VERBOSE++; next; }; /^-p(retty)?$/ && do { print STDERR "$0: I'm afraid it's too late for prettiness.\n"; $PRETTY++; next; }; # matches trace and traceonly for legacy doc mixup reasons /^-t(race(only)?)?$/ && do { $TRACEONLY++; next; }; /^-w(arntrace)?$/ && do { $WARNTRACE++; next; }; warn "Unknown flag: $_"; } $oldwarn = $SIG{__WARN__}; $olddie = $SIG{__DIE__}; $SIG{__WARN__} = \&warn_trap; $SIG{__DIE__} = \&death_trap; } sub enable { &import } sub disable { shift; return unless $SIG{__WARN__} eq \&warn_trap; $SIG{__WARN__} = $oldwarn || ''; $SIG{__DIE__} = $olddie || ''; } sub warn_trap { my $warning = $_[0]; if (caller eq __PACKAGE__ or !splainthis($warning)) { if ($WARNTRACE) { print STDERR Carp::longmess($warning); } else { print STDERR $warning; } } goto &$oldwarn if defined $oldwarn and $oldwarn and $oldwarn ne \&warn_trap; }; sub death_trap { my $exception = $_[0]; # See if we are coming from anywhere within an eval. If so we don't # want to explain the exception because it's going to get caught. my $in_eval = 0; my $i = 0; while (my $caller = (caller($i++))[3]) { if ($caller eq '(eval)') { $in_eval = 1; last; } } splainthis($exception) unless $in_eval; if (caller eq __PACKAGE__) { print STDERR "INTERNAL EXCEPTION: $exception"; } &$olddie if defined $olddie and $olddie and $olddie ne \&death_trap; return if $in_eval; # We don't want to unset these if we're coming from an eval because # then we've turned off diagnostics. # 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