The Answer to All Man's Problems (part 6 of 6)
Tom Christiansen
tchrist at convex.COM
Tue Jan 8 09:25:31 AEST 1991
X ( $page = $PAGE ) =~ s/\.Z//;
X $page =~ s#.*/([^/]+)$#$1#;
X
X $PAGE = "$ZCAT < $PAGE|" if $PAGE =~ /\.Z/;
X
X (open PAGE) || die ("$program: can't open $PAGE to check filters: $!\n");
X warn "open $PAGE to check for filters in $_[0]\n" if $debug;
X
X while (<PAGE>) {
X if (/^\.EQ/) {
X $_ = <PAGE>;
X $eqn = 1 unless /\.(if|nr)/; # has eqn output not input
X }
X if (/^\.TS/) {
X $_ = <PAGE>;
X $tbl = 1 unless /\.(if|nr)/; # has tbl output not input
X }
X last if $eqn && $tbl;
X }
X close PAGE;
X
X if ($roff eq 'troff') {
X $eqn && $_[0] =~ s/(\S+roff)/$EQN | $1/;
X $tbl && $_[0] =~ s/(\S+roff)/$TBL | $1/;
X } else { # nroff
X $eqn && $_[0] =~ s/(\S+roff)/$NEQN | $1/;
X $tbl && $_[0] =~ s/(\S+roff)/$NTBL | $1/;
X }
X
X ($sect) = $page =~ /\.(\d)[^.]*$/;
X $prs = "/usr/man/pr$sect/$page";
X if (-e $prs) {
X warn "found PRs for $page\n" if $debug;
X if ($roff eq 'nroff') {
X $_[0] =~ s/ - / - $prs/;
X } else {
X $_[0] .= " $prs";
X }
X } else {
X print "no PRS for $page in $prs\n" if $debug;
X }
X $_[0];
X}
X
X# --------------------------------------------------------------------------
X# due to aliasing the dbase sometimes has the same thing twice
X# --------------------------------------------------------------------------
Xsub trimdups {
X local(%seen) = ();
X local(@retlist) = ();
X
X while ($file = shift) {
X push(@retlist,$file) unless $seen{$file}++;
X }
X return @retlist;
X}
X
X# --------------------------------------------------------------------------
X# just print the version
X# --------------------------------------------------------------------------
Xsub version {
X warn "$program: version is \"$version\"\n" ;
X}
X
X# --------------------------------------------------------------------------
X# create and display subsection index via pager
X# --------------------------------------------------------------------------
Xsub show_index {
X local($_);
X &load_index($_[0]);
X if ($#ssindex > ($rows - 4) && $isatty) {
X print "Hit <RTN> for $#ssindex subsections via pager: ";
X $_ = <STDIN>;
X if ($no_idx_file) {
X open (PAGER, "| $PAGER");
X print PAGER @ssindex;
X close PAGER;
X } else {
X &run("$PAGER $idx_file");
X }
X } else {
X print STDOUT @ssindex;
X }
X}
X
X# --------------------------------------------------------------------------
X# find closest match on index selection in full index
X# --------------------------------------------------------------------------
Xsub find_index {
X local($manpage, $expr) = @_;
X local($_, @matches);
X
X &load_index($manpage);
X
X $expr =~ s!^/+!!;
X
X for (@ssindex) {
X s/^\s*\d+\s+//;
X s/\s+\d+\s*$//;
X }
X
X if ($expr > 0) {
X return $ssindex[$expr];
X } else {
X $ssindex[0] = '';
X if (@matches = grep (/^$expr/i, @ssindex)) {
X return $matches[0];
X } elsif (@matches = grep (/$expr/i, @ssindex)) {
X return $matches[0];
X } else {
X return '';
X }
X }
X}
X
X# --------------------------------------------------------------------------
X# read in subsection index into @ssindex
X# --------------------------------------------------------------------------
Xsub load_index {
X local($manpage) = @_;
X $no_idx_file = 0;
X &getidx($manpage) if $#saveidx < 0;
X @ssindex = @saveidx;
X die "should have have an index for $manpage" if $#saveidx < 0;
X}
X
X# --------------------------------------------------------------------------
X# create subsection index is out of date wrt source man page
X# --------------------------------------------------------------------------
Xsub getidx {
X local($manpage) = @_;
X local($is_mh);
X local($_, $i, %lines, %sec, $sname, @snames);
X local(@retlist, $maxlen, $header, @idx , @st_man, @st_idx);
X # global no_idx_file, idx_file
X
X ( $idx_file = $manpage ) =~ s:/man(\w+)(\.Z)?/:/idx$1/:;
X $idx_file =~ s/\.Z//;
X
X require 'stat.pl' unless defined &Stat;
X
X @st_man = &Stat($manpage);
X @st_idx = &Stat($idx_file);
X
X if ($st_man[$ST_MTIME] < $st_idx[$ST_MTIME]) {
X unless (open idx_file) {
X warn "$program: can't open $idx_file: $!\n";
X return ();
X }
X @retlist = <idx_file>;
X close idx_file;
X return @saveidx = @retlist;
X }
X
X if (!open(manpage, $manpage =~ /\.Z/ ? "$ZCAT < $manpage|" : $manpage)) {
X warn "$program: can't open $manpage: $!\n";
X return ();
X }
X warn "building section index\n" if $debug;
X ($header = "Subsections in $manpage") =~ s!/?\S*/!!;
X $maxlen = length($header);
X push(@snames, $sname = 'preamble');;
X
X # MH has these alias for sections and subsectdions
X if ($is_mh = $manpage =~ m:/mh/:) {
X %mh_sections = (
X "NA", "NAME",
X "SY", "SYNOPSIS",
X "DE", "DESCRIPTION",
X "Fi", "FILES",
X "Pr", "PROFILE",
X "Sa", "SEE ALSO",
X "De", "DEFAULTS",
X "Co", "CONTEXT",
X "Hh", "HELPFUL HINTS",
X "Hi", "HISTORY",
X "Bu", "BUGS"
X );
X $mh_expr = join('|',keys %mh_sections);
X }
X
X while (<manpage>) {
X if ($is_mh && /^\.($mh_expr)/) {
X $sname = $mh_sections{$+};
X $maxlen = length($sname) if $maxlen < length($sname);
X push(@snames,$sname);
X }
X if (/^\.s[sh]\s+(.*)/i ) {
X $line = $_;
X $_ = $1;
X s/"//g;
X s/\\f([PBIR]|\(..)//g; # kill font changes
X s/\\s[+-]?\d+//g; # kill point changes
X s/\\&//g; # and \&
X s/\\\((ru|ul)/_/g; # xlate to '_'
X s/\\\((mi|hy|em)/-/g; # xlate to '-'
X s/\\\*\(..//g; # no troff strings
X s/\\//g; # kill all remaining backslashes
X $sname = $_;
X $_ = $line;
X $maxlen = length($sname) if $maxlen < length($sname);
X push(@snames,$sname);
X }
X $lines{$sname}++;
X }
X
X $mask = sprintf("%%2d %%-%ds %%5d\n", $maxlen + 2);
X
X $no_idx_file = $idx_file eq $manpage || !open(idx, ">$idx_file");
X
X $line = sprintf(sprintf("Idx %%-%ds Lines\n", $maxlen + 2), $header);
X @retlist = ($line);
X
X for ($i = 1; $i <= $#snames; $i++) {
X push(@retlist, sprintf($mask, $i, $snames[$i], $lines{$snames[$i]}));
X }
X if (!$no_idx_file) {
X warn "storing section index in $idx_file\n" if $debug;
X print idx @retlist;
X close idx;
X }
X return @saveidx = @retlist;
X}
X
X# --------------------------------------------------------------------------
X# interrupted -- unlink temp page
X# --------------------------------------------------------------------------
Xsub tmp_cleanup {
X warn "unlink $tmppage\n" if $debug;
X unlink $tmppage;
X exit -1;
X}
X
X
X# --------------------------------------------------------------------------
X# print line with C\bC style emboldening
X# --------------------------------------------------------------------------
Xsub print {
X local($_) = @_;
X
X if (!$inbold) {
X print;
X } else {
X local($last);
X for (split(//)) {
X if ($last eq "\033") {
X print;
X } else {
X print /[!-~]/ ? $_."\b".$_ : $_;
X }
X $last = $_;
X }
X }
X}
X
X# --------------------------------------------------------------------------
X# reformat the page with nroff, fixing up bold escapes
X# --------------------------------------------------------------------------
Xsub reformat {
X local($_) = @_;
X local($nroff, $col);
X local($inbold) = 0;
X
X if ($NROFF_CAN_BOLD) {
X return &run($_);
X }
X
X &unshell($_);
X ($nroff, $col) = m!(.*)\|\s*($COL.*)!;
X
X warn "$nroff | (this proc) | $col\n" if $debug;
X
X open (NROFF, "$nroff |");
X $colpid = open (COL, "| $col");
X
X select(COL);
X
X while (<NROFF>) {
X s/\033\+/\001/;
X s/\033\,/\002/;
X if ( /^([^\001]*)\002/ || /^([^\002]*)\001/ ) {
X &print($1);
X $inbold = !$inbold;
X $_ = $';
X redo;
X }
X &print($_);
X }
X
X close NROFF;
X if ($?) {
X warn "$program: \"$nroff\" failed!\n" if $debug;
X $status++;
X }
X close COL;
X if ($?) {
X warn "$program: \"$col\" failed!\n" if $debug;
X $status++;
X }
X select(STDOUT);
X $status == 0;
X}
X
X# --------------------------------------------------------------------------
X# prompt for <RET> if we're a tty and have a non-stopping pager
X# --------------------------------------------------------------------------
Xsub prompt_RTN {
X local($why) = $_[0] || "to continue";
X return unless $isatty;
X unless ($is_less && $ENV{'LESS'} !~ /E/) {
X print "Hit <RTN> $why: ";
X $_ = <STDIN>;
X }
X}
X
X# --------------------------------------------------------------------------
X# dynamically determine MANPATH (if unset) according to PATH
X# --------------------------------------------------------------------------
Xsub config_path {
X local($_); # for traversing $PATH
X local(%seen); # weed out duplicates
X local(*manpath); # eventual return values
X
X if (defined $ENV{'MANPATH'}) {
X $manpath = $ENV{'MANPATH'};
X } else {
X for (split(/:/, $ENV{'PATH'})) {
X next if $_ eq '.';
X next if $_ eq '..';
X s![^/+]*$!man! && -d && !$seen{$_}++ && push(@manpath,$_);
X }
X $manpath = join(':', @manpath);
X }
X # $manpath; # last expr is assign to this anyway
X}
X
X# --------------------------------------------------------------------------
X# grep through MANPATH for a pattern
X# --------------------------------------------------------------------------
Xsub grepman {
X local($code, $_, $dir, $root, $FILE, $found);
X
X $code = "while (<FILE>) {\n";
X
X for (@ARGV) {
X s#/#\\/#g;
X $code .= <<EOCODE;
X if (/$_/) {
X print "\$path: \$_";
X \$found++;
X next;
X }
XEOCODE
X }
X
X $code .= "}\n";
X
X print "grep eval code: $code" if $debug;
X
X
X foreach $root ( split(/:/, $MANPATH)) {
X unless (chdir($root)) {
X warn "can't chdir to $root: $!";
X $status++;
X next;
X }
X foreach $dir ( <man?*> ) {
X unless (chdir($dir)) {
X warn "can't chdir to $root/$dir: $!";
X $status++;
X next;
X }
X unless (opendir(DIR, '.')) {
X warn "can't opendir $root/$dir: $!";
X $status++;
X next;
X }
X foreach $FILE ( readdir(DIR) ) {
X next if $FILE eq '.' || $FILE eq '..';
X $path = "$root/$dir/$FILE";
X if ($FILE !~ /\S\.\S/ || !-f $FILE) {
X print "skipping non-man file: $path\n" if $debug;
X next;
X }
X if ($FILE =~ /\.Z$/ || $dir =~ /\.Z$/) {
X $FILE = "$ZCAT $FILE|";
X }
X print STDERR "grepping $path\n" if $debug;
X unless (open FILE) {
X warn "can't open $root/$dir/$FILE: $!";
X $status++;
X next;
X }
X eval $code;
X die $@ if $@;
X }
X unless (chdir ($root)) {
X warn "can't return to $root: $!";
X $status++;
X last;
X }
X }
X }
X exit ($status || !$found);
X}
SHAR_EOF
if test 39119 -ne "`wc -c < 'man'`"
then
echo shar: "error transmitting 'man'" '(should have been 39119 characters)'
fi
chmod 755 'man'
fi
echo shar: "extracting 'catwhatis'" '(553 characters)'
if test -f 'catwhatis'
then
echo shar: "will not over-write existing file 'catwhatis'"
else
sed 's/^ X//' << \SHAR_EOF > 'catwhatis'
X#!/usr/local/bin/perl
X
X$manpath = shift || $ENV{'MANPATH'} || '/usr/man/';
X
Xfor $manroot (split(/:/, $manpath)) {
X
X unless (dbmopen(manroot, "$manroot/whatis", undef)) {
X warn("Can't dbmopen $manroot/whatis: $!\n");
X next;
X }
X
X print "$manroot:\n";
X
X while (($key,$value) = each %manroot) {
X
X for (split(/\002/, $value)) {
X if (/\001/) {
X ($cmd, $page, $section, $desc) = split(/\001/);
X printf("%-30s - %s\n", "$cmd ($section)", $desc);
X } else {
X printf("%-30s > %s\n", "$key", $_);
X }
X }
X }
X
X dbmclose(manroot);
X}
SHAR_EOF
if test 553 -ne "`wc -c < 'catwhatis'`"
then
echo shar: "error transmitting 'catwhatis'" '(should have been 553 characters)'
fi
chmod 775 'catwhatis'
fi
echo shar: "extracting 'countman'" '(326 characters)'
if test -f 'countman'
then
echo shar: "will not over-write existing file 'countman'"
else
sed 's/^ X//' << \SHAR_EOF > 'countman'
X#!/usr/local/bin/perl
X#
X# countman -- count the number of entries in a man tree
X
X$| = 1;
Xfor (split(/:/, shift || $ENV{'MANPATH'} || '/usr/man')) {
X dbmopen(%whatis, "$_/whatis", undef) || (warn "$0: dbmopen $_: $!\n",next);
X print $_, ': ';
X for ($count = 0; each %whatis; $count++) { }
X print $count, "\n";
X}
SHAR_EOF
if test 326 -ne "`wc -c < 'countman'`"
then
echo shar: "error transmitting 'countman'" '(should have been 326 characters)'
fi
chmod 775 'countman'
fi
echo shar: "extracting 'cfman.8'" '(6282 characters)'
if test -f 'cfman.8'
then
echo shar: "will not over-write existing file 'cfman.8'"
else
sed 's/^ X//' << \SHAR_EOF > 'cfman.8'
X.TH CFMAN 8L \fIConvex-Internal\fP "15 November 1989" "\fBDocumentation Administration Toolkit\fP"
X.de Sh
X.br
X.PP
X.ne 4
X.ti -.5i
X\fB\\$1\fR
X.PP
X..
X.de LB \" little and bold
X.ft B
X.if !"\\$1"" \&\s-1\\$1\s+1 \\$2 \\$3 \\$4 \\$5 \\$6
X.ft R
X..
X.de Sp
X.if t .sp .5v
X.if n .sp
X..
X.ds lq \&"\"
X.ds rq \&"\"
X.if t \
X. ds lq ``
X.if t \
X. ds rq ''
X.de Q
X\*(lq\\$1\*(rq\\$2
X..
X.Sh NAME
Xcfman \- cross-reference man pages for internal consistency
X.Sh SYNOPSIS
X.B cfman
X[
X.B \-d
Xlevel
X]
X[
X.B \-s
Xsections
X]
X[
X.B \-p
Xmanpath
X]
X[
X.B \-x
Xxrefpath
X]
X[ pattern | pathname ] ...
X.br
X.Sh DESCRIPTION
X.I
XCfman
Xis a
X.I perl
Xprogram that checks that man page sources
Xare mutually consistent in their
X.LB "SEE ALSO"
Xreferences.
XIt will also report any
X.LB ".TH"
Xline that claims the
Xman page is in a different place than
X.I cfman
Xfound it.
X.PP
XWhen supplied with no arguments,
X.I cfman
Xwill check all files (matching *.*) it finds in each man directory in
Xyour colon-delimited
X.LB "$MANPATH"
Xenvariable if set, or in
X.I /usr/man
Xotherwise. It first verifies that the
X.LB ".TH"
Xsays
Xthe man page is really where it should be, e.g. if the
Xline is
X.br
X.in +.5i
X.nf
X\f(TA
X\&.TH\ \ WIDGET\ \ 8
X.in -.5i
X\fP
X.fi
X.br
Xthen \fIwidget.8\fP should be the filename currently
Xbeing examined. All upper-case will map to all lower-case,
Xbut mixed case will be preserved for compatibility with
Xthe
X.LB X11
Xman pages.
X.PP
X.I Cfman
Xthen skips ahead to the
X.LB "SEE ALSO"
Xsection and retrieves
Xall comma-delimited entries of the general
Xform \fIpagename(section)\fP. It first looks in the file
X\&../man\fIsection/pagename.section\fP. If this fails
Xand the current file ended in one of \fB[npl]\fP, but the
X.I section
Xreferenced is either
X\fB1\fP or \fB8\fP, then it will check in
X.I ../man8.
XFailing this,
X.I cfman
Xchecks to see whether the referenced man page has been
Xinstalled stripped of its subsection, e.g. \fIuucp\fP(1c)
Xhas found its way into \fIuucp\fP(1). It then checks
Xto see whether something in section \fB1\fP has been mis-installed
Xin section \fB8\fP, or vice versa, or either one in section \fBl\fP
Xmis-installed in the
Xin section \fB8\fP and vice-versa. If all else fails,
X.I cfman
Xwill guess that a man page is referenced without its
Xproper subsection, as in a reference to \fIrcp(1)\fP
Xthat should really have been to \fIrcp(1c)\fP. If it finds
Xthe misplaced man page, it reports where the reference
Xthought it was and where it really was. Otherwise it
Xreports the man page as missing.
X.PP
XThe
X.LB $MANPATH
Xvariable may be overridden by
Xthe \fB-p\fP option.
XAll checks will
Xbe performed across each subtree specified in the manpath
X(either from the environment of the command line),
Xunless altered with the \fB-x\fP option. As a short-cut,
Xthe \fIxrefpath\fP may have a leading colon to indicate
Xthat it is to be concatenation of the \fImanpath\fP
Xand the supplied \fIxrefpath\fP.
X.PP
XYou can restrict the sections checked with the \fB-s\fP
Xswitch. By default, sections 1 through 8 will be examined.
XThe section may be a shell metacharacter expression,
Xlike
X.Q ?
Xor
X.Q [18lpn] .
X.PP
XYou may restrict the individual man pages cross-referenced
Xby specifying which ones you're interested in on the command
Xline. These may be full pathnames, simple names like
X.Q tty ,
Xor a shell metacharacter expression like
X.Q *net .
XIf
Xno period occurs in the simple name, it is assumed to mean that
Xthe name may have any extension. If you list specific
Xman pages on the command line and
X.I cfman
Xfinds none matching your specification, it will report this fact.
XSee the
X.LB "EXAMPLES"
Xsection.
X.PP
XMan pages that are linked by placing a \fB.so\fP directive
Xon the first line will be correctly followed, and no man page
Xin the same subtree. Very limited support for alternate
Xman macros is provided: the
X.I "\fIRand MH Message Handling System\fP" 's
Xman macro set are recognized, as is Larry Wall's
X.LB .Sh
Xreplacement for
X.LB .SH.
X.Sh DIAGNOSTICS
XRequires
X.I perl
Xto be at least version 3.0, patchlevel 1 to run. The
Xprogram will abort if you try to run it with an
Xearlier version of perl
X.PP
XFive different tracing levels can be specified with the \fB-d\fP
Xoption. If any debugging is turned on, the walk through
Xthe different components of the manpath are traced.
XDebug values are numeric and additive, and are interpreted
Xthis way:
X.Sp
X.in +.5i
X.nf
X.ne 5
X 1 Trace each man page examined
X 2 Trace each cross reference examined
X 4 Trace each \s-1\fB.TH\s+1\fP check
X 8 Trace each file-existence test
X 16 Trace each line
X'in -.5i
X.fi
X.Sp
XTracing information and other warnings are printed to
X\fIstderr\fP, but normal messages about bad cross references
Xare printed to \fIstdout\fP as that is \fIcfman\fP's principle
Xtask.
X.PP
XEmbedded
X.I troff
Xstring macros starting \e*( cannot be resolved, and they
Xwill trigger a warning message if found in the
X.LB .TH
Xor
X.LB "SEE ALSO"
Xsections.
X.Sh EXAMPLES
X.nf
X\f(TA
Xcfman # do all in $MANPATH
Xcfman -p /export/exec/sun3/share/man # sun man pages
Xcfman -p $HOME/man:/usr/local/mh/man:/usr/local/man:/usr/man
Xcfman -p /usr/local/man -x :/usr/man # xref also in /usr/man
Xcfman -s 18nlp # only these sections
Xcfman '*tty*' fubar # check for *tty*.* and fubar.*
Xcfman `pwd`/*.[1-8] # just check these files
Xcfman -s 23 'sys*' # sys*.* files in sections 2,3
Xcfman -s 1 -p /export/exec/sun3/share/man
X.fi
X\fR
X.PP
XThe last command produced this output on my machine:
X.nf
X\f(TA
Xbanner.1v: thinks it's in banner(1)
Xfoption.1: skyversion(8) missing
Xfrom.1: prmail(1) missing
Xmake.1: rstat(8c) missing
Xman.1: apropos(1) missing
Xold-perfmon.1: missing .TH
Xoldperfmon.1: missing .TH
Xoldsetkeys.1: thinks it's in setkeys(1)
Xorganizer.1: restore(1v) really in restore(8)
Xsunview.1: traffic(1) really in traffic(1c)
Xsort.1v: thinks it's in sort(1)
Xsum.1v: thinks it's in sum(1)
X.fi
X\fR
X.Sh ENVIRONMENT
XThe default manpath will be taken from
X.LB $MANPATH
Xif set.
X.Sh "SEE ALSO"
Xman(1), troff(1), perl(1), man(7).
X.Sh BUGS
XDue to the current implentation of globbing in
X.I perl,
Xyou can get
X.Q "Arguments too long"
Xerrors. The workaround is to run
X.I cfman
Xfirst on
X.Q [a-m]* ,
Xand then on
X.Q [n-z]* .
X.Sh AUTHOR
XTom Christiansen, \s-1CONVEX\s+1 Computer Corporation.
SHAR_EOF
if test 6282 -ne "`wc -c < 'cfman.8'`"
then
echo shar: "error transmitting 'cfman.8'" '(should have been 6282 characters)'
fi
chmod 644 'cfman.8'
fi
echo shar: "extracting 'FEATURES'" '(2356 characters)'
if test -f 'FEATURES'
then
echo shar: "will not over-write existing file 'FEATURES'"
else
sed 's/^ X//' << \SHAR_EOF > 'FEATURES'
XFeatures include but are not limited to:
X
X * almost always faster than standard man (try 'man me')
X
X * take much less diskspace for catpages
X
X * supports per-tree tmac macros
X
X * compressed man and cat files
X
X * user-definable man path via $MANPATH or -M optoin
X
X * $MANPATH autoconfigged based on $PATH if not set
X
X * user-definable section search order via -S or $MANSECT. Thus
X programmers can get stty(3) before stty(1).
X
X * $PAGER support
X
X * show all the places you would find a man page (-w option)
X and in what order.
X
X * display all available man page on a topic (-a option)
X
X * no limits on what subsections go where (if you want to add 7x, ok)
X
X * support for multi-char sections like man1m/*.1m or manavs/*.avs
X
X * man -K for regexp apropos
X
X * grep through all the man pages in $MANPATH
X
X * section and subsection indexing for long man pages
X
X * support for alternate architectures docs on same machine
X
X * ability to run man on a local file
X
X * ability to easily troff (or preview) a man page
X
X * recognizes embedded filter directives for tbl and eqn
X
X * does the right thing for man tree that don't have DBM whatis files
X
X * support for connecting online problem reports to right man page
X
X * there's an extended usage message (man -U) for further help
X and to show current defaults.
X
X
XHere are some features of this version of makewhatis:
X
X * it's faster.
X
X * tries hard to make pretty output, stripping troff directives.
X
X * doesn't blow up on more files in a man directory
X than the shell will glob.
X
X * accepts troff string macros for the dashes in the
X the NAME section.
X
X * prints a diagnostic for a malformed NAME section.
X
X * detects linked (hard, soft, or via .so) man pages
X
X * finds *all* references in the NAME section.
X
X * recognizes MH's man macros (and .Sh from lwall).
X
X * many other things that makewhatis used to do wrong
X
XHere are some supporting utilities that are included:
X
X * catman -- new version that groks compressed files
X
X * catwhatis -- display the whatis databases
X
X * straycats -- find cat pages with no man page ancestor
X
X * countman -- find how many man pages you can get at
X
X * cfman -- find bad SEE ALSO references in man pages
SHAR_EOF
if test 2356 -ne "`wc -c < 'FEATURES'`"
then
echo shar: "error transmitting 'FEATURES'" '(should have been 2356 characters)'
fi
chmod 664 'FEATURES'
fi
chmod 775 .
echo shar: "done with directory 'man'"
cd ..
exit 0
# End of shell archive
More information about the Alt.sources
mailing list