>> Bill Middleton(wjm) wrote on Sat, 14 Aug 1993 20:29:28 -0500:
Following are context diffs to enable Tom Christiansen's
<[email protected]> `man' perl script to use GNU zip (gzip).

I have only been able to test the changes on a SUN running SUNOS4.1.3,
but they are relatively simple enough that they should work on any
other platform man currently runs on. Please let me know if these
modifications break anything!

I only use individually compressed man pages (e.g., man1/who.1.gz)
instead of the compressed directory (e.g., man1.Z/who.1) referred to
by Tom. Thus, I have not changed the compressed directory portion. In
particular, `man' and `makewhatis' will only use gzip on the former
individually compressed files.

The individually compressed man pages may have suffixes `.gz', `.z'
(old style gzip) or `.Z' (compress(1L)).

Mark Borges
<[email protected]>

diff -C3 man-orig/CHANGES man-fix/CHANGES
*** man-orig/CHANGES    Sun Aug 15 23:25:08 1993
--- man-fix/CHANGES     Mon Aug 16 10:25:00 1993
***************
*** 1,3 ****
--- 1,5 ----
+ 16 Aug 93: Modified by Mark Borges <[email protected]> to
+            handle GNU zip (gzip) compressed files.

     *   extra utils

diff -C3 man-orig/README man-fix/README
*** man-orig/README     Sun Aug 15 23:25:07 1993
--- man-fix/README      Mon Aug 16 10:23:23 1993
***************
*** 16,18 ****
--- 16,25 ----

 copying is ok, just don't remove my name or try to sell it.
 read the man pages first.
+ -------------------------------------------------------------------------------
+ Notes on GNU zip (gzip) modifications by Mark Borges <[email protected]>
+
+ 1) You will need to obtain gzip version 1.2.3 or later for GNU archive sites.
+
+ 2) `zcat' is presumed to be that distributed with gzip; specifically, GNU
+     zcat *must* come before /usr/ucb/zcat.
diff -C3 man-orig/catman man-fix/catman
*** man-orig/catman     Sun Aug 15 23:25:06 1993
--- man-fix/catman      Mon Aug 16 09:22:59 1993
***************
*** 12,18 ****
 $EQN      = "neqn";
 # $MAKEWHATIS = "/usr/lib/makewhatis";
 $MAKEWHATIS = "/usr/local/lib/makewhatis";
! $COMPRESS   = "compress";
 $NROFF            = "nroff";
 $COL      = "col";
 $CAT      = "cat";
--- 12,18 ----
 $EQN      = "neqn";
 # $MAKEWHATIS = "/usr/lib/makewhatis";
 $MAKEWHATIS = "/usr/local/lib/makewhatis";
! $COMPRESS   = "gzip";
 $NROFF            = "nroff";
 $COL      = "col";
 $CAT      = "cat";
***************
*** 98,116 ****
           }

           ($catpage = $manpage)
!               =~ s,^(.*)/man([^\.]*)(\.Z)?/([^/]*)$,$1/cat$2$3/$4,;

           ($catdir = $catpage) =~ s#/[^/]*$##;
           next manpage unless -d $catdir && -w _;

           if ((stat(_))[9] > (stat($catpage))[9]) {
!               $command = (($manpage =~ m:\.Z:) ? $ZCAT : $CAT)
                           . " < $manpage | $CATSET";

               $command = &insert_filters($command, $manpage);
               $command =~ s,-man,$path/tmac.an, if -e "$path/tmac.an";

!               $command .= "| $COMPRESS " if $catpage =~ /\.Z/;

               $command .= "> $catpage";

--- 98,116 ----
           }

           ($catpage = $manpage)
!               =~ s,^(.*)/man([^\.]*)(\.(g?z|Z))?/([^/]*)$,$1/cat$2$3/$4,;

           ($catdir = $catpage) =~ s#/[^/]*$##;
           next manpage unless -d $catdir && -w _;

           if ((stat(_))[9] > (stat($catpage))[9]) {
!               $command = (($manpage =~ m:\.(g?z|Z):) ? $ZCAT : $CAT)
                           . " < $manpage | $CATSET";

               $command = &insert_filters($command, $manpage);
               $command =~ s,-man,$path/tmac.an, if -e "$path/tmac.an";

!               $command .= "| $COMPRESS " if $catpage =~ /\.(g?z|Z)/;

               $command .= "> $catpage";

diff -C3 man-orig/makewhatis man-fix/makewhatis
*** man-orig/makewhatis Sun Aug 15 23:25:08 1993
--- man-fix/makewhatis  Mon Aug 16 11:01:46 1993
***************
*** 14,20 ****

 ($program = $0) =~ s,.*/,,;

! $UNCOMPRESS = "uncompress";

 $MAXWHATISLEN =  300;
 $MAXDATUM     = 1024;         # DBM is such a pain
--- 14,20 ----

 ($program = $0) =~ s,.*/,,;

! $UNCOMPRESS = "gunzip";

 $MAXWHATISLEN =  300;
 $MAXDATUM     = 1024;         # DBM is such a pain
***************
*** 119,125 ****
       }

       ($dirext) = $mandir =~ /man(.*)$/;
!       $dirext =~ s/\.Z$//;

       print "subdir is $mandir\n" if $debug;

--- 119,125 ----
       }

       ($dirext) = $mandir =~ /man(.*)$/;
!       $dirext =~ s/\.(g?z|Z)$//;

       print "subdir is $mandir\n" if $debug;

***************
*** 131,137 ****
       # read each file in directory.  use readdir not globbing
       # because we don't want to blow up on huge directories
 FILE: while ($FILE = readdir(mandir)) {
!           $compressed = $mandir =~ m:.*\.Z:;
           next FILE if $FILE =~ /^\.{1,2}/;

           if ($FILE !~ /\S\.[^Z\s]/) {
--- 131,137 ----
       # read each file in directory.  use readdir not globbing
       # because we don't want to blow up on huge directories
 FILE: while ($FILE = readdir(mandir)) {
!           $compressed = $mandir =~ m:.*\.(g?z|Z):;
           next FILE if $FILE =~ /^\.{1,2}/;

           if ($FILE !~ /\S\.[^Z\s]/) {
***************
*** 140,162 ****
           }

           # this will be optimized into a case statement
!           if      ($FILE =~ /\.old(\.Z)?$/i) {
               next;
!           } elsif ($FILE =~ /\.bak(\.Z)?$/i) {
               next;
!           } elsif ($FILE =~ /\.out(\.Z)?$/i) {
               next;
!           } elsif ($FILE =~ /~(\.Z)?$/) {
               next;
           }

!           ($tmpfile = $FILE) =~ s/\.Z$//;

           ($filenam, $filext) =
               $tmpfile =~ /^(\S+)\.([^.]+)$/;

!           #if ($filext eq '.Z') {
!               #($filenam, $filext) = $filenam =~ /^(\S+)\.([^.]+)(\.Z)?$/;
           #}

           if ($filext !~ /^${dirext}.*/ && $mandir ne 'mano') {
--- 140,165 ----
           }

           # this will be optimized into a case statement
!           if      ($FILE =~ /\.old(\.(g?z|Z))?$/i) {
               next;
!           } elsif ($FILE =~ /\.bak(\.(g?z|Z))?$/i) {
               next;
!           } elsif ($FILE =~ /\.out(\.(g?z|Z))?$/i) {
               next;
!           } elsif ($FILE =~ /~(\.(g?z|Z))?$/) {
               next;
           }

!           ($tmpfile = $FILE) =~ s/\.(g?z|Z)$//;

           ($filenam, $filext) =
               $tmpfile =~ /^(\S+)\.([^.]+)$/;

! # Tom has the following commented out, so I'll follow suit <mdb>.
!
!           #if ($filext eq '.Z' || $filext eq '.gz' || $filext eq '.z' )
!           #{
!               #($filenam, $filext) = $filenam =~ /^(\S+)\.([^.]+)(\.(g?z|Z))?$/;
           #}

           if ($filext !~ /^${dirext}.*/ && $mandir ne 'mano') {
***************
*** 183,196 ****
               &chopext($page = $FILE);
               unless ($WHATIS{$page}) {
                   print "forgot $page\n" if $debug;
!                   $apage =~ s/\.Z$//;
                   &store_indirect($page, $apage);
               }
               next FILE;
           }
           $seen{$st_dev,$st_ino} = $FILE;

!           $compressed |= $FILE =~ /\.Z$/;

           if (!open(FILE, $compressed ? "$UNCOMPRESS < $FILE |" : $FILE)) {
               warn "can't open $FILE: $!\n";
--- 186,199 ----
               &chopext($page = $FILE);
               unless ($WHATIS{$page}) {
                   print "forgot $page\n" if $debug;
!                   $apage =~ s/\.(g?z|Z)$//;
                   &store_indirect($page, $apage);
               }
               next FILE;
           }
           $seen{$st_dev,$st_ino} = $FILE;

!           $compressed |= $FILE =~ /\.(g?z|Z)$/;

           if (!open(FILE, $compressed ? "$UNCOMPRESS < $FILE |" : $FILE)) {
               warn "can't open $FILE: $!\n";
***************
*** 273,280 ****
       $indirect = $1;
       ($page)  = $FILE     =~ m:([^.]+)\.[^.]*$:;
       ($page2) = $indirect =~ m:.*/([^/]+)$:;
!       ($indirect2 = $indirect) =~ s!/!.Z/!;
!       if (-e "../$indirect" || -e "../$indirect.Z" || -e $indirect2) {
           $so{$page} = $page2;
           print "$FILE: .so alias for $indirect\n" if $debug;
       } else {
--- 276,283 ----
       $indirect = $1;
       ($page)  = $FILE     =~ m:([^.]+)\.[^.]*$:;
       ($page2) = $indirect =~ m:.*/([^/]+)$:;
!       ($indirect2 = $indirect) =~ s!/!.z/!;
!       if (-e "../$indirect" || -e "../$indirect.z" || -e $indirect2) {
           $so{$page} = $page2;
           print "$FILE: .so alias for $indirect\n" if $debug;
       } else {
***************
*** 338,344 ****
               $cmdlist = substr($cmdlist,0,$MAXWHATISLEN) . "...";
           }

!           ($tmpfile = $FILE) =~ s/\.Z$//;
           ($page, $section) = $tmpfile =~ /^(\S+)\.(\S+)$/;
           $cmdlist = $page if $needcmdlist;

--- 341,347 ----
               $cmdlist = substr($cmdlist,0,$MAXWHATISLEN) . "...";
           }

!           ($tmpfile = $FILE) =~ s/\.(g?z|Z)$//;
           ($page, $section) = $tmpfile =~ /^(\S+)\.(\S+)$/;
           $cmdlist = $page if $needcmdlist;

***************
*** 367,373 ****
     }
     unless ($foundname) {
       print STDERR "$FILE: no NAME lines, so has no whatis description!\n";
!       ($tmpfile = $FILE) =~ s/\.Z$//;
       ($page, $section) = $tmpfile =~ /^(\S+)\.(\S+)$/;
       &store_direct($page, $page, $tmpfile, $dirext, 'NO DESCRIPTION');
     }
--- 370,376 ----
     }
     unless ($foundname) {
       print STDERR "$FILE: no NAME lines, so has no whatis description!\n";
!       ($tmpfile = $FILE) =~ s/\.(g?z|Z)$//;
       ($page, $section) = $tmpfile =~ /^(\S+)\.(\S+)$/;
       &store_direct($page, $page, $tmpfile, $dirext, 'NO DESCRIPTION');
     }
***************
*** 387,393 ****


 sub chopext {
!     $_[0] =~ s/\.Z$//;
     $_[0] =~ s/\.[^.]+$//;
 }

--- 390,396 ----


 sub chopext {
!     $_[0] =~ s/\.(g?z|Z)$//;
     $_[0] =~ s/\.[^.]+$//;
 }

diff -C3 man-orig/makewhatis.8 man-fix/makewhatis.8
*** man-orig/makewhatis.8       Sun Aug 15 23:25:05 1993
--- man-fix/makewhatis.8        Mon Aug 16 10:16:33 1993
***************
*** 143,151 ****
 if the name of the subdirectory itself ends in \fB.Z\fP, as in \fBman8.Z\fP,
 then all its files are assumed to have been compressed with
 .M compress 1L .
! Alternatively, individual files ending in \fB.Z\fP are also
! considered to be compressed.
! Compressed files are processed with
 .M zcat 1L .
 .SH EXAMPLES
 .ft TA
--- 143,153 ----
 if the name of the subdirectory itself ends in \fB.Z\fP, as in \fBman8.Z\fP,
 then all its files are assumed to have been compressed with
 .M compress 1L .
! Alternatively, individual files ending in \fB.gz\fP, \fB.z\fP, or \fB.Z\fP are
! also considered to be compressed. These compressed files are processed with
! the GNU zip
! .M gzip 1L
! version of
 .M zcat 1L .
 .SH EXAMPLES
 .ft TA
***************
*** 171,176 ****
--- 173,179 ----
 apropos(1),
 perl(1),
 compress(1L),
+ gzip(1L),
 dbm(3X),
 man(7),
 catman(8)
***************
*** 350,356 ****
 takes much longer to run if man pages are stored in compressed form.
 .SH BUGS
 Not all systems have
! .I compress
 installed on them.
 .SH AUTHOR
 Tom Christiansen
--- 353,361 ----
 takes much longer to run if man pages are stored in compressed form.
 .SH BUGS
 Not all systems have
! .I compress
! or
! .I gzip
 installed on them.
 .SH AUTHOR
 Tom Christiansen
diff -C3 man-orig/man man-fix/man
*** man-orig/man        Sun Aug 15 23:25:10 1993
--- man-fix/man Mon Aug 16 10:40:53 1993
***************
*** 6,11 ****
--- 6,13 ----
 # Copyright 1990 Convex Computer Corporation.
 # All rights reserved.
 #
+ # Revised 16 Aug 1993 by Mark Borges <[email protected]>
+ # to handle GNU zip (gzip) *individually* compressed man pages.
 # --------------------------------------------------------------------------
 # begin configuration section
 #
***************
*** 58,71 ****
 $UL     = '';         # set to '' if you haven't got ul
 die 'need either $UL or $COL' unless $UL || $COL;

! # need these for .Z files or dirs
! $COMPRESS = 'compress';
 $ZCAT   = 'zcat';
 $CAT    = 'cat';

 # define COMPRESS_DIR if pages might have moved to manX.Z/page.X (like HPs)
! $COMPRESS_DIR = 1;
! # define COMPRESS_PAGE if pages might have moved to manX/page.X.Z  (better)
 $COMPRESS_PAGE = 1;

 # Command to format man pages to be viewed on a tty or printed on a line printer
--- 60,75 ----
 $UL     = '';         # set to '' if you haven't got ul
 die 'need either $UL or $COL' unless $UL || $COL;

! # need these for Gzip'ed files or dirs
! # $ZCAT must point to the gzip-supplied `zcat'. <mdb>
! $COMPRESS = 'gunzip';
 $ZCAT   = 'zcat';
 $CAT    = 'cat';

 # define COMPRESS_DIR if pages might have moved to manX.Z/page.X (like HPs)
! # This has *not* been hacked to work with GZIP <mdb>.
! $COMPRESS_DIR = 0;
! # define COMPRESS_PAGE if pages might have moved to manX/page.X.gz  (better)
 $COMPRESS_PAGE = 1;

 # Command to format man pages to be viewed on a tty or printed on a line printer
***************
*** 79,85 ****

 # flags: GNU likes -i, BSD doesn't; both like -h, but BSD doesn't document it
 # if you don't put -i here, i'll make up for it later the hard way
! $EGREP = '/usr/local/bin/egrep';
 if (-x $EGREP) {
     $EGREP .= ' -i -h';
 } else {
--- 83,90 ----

 # flags: GNU likes -i, BSD doesn't; both like -h, but BSD doesn't document it
 # if you don't put -i here, i'll make up for it later the hard way
! #$EGREP = '/usr/local/bin/egrep';
! $EGREP = '/gfdl2/mdb/gnu/bin/egrep';
 if (-x $EGREP) {
     $EGREP .= ' -i -h';
 } else {
***************
*** 459,466 ****
       printed (if -d flag) and -h will be assumed for that \$manroot only.
     * If \$manroot/tmac.an exists, it will be used for formatting
       instead of the normal -man macros.
!     * Man pages may be compressed either in (for example) man1.Z/who.1
!         or man1/who.1.Z; cat pages will go into corresponding places.
     * If the man page contains .EQ or .TS directives, eqn and/or tbl
         will be invoked as needed at format time.
 USAGE
--- 464,472 ----
       printed (if -d flag) and -h will be assumed for that \$manroot only.
     * If \$manroot/tmac.an exists, it will be used for formatting
       instead of the normal -man macros.
!     * Man pages may be compressed in (for example) man1/who.1.gz,
!       man1/who.1.z, or man1/who.1.Z; cat pages will go into corresponding
!       places.
     * If the man page contains .EQ or .TS directives, eqn and/or tbl
         will be invoked as needed at format time.
 USAGE
***************
*** 776,784 ****
     return $path if -f $path;

     if ($COMPRESS_PAGE) {
!       $path .= '.Z';
       return $path if -f $path;
!       $path =~ s/.Z//;
     }

     if ($COMPRESS_DIR) {
--- 782,794 ----
     return $path if -f $path;

     if ($COMPRESS_PAGE) {
!       $path = join('',$orig,'.gz');
       return $path if -f $path;
!       $path = join('',$orig,'.z');
!       return $path if -f $path;
!       $path = join('',$orig,'.Z');
!       return $path if -f $path;
! #     $path =~ s/.Z//;
     }

     if ($COMPRESS_DIR) {
***************
*** 816,823 ****
 sub bysection {
     local ($e1, $e2, $p1, $p2, $s1, $s2);

!     ($s1, $e1) = $a =~ m:.*/man([^/]+)/.*\.([^.]+)(\.Z)?$:;
!     ($s2, $e2) = $b =~ m:.*/man([^/]+)/.*\.([^.]+)(\.Z)?$:;

     $e1 = $s1 if $e1 !~ /^${s1}.*/;
     $e2 = $s2 if $e2 !~ /^${s2}.*/;
--- 826,833 ----
 sub bysection {
     local ($e1, $e2, $p1, $p2, $s1, $s2);

!     ($s1, $e1) = $a =~ m:.*/man([^/]+)/.*\.([^.]+)(\.(g?z|Z))?$:;
!     ($s2, $e2) = $b =~ m:.*/man([^/]+)/.*\.([^.]+)(\.(g?z|Z))?$:;

     $e1 = $s1 if $e1 !~ /^${s1}.*/;
     $e2 = $s2 if $e2 !~ /^${s2}.*/;
***************
*** 863,871 ****
     local ($manroot);
     local ($macros);

!     ($manroot) = $file =~ m,^(.*)/man([^\.]*)(\.Z)?/([^/]*),;

!     $command = ((($file =~ m:\.Z:)
                       ? $ZCAT
                       : $CAT)
               . " < $file | $TYPESET");
--- 873,881 ----
     local ($manroot);
     local ($macros);

!     ($manroot) = $file =~ m,^(.*)/man([^\.]*)(\.(g?z|Z))?/([^/]*),;

!     $command = ((($file =~ m:\.(g?z|Z):)
                       ? $ZCAT
                       : $CAT)
               . " < $file | $TYPESET");
***************
*** 899,905 ****
       return;
     }
     if ($fromfile) {
!       $command = (($manpage =~ m:\.Z/:) ? $ZCAT : $CAT)
                       . " < $manpage | $CATSET";
       &insert_filters($command, $manpage);
     } else {
--- 909,915 ----
       return;
     }
     if ($fromfile) {
!       $command = (($manpage =~ m:\.(g?z|Z):) ? $ZCAT : $CAT)
                       . " < $manpage | $CATSET";
       &insert_filters($command, $manpage);
     } else {
***************
*** 908,914 ****


       ($catpage = $manpage)
!           =~ s,^(.*)/man([^\.]*)(\.Z)?/([^/]*)$,$1/cat$2/$4,;

       $manroot = $1;

--- 918,924 ----


       ($catpage = $manpage)
!           =~ s,^(.*)/man([^\.]*)(\.(g?z|Z))?/([^/]*)$,$1/cat$2/$4,;

       $manroot = $1;

***************
*** 940,946 ****

       if ($st_cat[$ST_MTIME] < $st_man[$ST_MTIME]) {

!           $command = (($manpage =~ m:\.Z:) ? $ZCAT : $CAT)
                       . " < $manpage | $CATSET";

           $command = &insert_filters($command, $manpage);
--- 950,956 ----

       if ($st_cat[$ST_MTIME] < $st_man[$ST_MTIME]) {

!           $command = (($manpage =~ m:\.(g?z|Z):) ? $ZCAT : $CAT)
                       . " < $manpage | $CATSET";

           $command = &insert_filters($command, $manpage);
***************
*** 962,968 ****

           printf STDERR "Reformatting page.  Please wait ... " if $isatty;

!           $command .= "| $COMPRESS" if $catpage =~ /\.Z/;
           $command .= "> $tmppage";

           $SIG{'INT'} = $SIG{'QUIT'} = $SIG{'HUP'} = $SIG{'TERM'}
--- 972,978 ----

           printf STDERR "Reformatting page.  Please wait ... " if $isatty;

!           $command .= "| $COMPRESS" if $catpage =~ /\.(g?z|Z)/;
           $command .= "> $tmppage";

           $SIG{'INT'} = $SIG{'QUIT'} = $SIG{'HUP'} = $SIG{'TERM'}
***************
*** 994,1000 ****
               $SIG{'PIPE'} = 'DEFAULT';

       }
!       $command = (($catpage =~ m:\.Z:)
                       ? $ZCAT
                       : $CAT)
                   . " < $catpage";
--- 1004,1010 ----
               $SIG{'PIPE'} = 'DEFAULT';

       }
!       $command = (($catpage =~ m:\.(g?z|Z):)
                       ? $ZCAT
                       : $CAT)
                   . " < $catpage";
***************
*** 1088,1099 ****
     local($c, $PAGE) = @_;
     local($page,$sect, $prs, $prdir);

!     ( $page = $PAGE ) =~ s/\.Z//;
     ($prdir = $page) =~ s#/[^/]*$##;
     $prdir =~ s#man([^/]*)$#pr$1#;
     $page =~ s#.*/([^/]+)$#$1#;

!     $PAGE = "$ZCAT < $PAGE|" if $PAGE =~ /\.Z/;

     (open PAGE) || die ("$program: can't open $PAGE to check filters: $!\n");
     warn "open $PAGE to check for filters in $_[0]\n" if $debug;
--- 1098,1109 ----
     local($c, $PAGE) = @_;
     local($page,$sect, $prs, $prdir);

!     ( $page = $PAGE ) =~ s/\.(g?z|Z)//;
     ($prdir = $page) =~ s#/[^/]*$##;
     $prdir =~ s#man([^/]*)$#pr$1#;
     $page =~ s#.*/([^/]+)$#$1#;

!     $PAGE = "$ZCAT < $PAGE|" if $PAGE =~ /\.(g?z|Z)/;

     (open PAGE) || die ("$program: can't open $PAGE to check filters: $!\n");
     warn "open $PAGE to check for filters in $_[0]\n" if $debug;
***************
*** 1226,1233 ****
     local(@retlist, $maxlen, $header, @idx , @st_man, @st_idx);
     # global no_idx_file, idx_file

!     ( $idx_file = $manpage ) =~ s:/man(\w+)(\.Z)?/:/idx$1/:;
!     $idx_file =~ s/\.Z//;

     require 'stat.pl' unless defined &Stat;

--- 1236,1243 ----
     local(@retlist, $maxlen, $header, @idx , @st_man, @st_idx);
     # global no_idx_file, idx_file

!     ( $idx_file = $manpage ) =~ s:/man(\w+)(\.(g?z|Z))?/:/idx$1/:;
!     $idx_file =~ s/\.(g?z|Z)//;

     require 'stat.pl' unless defined &Stat;

***************
*** 1244,1250 ****
       return @saveidx = @retlist;
     }

!     if (!open(manpage, $manpage =~ /\.Z/ ? "$ZCAT < $manpage|" : $manpage)) {
       warn "$program: can't open $manpage: $!\n";
       return ();
     }
--- 1254,1260 ----
       return @saveidx = @retlist;
     }

!     if (!open(manpage, $manpage =~ /\.(g?z|Z)/ ? "$ZCAT < $manpage|" : $manpage)) {
       warn "$program: can't open $manpage: $!\n";
       return ();
     }
***************
*** 1483,1489 ****
                   print "skipping non-man file: $path\n" if $debug;
                   next;
               }
!               if ($FILE =~ /\.Z$/ || $dir =~ /\.Z$/) {
                   $FILE = "$ZCAT $FILE|";
               }
               print STDERR "grepping $path\n" if $debug;
--- 1493,1499 ----
                   print "skipping non-man file: $path\n" if $debug;
                   next;
               }
!               if ($FILE =~ /\.(g?z|Z)$/ || $dir =~ /\.(g?z|Z)$/) {
                   $FILE = "$ZCAT $FILE|";
               }
               print STDERR "grepping $path\n" if $debug;
diff -C3 man-orig/man.1 man-fix/man.1
*** man-orig/man.1      Sun Aug 15 23:25:06 1993
--- man-fix/man.1       Sun Aug 15 23:39:17 1993
***************
*** 481,489 ****
 .B \-g
 Grep through all man pages for one or more
 .I perl
! expressions.  Compressed man pages will be
! correctly processed
! by
 .M zcat 1L .
 .TP
 .B \-t
--- 481,488 ----
 .B \-g
 Grep through all man pages for one or more
 .I perl
! expressions.  Compressed man pages will be correctly processed
! by the GNU zip (Gzip) version of
 .M zcat 1L .
 .TP
 .B \-t
***************
*** 724,729 ****
--- 723,729 ----
 .M nroff 1 ,
 .M troff 1L ,
 .M compress 1L ,
+ .M gzip 1L ,
 .M dbm 3X ,
 .M man 7 ,
 .M catman 8 ,
***************
*** 777,785 ****
 \fIul\fP,
 \fIcol\fP,
 \fIegrep\fP, and
! \fIcompress\fP
 .IP \(bu 5
! whether you have compressed man pages and how they are stored
 .IP \(bu 5
 which section aliases you want (as in
 .B public
--- 777,785 ----
 \fIul\fP,
 \fIcol\fP,
 \fIegrep\fP, and
! \fIgzip\fP
 .IP \(bu 5
! whether you have gziped man pages and how they are stored
 .IP \(bu 5
 which section aliases you want (as in
 .B public
***************
*** 794,806 ****
 .PP
 To save disk space at the expense of execution time, a site may
 wish to run
! .M compress 1L
 on the manual entries where available.  The
 .I man
 program
! understands how to read compressed man
! pages, and knows to create a compressed cat page if the source
! man page was compressed to start with.
 .PP
 When running on slow \s-1CPU\s0s, the start-up time for parsing the
 script may be annoying.  These sites can skip this parsing phase
--- 794,806 ----
 .PP
 To save disk space at the expense of execution time, a site may
 wish to run
! .M gzip 1L
 on the manual entries where available.  The
 .I man
 program
! understands how to read gziped man
! pages, and knows to create a gziped cat page if the source
! man page was gziped to start with.
 .PP
 When running on slow \s-1CPU\s0s, the start-up time for parsing the
 script may be annoying.  These sites can skip this parsing phase
***************
*** 941,947 ****
 .IR troff .
 .PP
 Not all systems have
! .I compress
 installed on them.
 .SH AUTHOR
 Tom Christiansen
--- 941,947 ----
 .IR troff .
 .PP
 Not all systems have
! .I gzip
 installed on them.
 .SH AUTHOR
 Tom Christiansen

>> Bill Middleton(wjm) wrote on Thu, 2 Sep 1993 15:58:04 -0500:
wjm> Yes please.
Appended below.

Mark

---------- 8< ---------- 8< ---------- 8< ---------- 8< ---------- 8< --------
diff -C3 man-orig/CHANGES man-fix/CHANGES
*** man-orig/CHANGES    Sun Aug 15 23:25:08 1993
--- man-fix/CHANGES     Mon Aug 16 10:25:00 1993
***************
*** 1,3 ****
--- 1,5 ----
+ 16 Aug 93: Modified by Mark Borges <[email protected]> to
+            handle GNU zip (gzip) compressed files.

     *   extra utils

diff -C3 man-orig/README man-fix/README
*** man-orig/README     Sun Aug 15 23:25:07 1993
--- man-fix/README      Thu Sep  2 15:13:57 1993
***************
*** 16,18 ****
--- 16,49 ----

 copying is ok, just don't remove my name or try to sell it.
 read the man pages first.
+ -------------------------------------------------------------------------------
+ Notes on GNU zip (gzip) modifications by Mark Borges <[email protected]>
+
+ 1) You will need to obtain gzip version 1.2.3 or later from GNU archive sites.
+
+ 2) $ZCAT is presumed to be that distributed with gzip; specifically, GNU
+     zcat *must* come before /usr/ucb/zcat. By default, $ZCAT = zcat;
+     you may want to change it to $ZCAT = gzcat; if necessary.
+
+ 3) COMPRESS_DIR is disabled by default. I don't use it, and I don't
+    know how to fix it.
+
+ 4) There is a known inconsistency in the creation of compressed
+    cat-pages from compressed man-pages. This is because:
+
+       a) provision is made for only one COMPRESS program (gzip by
+          default);
+
+       b) gzip can only write gzip files, not compress files.
+
+    As a consequence, compressed cat-pages created from compressed
+    man-pages by gzip, may be misleading, e.g.,
+
+       man/man1/who.1.Z -> man/cat1/who.1.Z, if possible
+
+    but man1/who.1.Z is compressed, while cat1/who.1.Z is gzip'd. This
+    is not a problem if you use the gzip version of zcat (it ignores
+    the suffix anyway). If someone wants to take the time to fix this,
+    please e-mail me any patches.
+
+
diff -C3 man-orig/catman man-fix/catman
*** man-orig/catman     Sun Aug 15 23:25:06 1993
--- man-fix/catman      Thu Sep  2 15:32:59 1993
***************
*** 12,18 ****
 $EQN      = "neqn";
 # $MAKEWHATIS = "/usr/lib/makewhatis";
 $MAKEWHATIS = "/usr/local/lib/makewhatis";
! $COMPRESS   = "compress";
 $NROFF            = "nroff";
 $COL      = "col";
 $CAT      = "cat";
--- 12,18 ----
 $EQN      = "neqn";
 # $MAKEWHATIS = "/usr/lib/makewhatis";
 $MAKEWHATIS = "/usr/local/lib/makewhatis";
! $COMPRESS   = "gzip";
 $NROFF            = "nroff";
 $COL      = "col";
 $CAT      = "cat";
***************
*** 93,116 ****
           }

           if (!-e $manpage) {
!               $manpage .= '.Z';
               next unless -e $manpage;
           }

           ($catpage = $manpage)
!               =~ s,^(.*)/man([^\.]*)(\.Z)?/([^/]*)$,$1/cat$2$3/$4,;

           ($catdir = $catpage) =~ s#/[^/]*$##;
           next manpage unless -d $catdir && -w _;

           if ((stat(_))[9] > (stat($catpage))[9]) {
!               $command = (($manpage =~ m:\.Z:) ? $ZCAT : $CAT)
                           . " < $manpage | $CATSET";

               $command = &insert_filters($command, $manpage);
               $command =~ s,-man,$path/tmac.an, if -e "$path/tmac.an";

!               $command .= "| $COMPRESS " if $catpage =~ /\.Z/;

               $command .= "> $catpage";

--- 93,122 ----
           }

           if (!-e $manpage) {
!               if (-e "${manpage}.gz") {
!                   $manpage .= '.gz';
!               } elsif (-e "${manpage}.z") {
!                   $manpage .= '.z';
!               } elsif (-e "${manpage}.Z") {
!                   $manpage .= '.Z';
!               }
               next unless -e $manpage;
           }

           ($catpage = $manpage)
!               =~ s,^(.*)/man([^\.]*)(\.(g?z|Z))?/([^/]*)$,$1/cat$2$3/$5,;

           ($catdir = $catpage) =~ s#/[^/]*$##;
           next manpage unless -d $catdir && -w _;

           if ((stat(_))[9] > (stat($catpage))[9]) {
!               $command = (($manpage =~ m:\.(g?z|Z):) ? $ZCAT : $CAT)
                           . " < $manpage | $CATSET";

               $command = &insert_filters($command, $manpage);
               $command =~ s,-man,$path/tmac.an, if -e "$path/tmac.an";

!               $command .= "| $COMPRESS " if $catpage =~ /\.(g?z|Z)/;

               $command .= "> $catpage";

***************
*** 136,142 ****
     local($command, $PAGE) = @_;


!     $PAGE = "$ZCAT < $PAGE|" if $PAGE =~ /\.Z/;

     (open PAGE) || die ("can't open $page to check filters: $!\n");

--- 142,148 ----
     local($command, $PAGE) = @_;


!     $PAGE = "$ZCAT < $PAGE|" if $PAGE =~ /(\.(g?z|Z))/;

     (open PAGE) || die ("can't open $page to check filters: $!\n");

diff -C3 man-orig/makewhatis man-fix/makewhatis
*** man-orig/makewhatis Sun Aug 15 23:25:08 1993
--- man-fix/makewhatis  Mon Aug 16 11:01:46 1993
***************
*** 14,20 ****

 ($program = $0) =~ s,.*/,,;

! $UNCOMPRESS = "uncompress";

 $MAXWHATISLEN =  300;
 $MAXDATUM     = 1024;         # DBM is such a pain
--- 14,20 ----

 ($program = $0) =~ s,.*/,,;

! $UNCOMPRESS = "gunzip";

 $MAXWHATISLEN =  300;
 $MAXDATUM     = 1024;         # DBM is such a pain
***************
*** 119,125 ****
       }

       ($dirext) = $mandir =~ /man(.*)$/;
!       $dirext =~ s/\.Z$//;

       print "subdir is $mandir\n" if $debug;

--- 119,125 ----
       }

       ($dirext) = $mandir =~ /man(.*)$/;
!       $dirext =~ s/\.(g?z|Z)$//;

       print "subdir is $mandir\n" if $debug;

***************
*** 131,137 ****
       # read each file in directory.  use readdir not globbing
       # because we don't want to blow up on huge directories
 FILE: while ($FILE = readdir(mandir)) {
!           $compressed = $mandir =~ m:.*\.Z:;
           next FILE if $FILE =~ /^\.{1,2}/;

           if ($FILE !~ /\S\.[^Z\s]/) {
--- 131,137 ----
       # read each file in directory.  use readdir not globbing
       # because we don't want to blow up on huge directories
 FILE: while ($FILE = readdir(mandir)) {
!           $compressed = $mandir =~ m:.*\.(g?z|Z):;
           next FILE if $FILE =~ /^\.{1,2}/;

           if ($FILE !~ /\S\.[^Z\s]/) {
***************
*** 140,162 ****
           }

           # this will be optimized into a case statement
!           if      ($FILE =~ /\.old(\.Z)?$/i) {
               next;
!           } elsif ($FILE =~ /\.bak(\.Z)?$/i) {
               next;
!           } elsif ($FILE =~ /\.out(\.Z)?$/i) {
               next;
!           } elsif ($FILE =~ /~(\.Z)?$/) {
               next;
           }

!           ($tmpfile = $FILE) =~ s/\.Z$//;

           ($filenam, $filext) =
               $tmpfile =~ /^(\S+)\.([^.]+)$/;

!           #if ($filext eq '.Z') {
!               #($filenam, $filext) = $filenam =~ /^(\S+)\.([^.]+)(\.Z)?$/;
           #}

           if ($filext !~ /^${dirext}.*/ && $mandir ne 'mano') {
--- 140,165 ----
           }

           # this will be optimized into a case statement
!           if      ($FILE =~ /\.old(\.(g?z|Z))?$/i) {
               next;
!           } elsif ($FILE =~ /\.bak(\.(g?z|Z))?$/i) {
               next;
!           } elsif ($FILE =~ /\.out(\.(g?z|Z))?$/i) {
               next;
!           } elsif ($FILE =~ /~(\.(g?z|Z))?$/) {
               next;
           }

!           ($tmpfile = $FILE) =~ s/\.(g?z|Z)$//;

           ($filenam, $filext) =
               $tmpfile =~ /^(\S+)\.([^.]+)$/;

! # Tom has the following commented out, so I'll follow suit <mdb>.
!
!           #if ($filext eq '.Z' || $filext eq '.gz' || $filext eq '.z' )
!           #{
!               #($filenam, $filext) = $filenam =~ /^(\S+)\.([^.]+)(\.(g?z|Z))?$/;
           #}

           if ($filext !~ /^${dirext}.*/ && $mandir ne 'mano') {
***************
*** 183,196 ****
               &chopext($page = $FILE);
               unless ($WHATIS{$page}) {
                   print "forgot $page\n" if $debug;
!                   $apage =~ s/\.Z$//;
                   &store_indirect($page, $apage);
               }
               next FILE;
           }
           $seen{$st_dev,$st_ino} = $FILE;

!           $compressed |= $FILE =~ /\.Z$/;

           if (!open(FILE, $compressed ? "$UNCOMPRESS < $FILE |" : $FILE)) {
               warn "can't open $FILE: $!\n";
--- 186,199 ----
               &chopext($page = $FILE);
               unless ($WHATIS{$page}) {
                   print "forgot $page\n" if $debug;
!                   $apage =~ s/\.(g?z|Z)$//;
                   &store_indirect($page, $apage);
               }
               next FILE;
           }
           $seen{$st_dev,$st_ino} = $FILE;

!           $compressed |= $FILE =~ /\.(g?z|Z)$/;

           if (!open(FILE, $compressed ? "$UNCOMPRESS < $FILE |" : $FILE)) {
               warn "can't open $FILE: $!\n";
***************
*** 273,280 ****
       $indirect = $1;
       ($page)  = $FILE     =~ m:([^.]+)\.[^.]*$:;
       ($page2) = $indirect =~ m:.*/([^/]+)$:;
!       ($indirect2 = $indirect) =~ s!/!.Z/!;
!       if (-e "../$indirect" || -e "../$indirect.Z" || -e $indirect2) {
           $so{$page} = $page2;
           print "$FILE: .so alias for $indirect\n" if $debug;
       } else {
--- 276,283 ----
       $indirect = $1;
       ($page)  = $FILE     =~ m:([^.]+)\.[^.]*$:;
       ($page2) = $indirect =~ m:.*/([^/]+)$:;
!       ($indirect2 = $indirect) =~ s!/!.z/!;
!       if (-e "../$indirect" || -e "../$indirect.z" || -e $indirect2) {
           $so{$page} = $page2;
           print "$FILE: .so alias for $indirect\n" if $debug;
       } else {
***************
*** 338,344 ****
               $cmdlist = substr($cmdlist,0,$MAXWHATISLEN) . "...";
           }

!           ($tmpfile = $FILE) =~ s/\.Z$//;
           ($page, $section) = $tmpfile =~ /^(\S+)\.(\S+)$/;
           $cmdlist = $page if $needcmdlist;

--- 341,347 ----
               $cmdlist = substr($cmdlist,0,$MAXWHATISLEN) . "...";
           }

!           ($tmpfile = $FILE) =~ s/\.(g?z|Z)$//;
           ($page, $section) = $tmpfile =~ /^(\S+)\.(\S+)$/;
           $cmdlist = $page if $needcmdlist;

***************
*** 367,373 ****
     }
     unless ($foundname) {
       print STDERR "$FILE: no NAME lines, so has no whatis description!\n";
!       ($tmpfile = $FILE) =~ s/\.Z$//;
       ($page, $section) = $tmpfile =~ /^(\S+)\.(\S+)$/;
       &store_direct($page, $page, $tmpfile, $dirext, 'NO DESCRIPTION');
     }
--- 370,376 ----
     }
     unless ($foundname) {
       print STDERR "$FILE: no NAME lines, so has no whatis description!\n";
!       ($tmpfile = $FILE) =~ s/\.(g?z|Z)$//;
       ($page, $section) = $tmpfile =~ /^(\S+)\.(\S+)$/;
       &store_direct($page, $page, $tmpfile, $dirext, 'NO DESCRIPTION');
     }
***************
*** 387,393 ****


 sub chopext {
!     $_[0] =~ s/\.Z$//;
     $_[0] =~ s/\.[^.]+$//;
 }

--- 390,396 ----


 sub chopext {
!     $_[0] =~ s/\.(g?z|Z)$//;
     $_[0] =~ s/\.[^.]+$//;
 }

diff -C3 man-orig/makewhatis.8 man-fix/makewhatis.8
*** man-orig/makewhatis.8       Sun Aug 15 23:25:05 1993
--- man-fix/makewhatis.8        Mon Aug 16 10:16:33 1993
***************
*** 143,151 ****
 if the name of the subdirectory itself ends in \fB.Z\fP, as in \fBman8.Z\fP,
 then all its files are assumed to have been compressed with
 .M compress 1L .
! Alternatively, individual files ending in \fB.Z\fP are also
! considered to be compressed.
! Compressed files are processed with
 .M zcat 1L .
 .SH EXAMPLES
 .ft TA
--- 143,153 ----
 if the name of the subdirectory itself ends in \fB.Z\fP, as in \fBman8.Z\fP,
 then all its files are assumed to have been compressed with
 .M compress 1L .
! Alternatively, individual files ending in \fB.gz\fP, \fB.z\fP, or \fB.Z\fP are
! also considered to be compressed. These compressed files are processed with
! the GNU zip
! .M gzip 1L
! version of
 .M zcat 1L .
 .SH EXAMPLES
 .ft TA
***************
*** 171,176 ****
--- 173,179 ----
 apropos(1),
 perl(1),
 compress(1L),
+ gzip(1L),
 dbm(3X),
 man(7),
 catman(8)
***************
*** 350,356 ****
 takes much longer to run if man pages are stored in compressed form.
 .SH BUGS
 Not all systems have
! .I compress
 installed on them.
 .SH AUTHOR
 Tom Christiansen
--- 353,361 ----
 takes much longer to run if man pages are stored in compressed form.
 .SH BUGS
 Not all systems have
! .I compress
! or
! .I gzip
 installed on them.
 .SH AUTHOR
 Tom Christiansen
diff -C3 man-orig/man man-fix/man
*** man-orig/man        Sun Aug 15 23:25:10 1993
--- man-fix/man Thu Sep  2 13:57:46 1993
***************
*** 6,11 ****
--- 6,13 ----
 # Copyright 1990 Convex Computer Corporation.
 # All rights reserved.
 #
+ # Revised 16 Aug 1993 by Mark Borges <[email protected]>
+ # to handle GNU zip (gzip) *individually* compressed man pages.
 # --------------------------------------------------------------------------
 # begin configuration section
 #
***************
*** 58,71 ****
 $UL     = '';         # set to '' if you haven't got ul
 die 'need either $UL or $COL' unless $UL || $COL;

! # need these for .Z files or dirs
! $COMPRESS = 'compress';
 $ZCAT   = 'zcat';
 $CAT    = 'cat';

 # define COMPRESS_DIR if pages might have moved to manX.Z/page.X (like HPs)
! $COMPRESS_DIR = 1;
! # define COMPRESS_PAGE if pages might have moved to manX/page.X.Z  (better)
 $COMPRESS_PAGE = 1;

 # Command to format man pages to be viewed on a tty or printed on a line printer
--- 60,75 ----
 $UL     = '';         # set to '' if you haven't got ul
 die 'need either $UL or $COL' unless $UL || $COL;

! # need these for Gzip'ed files or dirs
! # $ZCAT must point to the gzip-supplied `zcat'. <mdb>
! $COMPRESS = 'gzip';
 $ZCAT   = 'zcat';
 $CAT    = 'cat';

 # define COMPRESS_DIR if pages might have moved to manX.Z/page.X (like HPs)
! # This has *not* been hacked to work with GZIP <mdb>.
! $COMPRESS_DIR = 0;
! # define COMPRESS_PAGE if pages might have moved to manX/page.X.gz  (better)
 $COMPRESS_PAGE = 1;

 # Command to format man pages to be viewed on a tty or printed on a line printer
***************
*** 79,85 ****

 # flags: GNU likes -i, BSD doesn't; both like -h, but BSD doesn't document it
 # if you don't put -i here, i'll make up for it later the hard way
! $EGREP = '/usr/local/bin/egrep';
 if (-x $EGREP) {
     $EGREP .= ' -i -h';
 } else {
--- 83,90 ----

 # flags: GNU likes -i, BSD doesn't; both like -h, but BSD doesn't document it
 # if you don't put -i here, i'll make up for it later the hard way
! #$EGREP = '/usr/local/bin/egrep';
! $EGREP = '/gfdl2/mdb/gnu/bin/egrep';
 if (-x $EGREP) {
     $EGREP .= ' -i -h';
 } else {
***************
*** 459,466 ****
       printed (if -d flag) and -h will be assumed for that \$manroot only.
     * If \$manroot/tmac.an exists, it will be used for formatting
       instead of the normal -man macros.
!     * Man pages may be compressed either in (for example) man1.Z/who.1
!         or man1/who.1.Z; cat pages will go into corresponding places.
     * If the man page contains .EQ or .TS directives, eqn and/or tbl
         will be invoked as needed at format time.
 USAGE
--- 464,475 ----
       printed (if -d flag) and -h will be assumed for that \$manroot only.
     * If \$manroot/tmac.an exists, it will be used for formatting
       instead of the normal -man macros.
!     * Man pages may be compressed in (for example) man1/who.1.gz,
!       man1/who.1.z, or man1/who.1.Z; cat pages will go into corresponding
!       places. *** But***, as gzip only supports one ouput format,
!       man1/who.1.Z will be gzip'd, not compressed as the extension may
!       indicate. I'd call this a bug, but it still works iff you have
!       gzip's `zcat' filter.
     * If the man page contains .EQ or .TS directives, eqn and/or tbl
         will be invoked as needed at format time.
 USAGE
***************
*** 776,784 ****
     return $path if -f $path;

     if ($COMPRESS_PAGE) {
!       $path .= '.Z';
       return $path if -f $path;
!       $path =~ s/.Z//;
     }

     if ($COMPRESS_DIR) {
--- 785,797 ----
     return $path if -f $path;

     if ($COMPRESS_PAGE) {
!       $path = join('',$orig,'.gz');
       return $path if -f $path;
!       $path = join('',$orig,'.z');
!       return $path if -f $path;
!       $path = join('',$orig,'.Z');
!       return $path if -f $path;
! #     $path =~ s/.Z//;
     }

     if ($COMPRESS_DIR) {
***************
*** 816,823 ****
 sub bysection {
     local ($e1, $e2, $p1, $p2, $s1, $s2);

!     ($s1, $e1) = $a =~ m:.*/man([^/]+)/.*\.([^.]+)(\.Z)?$:;
!     ($s2, $e2) = $b =~ m:.*/man([^/]+)/.*\.([^.]+)(\.Z)?$:;

     $e1 = $s1 if $e1 !~ /^${s1}.*/;
     $e2 = $s2 if $e2 !~ /^${s2}.*/;
--- 829,836 ----
 sub bysection {
     local ($e1, $e2, $p1, $p2, $s1, $s2);

!     ($s1, $e1) = $a =~ m:.*/man([^/]+)/.*\.([^.]+)(\.(g?z|Z))?$:;
!     ($s2, $e2) = $b =~ m:.*/man([^/]+)/.*\.([^.]+)(\.(g?z|Z))?$:;

     $e1 = $s1 if $e1 !~ /^${s1}.*/;
     $e2 = $s2 if $e2 !~ /^${s2}.*/;
***************
*** 863,871 ****
     local ($manroot);
     local ($macros);

!     ($manroot) = $file =~ m,^(.*)/man([^\.]*)(\.Z)?/([^/]*),;

!     $command = ((($file =~ m:\.Z:)
                       ? $ZCAT
                       : $CAT)
               . " < $file | $TYPESET");
--- 876,884 ----
     local ($manroot);
     local ($macros);

!     ($manroot) = $file =~ m,^(.*)/man([^\.]*)(\.(g?z|Z))?/([^/]*),;

!     $command = ((($file =~ m:\.(g?z|Z):)
                       ? $ZCAT
                       : $CAT)
               . " < $file | $TYPESET");
***************
*** 899,905 ****
       return;
     }
     if ($fromfile) {
!       $command = (($manpage =~ m:\.Z/:) ? $ZCAT : $CAT)
                       . " < $manpage | $CATSET";
       &insert_filters($command, $manpage);
     } else {
--- 912,918 ----
       return;
     }
     if ($fromfile) {
!       $command = (($manpage =~ m:\.(g?z|Z):) ? $ZCAT : $CAT)
                       . " < $manpage | $CATSET";
       &insert_filters($command, $manpage);
     } else {
***************
*** 908,914 ****


       ($catpage = $manpage)
!           =~ s,^(.*)/man([^\.]*)(\.Z)?/([^/]*)$,$1/cat$2/$4,;

       $manroot = $1;

--- 921,927 ----


       ($catpage = $manpage)
!           =~ s,^(.*)/man([^\.]*)(\.(g?z|Z))?/([^/]*)$,$1/cat$2/$5,;

       $manroot = $1;

***************
*** 940,946 ****

       if ($st_cat[$ST_MTIME] < $st_man[$ST_MTIME]) {

!           $command = (($manpage =~ m:\.Z:) ? $ZCAT : $CAT)
                       . " < $manpage | $CATSET";

           $command = &insert_filters($command, $manpage);
--- 953,959 ----

       if ($st_cat[$ST_MTIME] < $st_man[$ST_MTIME]) {

!           $command = (($manpage =~ m:\.(g?z|Z):) ? $ZCAT : $CAT)
                       . " < $manpage | $CATSET";

           $command = &insert_filters($command, $manpage);
***************
*** 962,968 ****

           printf STDERR "Reformatting page.  Please wait ... " if $isatty;

!           $command .= "| $COMPRESS" if $catpage =~ /\.Z/;
           $command .= "> $tmppage";

           $SIG{'INT'} = $SIG{'QUIT'} = $SIG{'HUP'} = $SIG{'TERM'}
--- 975,981 ----

           printf STDERR "Reformatting page.  Please wait ... " if $isatty;

!           $command .= "| $COMPRESS" if $catpage =~ /\.(g?z|Z)/;
           $command .= "> $tmppage";

           $SIG{'INT'} = $SIG{'QUIT'} = $SIG{'HUP'} = $SIG{'TERM'}
***************
*** 994,1000 ****
               $SIG{'PIPE'} = 'DEFAULT';

       }
!       $command = (($catpage =~ m:\.Z:)
                       ? $ZCAT
                       : $CAT)
                   . " < $catpage";
--- 1007,1013 ----
               $SIG{'PIPE'} = 'DEFAULT';

       }
!       $command = (($catpage =~ m:\.(g?z|Z):)
                       ? $ZCAT
                       : $CAT)
                   . " < $catpage";
***************
*** 1088,1099 ****
     local($c, $PAGE) = @_;
     local($page,$sect, $prs, $prdir);

!     ( $page = $PAGE ) =~ s/\.Z//;
     ($prdir = $page) =~ s#/[^/]*$##;
     $prdir =~ s#man([^/]*)$#pr$1#;
     $page =~ s#.*/([^/]+)$#$1#;

!     $PAGE = "$ZCAT < $PAGE|" if $PAGE =~ /\.Z/;

     (open PAGE) || die ("$program: can't open $PAGE to check filters: $!\n");
     warn "open $PAGE to check for filters in $_[0]\n" if $debug;
--- 1101,1112 ----
     local($c, $PAGE) = @_;
     local($page,$sect, $prs, $prdir);

!     ( $page = $PAGE ) =~ s/\.(g?z|Z)//;
     ($prdir = $page) =~ s#/[^/]*$##;
     $prdir =~ s#man([^/]*)$#pr$1#;
     $page =~ s#.*/([^/]+)$#$1#;

!     $PAGE = "$ZCAT < $PAGE|" if $PAGE =~ /\.(g?z|Z)/;

     (open PAGE) || die ("$program: can't open $PAGE to check filters: $!\n");
     warn "open $PAGE to check for filters in $_[0]\n" if $debug;
***************
*** 1226,1233 ****
     local(@retlist, $maxlen, $header, @idx , @st_man, @st_idx);
     # global no_idx_file, idx_file

!     ( $idx_file = $manpage ) =~ s:/man(\w+)(\.Z)?/:/idx$1/:;
!     $idx_file =~ s/\.Z//;

     require 'stat.pl' unless defined &Stat;

--- 1239,1246 ----
     local(@retlist, $maxlen, $header, @idx , @st_man, @st_idx);
     # global no_idx_file, idx_file

!     ( $idx_file = $manpage ) =~ s:/man(\w+)(\.(g?z|Z))?/:/idx$1/:;
!     $idx_file =~ s/\.(g?z|Z)//;

     require 'stat.pl' unless defined &Stat;

***************
*** 1244,1250 ****
       return @saveidx = @retlist;
     }

!     if (!open(manpage, $manpage =~ /\.Z/ ? "$ZCAT < $manpage|" : $manpage)) {
       warn "$program: can't open $manpage: $!\n";
       return ();
     }
--- 1257,1263 ----
       return @saveidx = @retlist;
     }

!     if (!open(manpage, $manpage =~ /\.(g?z|Z)/ ? "$ZCAT < $manpage|" : $manpage)) {
       warn "$program: can't open $manpage: $!\n";
       return ();
     }
***************
*** 1483,1489 ****
                   print "skipping non-man file: $path\n" if $debug;
                   next;
               }
!               if ($FILE =~ /\.Z$/ || $dir =~ /\.Z$/) {
                   $FILE = "$ZCAT $FILE|";
               }
               print STDERR "grepping $path\n" if $debug;
--- 1496,1502 ----
                   print "skipping non-man file: $path\n" if $debug;
                   next;
               }
!               if ($FILE =~ /\.(g?z|Z)$/ || $dir =~ /\.(g?z|Z)$/) {
                   $FILE = "$ZCAT $FILE|";
               }
               print STDERR "grepping $path\n" if $debug;
diff -C3 man-orig/man.1 man-fix/man.1
*** man-orig/man.1      Sun Aug 15 23:25:06 1993
--- man-fix/man.1       Sun Aug 15 23:39:17 1993
***************
*** 481,489 ****
 .B \-g
 Grep through all man pages for one or more
 .I perl
! expressions.  Compressed man pages will be
! correctly processed
! by
 .M zcat 1L .
 .TP
 .B \-t
--- 481,488 ----
 .B \-g
 Grep through all man pages for one or more
 .I perl
! expressions.  Compressed man pages will be correctly processed
! by the GNU zip (Gzip) version of
 .M zcat 1L .
 .TP
 .B \-t
***************
*** 724,729 ****
--- 723,729 ----
 .M nroff 1 ,
 .M troff 1L ,
 .M compress 1L ,
+ .M gzip 1L ,
 .M dbm 3X ,
 .M man 7 ,
 .M catman 8 ,
***************
*** 777,785 ****
 \fIul\fP,
 \fIcol\fP,
 \fIegrep\fP, and
! \fIcompress\fP
 .IP \(bu 5
! whether you have compressed man pages and how they are stored
 .IP \(bu 5
 which section aliases you want (as in
 .B public
--- 777,785 ----
 \fIul\fP,
 \fIcol\fP,
 \fIegrep\fP, and
! \fIgzip\fP
 .IP \(bu 5
! whether you have gziped man pages and how they are stored
 .IP \(bu 5
 which section aliases you want (as in
 .B public
***************
*** 794,806 ****
 .PP
 To save disk space at the expense of execution time, a site may
 wish to run
! .M compress 1L
 on the manual entries where available.  The
 .I man
 program
! understands how to read compressed man
! pages, and knows to create a compressed cat page if the source
! man page was compressed to start with.
 .PP
 When running on slow \s-1CPU\s0s, the start-up time for parsing the
 script may be annoying.  These sites can skip this parsing phase
--- 794,806 ----
 .PP
 To save disk space at the expense of execution time, a site may
 wish to run
! .M gzip 1L
 on the manual entries where available.  The
 .I man
 program
! understands how to read gziped man
! pages, and knows to create a gziped cat page if the source
! man page was gziped to start with.
 .PP
 When running on slow \s-1CPU\s0s, the start-up time for parsing the
 script may be annoying.  These sites can skip this parsing phase
***************
*** 941,947 ****
 .IR troff .
 .PP
 Not all systems have
! .I compress
 installed on them.
 .SH AUTHOR
 Tom Christiansen
--- 941,947 ----
 .IR troff .
 .PP
 Not all systems have
! .I gzip
 installed on them.
 .SH AUTHOR
 Tom Christiansen