Updated gzip from 1.1 to 1.2.2

This commit is contained in:
Nate Williams
1993-06-19 00:22:46 +00:00
parent 7e0ed885d8
commit 35f29edac9
39 changed files with 1460 additions and 292 deletions
+76
View File
@@ -1,3 +1,79 @@
Thu Jun 17 13:47:05 1993 Jean-loup Gailly (jloup@chorus.fr)
* version 1.2.2
Fix a compilation error in gzip.c on Sun with cc (worked with gcc).
Wed Jun 16 11:20:27 1993 Jean-loup Gailly (jloup@chorus.fr)
* version 1.2.1
Let zmore act as more if the data is not gzipped.
By default, display output name only when name was actually truncated.
Use absolute path names in gzexe'd programs for better security.
In gzexe, use chmod 700 instead of 755 and don't gzexe tail,rm,etc...
Update vms/gzip.hlp.
Added a note about the fast options (-1 to -3) in algorithm.doc.
Improved man page for zgrep.
Minor fixes to gzip.texi.
Always set LC_ALL and LANG in configure (for tr on HPUX)
Mon Jun 14 10:03:24 1993 Jean-loup Gailly (jloup@chorus.fr)
* version 1.2
Added the --list option to display the file characteristics.
Added the --no-name option: do not save or restore original filename
Save the original name by default.
Allow gunzip --suffix "" to attempt decompression on any file
regardless of its extension if an original name is present.
Add support for the SCO compress -H format.
gzip --fast now compresses faster (speed close to that of compress)
with degraded compression ratio (but still better than compress).
Default level changed to -6 (acts exactly as previous level -5) to
be a better indication of its placement in the speed/ratio range.
Use smart name truncation: 123456789012.c -> 123456789.c.gz
instead of 12345678901.gz
With --force, let zcat pass non gzip'ed data unchanged (zcat == cat)
Added the zgrep shell script.
Made sub.c useful for 16 bit sound, 24 bit images, etc..
Supress warnings about suffix for gunzip -r, except with --verbose.
Moved the sample programs to a subdirectory sample.
On MSDOS, use .gz extension when possible (files without extension)
Added a "Special targets" section in INSTALL.
Use stty -g correctly in zmore.in.
Use cheaper test for gzipness in zforce.in.
Remove space before $ in match.S (no longer accepted by gas 2.x)
For the shell scripts, do not assume that gzip is in the path.
Fix syntax error and define lnk$library in vms/Makefile.mms
REGSIGTYPE is void on the Amiga.
Do not write empty line when decompressing stdin with --verbose.
Fix the 1.1.2 fix for VMS (bug in get_suffix)
Added warning in README about compiler bug on Solaris 2.1 for x86.
Added warning about 'rehash' in INSTALL.
Removed default value of read_buf in bits.c (supermax doesn't like).
In tailor.h, added support for Borland C and Zortech C on OS/2.
Added warning in gzexe about Ultrix buggy sh (use /bin/sh5 instead).
Added warning in zdiff about AIX buggy sh (use /bin/ksh instead).
In configure.in, do not try the asm code if DEFS contains NO_ASM
Fri Jun 4 09:49:33 1993 Jean-loup Gailly (jloup@chorus.fr)
* version 1.1.2
Fix serious bug for VMS (-gz not removed when decompressing).
Allow suffix other than .gz in znew.
Do not display compression ratio when decompressing stdin.
In zmore.in, work around brain damaged stty -g (Ultrix).
Display a correct compression ratio for .Z files.
Added .z to .gz renaming script in INTALL.
Allow setting CFLAGS in configure.
Add warning in README about bug in Concentrix cc compiler.
Avoid || in Makefile.in (at least one make doesn't support this).
Disable useless --ascii option for the Amiga.
Add a pointer to the Primos executable in README.
Added description of extra field in algorithm.doc.
Do not redefine NULL in alloca.c.
Added check for unsupported compression methods.
Avoid getopt redeclaration on OSF/1.
Tue Jun 1 09:07:15 1993 Jean-loup Gailly (jloup@chorus.fr) Tue Jun 1 09:07:15 1993 Jean-loup Gailly (jloup@chorus.fr)
* version 1.1.1 * version 1.1.1
+3 -3
View File
@@ -2,10 +2,10 @@
PROG= gzip PROG= gzip
SRCS= gzip.c zip.c deflate.c trees.c bits.c unzip.c inflate.c util.c \ SRCS= gzip.c zip.c deflate.c trees.c bits.c unzip.c inflate.c util.c \
crypt.c lzw.c unlzw.c unpack.c getopt.c match.S crypt.c lzw.c unlzw.c unlzh.c unpack.c getopt.c match.S
MAN1= gzexe.0 gzip.0 zdiff.0 zforce.0 zmore.0 znew.0 MAN1= gzexe.0 gzip.0 zdiff.0 zforce.0 zmore.0 znew.0
CFLAGS+=-DASMV -DHAVE_UNISTD_H=1 -DDIRENT=1 CFLAGS+=-DASMV -DHAVE_UNISTD_H=1 -DDIRENT=1
MLINKS= zdiff.1 zcmp.1 gzip.1 gunzip.1 gzip.1 zcat.1 gzip.1 gzcat.1 MLINKS= gzip.1 gunzip.1 gzip.1 zcat.1 gzip.1 gzcat.1
LINKS+= ${DESTDIR}${BINDIR}/gzip ${DESTDIR}${BINDIR}/gunzip LINKS+= ${DESTDIR}${BINDIR}/gzip ${DESTDIR}${BINDIR}/gunzip
LINKS+= ${DESTDIR}${BINDIR}/gzip ${DESTDIR}${BINDIR}/gzcat LINKS+= ${DESTDIR}${BINDIR}/gzip ${DESTDIR}${BINDIR}/gzcat
LINKS+= ${DESTDIR}${BINDIR}/gzip ${DESTDIR}${BINDIR}/zcat LINKS+= ${DESTDIR}${BINDIR}/gzip ${DESTDIR}${BINDIR}/zcat
@@ -13,7 +13,7 @@ LINKS+= ${DESTDIR}${BINDIR}/gzip ${DESTDIR}${BINDIR}/zcat
afterinstall: afterinstall:
install -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ install -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
${.CURDIR}/zforce ${.CURDIR}/gzexe ${.CURDIR}/znew \ ${.CURDIR}/zforce ${.CURDIR}/gzexe ${.CURDIR}/znew \
${.CURDIR}/zmore ${.CURDIR}/zdiff ${.CURDIR}/zcmp \ ${.CURDIR}/zmore ${.CURDIR}/zdiff ${.CURDIR}/zgrep \
${DESTDIR}${BINDIR} ${DESTDIR}${BINDIR}
match.o: ${.CURDIR}/match.S match.o: ${.CURDIR}/match.S
+39 -1
View File
@@ -1,6 +1,44 @@
Current Version: 1.1.1 Current Version: 1.2.2.
See the file ChangeLog for the details of all changes. See the file ChangeLog for the details of all changes.
Major changes from 1.2 to 1.2.1
* Fix a compilation error on Sun with cc (worked with gcc).
Major changes from 1.2 to 1.2.1
* Let zmore act as more if the data is not gzipped.
* made gzexe more secure (don't rely on PATH).
* By default, display output name only when the name was actually truncated.
Major changes from 1.1.2 to 1.2
* Added the --list option to display the file characteristics.
* Added the --no-name option: do not save or restore original filename
Save the original name by default.
* Allow gunzip --suffix "" to attempt decompression on any file
regardless of its extension if an original name is present.
* Add support for the SCO compress -H format.
* gzip --fast now compresses faster (speed close to that of compress)
with degraded compression ratio (but still better than compress).
Default level changed to -6 (acts exactly as previous level -5) to
be a better indication of its placement in the speed/ratio range.
* Use smart name truncation: 123456789012.c -> 123456789.c.gz
instead of 12345678901.gz
* With --force, let zcat pass non gzip'ed data unchanged (zcat == cat)
* Added the zgrep shell script.
* Made sub.c useful for 16 bit sound, 24 bit images, etc..
* Supress warnings about suffix for gunzip -r, except with --verbose.
* On MSDOS, use .gz extension when possible (files without extension)
* Moved the sample programs to a subdirectory sample.
* Added a "Special targets" section in INSTALL.
Major changes from 1.1.1 to 1.1.2.
* Fix serious bug for VMS (-gz not removed when decompressing).
* Allow suffix other than .gz in znew.
* Do not display compression ratio when decompressing stdin.
* In zmore.in, work around brain damaged stty -g (Ultrix).
* Display a correct compression ratio for .Z files.
* Added .z to .gz renaming script in INTALL.
* Allow setting CFLAGS in configure.
Major changes from 1.1 to 1.1.1. Major changes from 1.1 to 1.1.1.
* Fix serious bug in vms.c (affects Vax/VMS only). * Fix serious bug in vms.c (affects Vax/VMS only).
* Added --ascii option. * Added --ascii option.
+20 -8
View File
@@ -1,4 +1,4 @@
This is the file README for the gzip distribution, version 1.1.1. This is the file README for the gzip distribution, version 1.2.2.
gzip (GNU zip) is a compression utility designed to be a replacement gzip (GNU zip) is a compression utility designed to be a replacement
for 'compress'. Its main advantages over compress are much better for 'compress'. Its main advantages over compress are much better
@@ -35,14 +35,17 @@ particular, please don't ask me once more for an /etc/magic entry.)
WARNINGS about broken optimizers: WARNINGS about broken optimizers:
- on the NeXT, "cc -finline-functions" is broken. gzip produces - on the NeXT, "cc -finline-functions" is broken. gzip produces
valid .z files but they are much too large because the string valid .gz files but they are much too large because the string
matching code misses most matches. Use "cc -O" instead. matching code misses most matches. Use "cc -O" instead.
- on the Mips R4000, gcc -O (version 2.3.1) generates bad code, use cc - on the Mips R4000, gcc -O (version 2.3.1) generates bad code, use cc
or just gcc -g instead. or just gcc -g instead.
- gcc 2.3.3 on the SGI Indigo IRIX 4.0.5 also produces bad code. Use - gcc 2.3.3 and 2.4.3 on the SGI Indigo IRIX 4.0.5 also produce bad code.
instead: make CC='cc -O2' or gcc without -O. Use instead: make CC='cc -O2' or gcc without -O.
- On Solaris 2.1 for x86, the January 1993 "OEM" compiler release
generates bad code. This is fixed in the June 1993 "FCS" release.
- on Sparc with SunOS 4.1.1 and the SC1.0 compiler, the optimizer - on Sparc with SunOS 4.1.1 and the SC1.0 compiler, the optimizer
works up to -O3 but -O4 does not work. works up to -O3 but -O4 does not work.
@@ -53,6 +56,9 @@ WARNINGS about broken optimizers:
- On dnix 5.3 2.2 cc version 2.37c is buggy. Version 2.38d works. - On dnix 5.3 2.2 cc version 2.37c is buggy. Version 2.38d works.
- On an Alliant running Concentrix, cc (even without optimization) generates
incorrect code. You have to use gcc.
For all machines, Use "make check" to check that gzip was compiled correctly. For all machines, Use "make check" to check that gzip was compiled correctly.
Please send all comments and bug reports by electronic mail to: Please send all comments and bug reports by electronic mail to:
@@ -68,6 +74,9 @@ Bug reports should ideally include:
* A description of the bug behavior * A description of the bug behavior
* The input to gzip, that triggered the bug * The input to gzip, that triggered the bug
If you send me patches for machines I don't have access to, please test them
very carefully. gzip is used for backups, it must be extremely reliable.
The package crypt++.el is highly recommended to manipulate gzip'ed The package crypt++.el is highly recommended to manipulate gzip'ed
file from emacs. It recognizes automatically encrypted and compressed file from emacs. It recognizes automatically encrypted and compressed
files when they are first visited or written. It is available via files when they are first visited or written. It is available via
@@ -93,13 +102,16 @@ provided under the name COPYING. The latest version of gzip are always
available by ftp in prep.ai.mit.edu:/pub/gnu, or in any of the prep available by ftp in prep.ai.mit.edu:/pub/gnu, or in any of the prep
mirror sites: mirror sites:
- sources in gzip-*.tar (or .shar or .tar.z) - sources in gzip-*.tar (or .shar or .tar.gz)
- Solaris 2 executables in sparc-sun-solaris2/gzip-binaries-*.tar - Solaris 2 executables in sparc-sun-solaris2/gzip-binaries-*.tar
- MSDOS lha self-extracting exe in gzip-msdos-*.exe. Once extracted, - MSDOS lha self-extracting exe in gzip-msdos-*.exe. Once extracted,
copy gzip.exe to gunzip.exe and zcat.exe, or use "gzip -d" to decompress. copy gzip.exe to gunzip.exe and zcat.exe, or use "gzip -d" to decompress.
gzip386.exe runs much faster but only on 386 and above; it needs go32.exe,
available in omnigate.clarkson.edu:/pub/msdos/djgpp/djdev110.zip
A VMS executable is available in ftp.spc.edu:[.macro32.savesets]gzip-1-*.zip A VMS executable is available in ftp.spc.edu:[.macro32.savesets]gzip-1-*.zip
(use [.macro32]unzip.exe to extract). (use [.macro32]unzip.exe to extract). A PRIMOS executable is available
in ftp.lysator.liu.se:/pub/primos/run/gzip.run.
Many thanks to those who provided me with bug reports and feedback. Many thanks to those who provided me with bug reports and feedback.
See the files THANKS and ChangeLog for more details. See the files THANKS and ChangeLog for more details.
@@ -129,11 +141,11 @@ On Unix, gzip is mostly useful in combination with tar. GNU tar
1.11.2 has a -z option to invoke gzip automatically. "tar -z" 1.11.2 has a -z option to invoke gzip automatically. "tar -z"
compresses better than zip, since gzip can then take advantage of compresses better than zip, since gzip can then take advantage of
redundancy between distinct files. The drawback is that you must redundancy between distinct files. The drawback is that you must
scan the whole tar.z file in order to extract a single file near scan the whole tar.gz file in order to extract a single file near
the end; unzip can directly seek to the end of the zip file. There the end; unzip can directly seek to the end of the zip file. There
is no overhead when you extract the whole archive anyway. is no overhead when you extract the whole archive anyway.
If a member of a .zip archive is damaged, other files can still If a member of a .zip archive is damaged, other files can still
be recovered. If a .tar.z file is damaged, files beyond the failure be recovered. If a .tar.gz file is damaged, files beyond the failure
point cannot be recovered. (Future versions of gzip will have point cannot be recovered. (Future versions of gzip will have
error recovery features.) error recovery features.)
+36 -6
View File
@@ -1,9 +1,10 @@
gzip was written by Jean-loup Gailly <jloup@chorus.fr>, with gzip was written by Jean-loup Gailly <jloup@chorus.fr>, with portions
portions written by Mark Adler (inflate.c) and Peter Jannesen written by Mark Adler (inflate.c), Peter Jannesen (unlzw.c) and
(unlzw.c). The zip deflate format was defined by Phil Katz. Haruhiko Okumura (unlzh.c). The zip deflate format was defined by Phil Katz.
Thanks to those who reported problems and suggested Thanks to those who reported problems and suggested various
various improvements. Here is a partial list of them: improvements. Here is a partial list of them:
Jay Adams jka@ece.cmu.edu
Mark Adler madler@cco.caltech.edu Mark Adler madler@cco.caltech.edu
Edwin Allum edwin@csri.toronto.edu Edwin Allum edwin@csri.toronto.edu
Joseph Arceneaux jla@gnu.ai.mit.edu Joseph Arceneaux jla@gnu.ai.mit.edu
@@ -29,11 +30,13 @@ Dave Brennan brennan@hal.com
Alan Brown dogbowl@dogbox.acme.gen.nz Alan Brown dogbowl@dogbox.acme.gen.nz
Rodney Brown rdb@mel.cocam.oz.au Rodney Brown rdb@mel.cocam.oz.au
Bruce bde@runx.oz.au Bruce bde@runx.oz.au
Bill Bumgarner bbum@stone.com
Leila Burrell-Davis leilabd@syma.sussex.ac.uk Leila Burrell-Davis leilabd@syma.sussex.ac.uk
Roger Butenuth butenuth@ira.uka.de Roger Butenuth butenuth@ira.uka.de
Bud Carlson bud@isle.pegasus.com Bud Carlson bud@isle.pegasus.com
Lim Fung Chai fclim@i1sin.daq.semi.harris.com Lim Fung Chai fclim@i1sin.daq.semi.harris.com
Wes Chalfant wes@kofax.com Wes Chalfant wes@kofax.com
Andrew A. Chernov ache@astral.msk.su
Paul Close pdc@lunch.wpd.sgi.com Paul Close pdc@lunch.wpd.sgi.com
Kevin Cosgrove kevinc@tekig6.pen.tek.com Kevin Cosgrove kevinc@tekig6.pen.tek.com
Stephen J Cowley s.j.cowley@amtp.cam.ac.uk Stephen J Cowley s.j.cowley@amtp.cam.ac.uk
@@ -42,9 +45,12 @@ James R. Crawford qralston@cislabs.pitt.edu
Lawrence Crowl crowl@research.cs.orst.edu Lawrence Crowl crowl@research.cs.orst.edu
Klaus Dahlenburg kdburg@incoahe.hanse.de Klaus Dahlenburg kdburg@incoahe.hanse.de
William E Davidsen davidsen@ariel.crd.ge.com William E Davidsen davidsen@ariel.crd.ge.com
John M. DeDourek dedourek@aixive2.cs.unb.ca
Jeff Deifik jdeifik@isi.edu Jeff Deifik jdeifik@isi.edu
Vince DeMarco vince@whatnxt.cuc.ab.ca Vince DeMarco vince@whatnxt.cuc.ab.ca
Michael De La Rue p91152@cplab.physics.edinburgh.ac.uk Michael De La Rue p91152@cplab.physics.edinburgh.ac.uk
John DeRoo deroo@grout.adv.shr.dec.com
Stefano Diomedi sd@teculx.tecsiel.it
Lawrence R. Dodd dodd@roebling.poly.edu Lawrence R. Dodd dodd@roebling.poly.edu
Matthew Donadio donadio@mxd120.rh.psu.edu Matthew Donadio donadio@mxd120.rh.psu.edu
Andy Dougherty andy@crystal.phys.lafayette.edu Andy Dougherty andy@crystal.phys.lafayette.edu
@@ -71,12 +77,15 @@ Bruno Haible haible@ma2s2.mathematik.uni-karlsruhe.de
Junio Hamano junio@shadow.twinsun.com Junio Hamano junio@shadow.twinsun.com
Harald Hanche-Olsen hanche@ams.sunysb.edu Harald Hanche-Olsen hanche@ams.sunysb.edu
Darrel R. Hankerson hankedr@mail.auburn.edu Darrel R. Hankerson hankedr@mail.auburn.edu
Lars Hecking st000002@hrz1.hrz.th-darmstadt.de
Ruediger Helsch ruediger@ramz.ing.tu-bs.de Ruediger Helsch ruediger@ramz.ing.tu-bs.de
Mark C. Henderson mch@sqwest.wimsey.bc.ca Mark C. Henderson mch@sqwest.wimsey.bc.ca
Karl Heuer karl@kelp.boston.ma.us Karl Heuer karl@kelp.boston.ma.us
Jarkko Hietaniemi jhi@dol-guldur.hut.fi
Thomas Hiller hiller@fzi.de Thomas Hiller hiller@fzi.de
Eiji Hirai hirai@cc.swarthmore.edu Eiji Hirai hirai@cc.swarthmore.edu
Kjetil Torgrim Homme kjetilho@ifi.uio.no Kjetil Torgrim Homme kjetilho@ifi.uio.no
Jim Howard jim_howard@mentorg.com
Preston Hunt gt5708a@prism.gatech.edu Preston Hunt gt5708a@prism.gatech.edu
Shane C Hutchins sch@nymph.msel.unh.edu Shane C Hutchins sch@nymph.msel.unh.edu
Hutch hutchinson@wrair-emh1.army.mil Hutch hutchinson@wrair-emh1.army.mil
@@ -89,24 +98,31 @@ Denny de Jonge witaddj@dutrex.tudelft.nl
Arne H. Juul arnej@lise.unit.no Arne H. Juul arnej@lise.unit.no
Dana Jacobsen jacobsd@solar.cor2.epa.gov Dana Jacobsen jacobsd@solar.cor2.epa.gov
Peter Jannesen peter@ncs.nl Peter Jannesen peter@ncs.nl
Tom Judson judson@scf.usc.edu
Henry G. Juengst juengst@saph2.physik.uni-bonn.de
Sarantos Kapidakis sarantos%manteion@ics.forth.gr Sarantos Kapidakis sarantos%manteion@ics.forth.gr
Amir J. Katz amir@matis.ingr.com Amir J. Katz amir@matis.ingr.com
Steve Kelem kelem@castor.xilinx.com Steve Kelem kelem@castor.xilinx.com
Randy Kirchhof rkk@posms.aus.tx.us Randy Kirchhof rkk@posms.aus.tx.us
Ned Kittlitz kittlitz@seagoon.sw.stratus.com Ned Kittlitz kittlitz@seagoon.sw.stratus.com
Sakai Kiyotaka ksakai@mtl.t.u-tokyo.ac.jp
Philip C Kizer pckizer@gonzo.tamu.edu
Pete Klammer pklammer@ouray.denver.colorado.edu Pete Klammer pklammer@ouray.denver.colorado.edu
Fritz Kleemann kleemann@informatik.uni-wuerzburg.dbp.de Fritz Kleemann kleemann@informatik.uni-wuerzburg.dbp.de
Tom Kloos tk@sequent.com Tom Kloos tk@sequent.com
Carsten Koch carsten.koch@icem.de Carsten Koch carsten.koch@icem.de
Winfried Koenig win@in.rhein-main.de Winfried Koenig win@in.rhein-main.de
Steph Konigsdorfer s.konigsdorfer@frmy.bull.fr Steph Konigsdorfer s.konigsdorfer@frmy.bull.fr
Leif Kornstaedt leif@rumtifsl.ruessel.sub.org
Michael D. Lawler mdlawler@bsu-cs.bsu.edu Michael D. Lawler mdlawler@bsu-cs.bsu.edu
Kevin Layer layer@franz.com Kevin Layer layer@franz.com
Howard D. Leadmon howardl@wb3ffv.ampr.org Howard D. Leadmon howardl@wb3ffv.ampr.org
Alexander Lehmann alex@hal.rhein-main.de Alexander Lehmann alex@hal.rhein-main.de
Simon Leinen simon@lia.di.epfl.ch Simon Leinen simon@lia.di.epfl.ch
Burt Leland burt@molecular.com
Hugues Leroy hugues.leroy@irisa.fr Hugues Leroy hugues.leroy@irisa.fr
Charles Levert charles@aramis.comm.polymtl.ca Charles Levert charles@aramis.comm.polymtl.ca
Richard Levitte levitte@e.kth.se
Torbj|rn Lindh toobii@elixir.e.kth.se Torbj|rn Lindh toobii@elixir.e.kth.se
David R. Linn drl@vuse.vanderbilt.edu David R. Linn drl@vuse.vanderbilt.edu
Antonio Lioy cat@athena.polito.it Antonio Lioy cat@athena.polito.it
@@ -114,25 +130,31 @@ Jamie Lokier u90jl@ecs.oxford.ac.uk
David J. MacKenzie djm@eng.umd.edu David J. MacKenzie djm@eng.umd.edu
John R MacMillan john@chance.gts.org John R MacMillan john@chance.gts.org
Ron Male male@eso.mc.xerox.com Ron Male male@eso.mc.xerox.com
Don R. Maszle maze@bea.lbl.gov
Steeve McCauley steeve@pooh.geophys.mcgill.ca Steeve McCauley steeve@pooh.geophys.mcgill.ca
Tom McConnell tmcconne@sedona.intel.com
Tod McQuillin mcquill@ccit05.duq.edu Tod McQuillin mcquill@ccit05.duq.edu
Tye McQueen tye@spillman.com Tye McQueen tye@spillman.com
Bernd Melchers melchers@chemie.fu-berlin.de Bernd Melchers melchers@chemie.fu-berlin.de
Jason Merrill jason@jarthur.claremont.edu Jason Merrill jason@jarthur.claremont.edu
Dean S. Messing deanm@medulla.labs.tek.com Dean S. Messing deanm@medulla.labs.tek.com
M. Mesturino mesturino@cselt.stet.it
Luke Mewburn zak@rmit.edu.au Luke Mewburn zak@rmit.edu.au
Jim Meyering meyering@cs.utexas.edu Jim Meyering meyering@cs.utexas.edu
Frederic Miserey miserey@laguna.ics.uci.edu Frederic Miserey none.fred@applelink.apple.com
Marcel J.E. Mol marcel@duteca.et.tudelft.nl Marcel J.E. Mol marcel@duteca.et.tudelft.nl
Soren Juul Moller sjm@dde.dk
Chris Moore moore@src.bae.co.uk Chris Moore moore@src.bae.co.uk
Helmut Muelner hmuelner@fiicmds04.tu-graz.ac.at Helmut Muelner hmuelner@fiicmds04.tu-graz.ac.at
Urban D Mueller umueller@amiga.physik.unizh.ch Urban D Mueller umueller@amiga.physik.unizh.ch
Timothy Murphy tim@maths.tcd.ie Timothy Murphy tim@maths.tcd.ie
Greg Naber greg@squally.halcyon.com Greg Naber greg@squally.halcyon.com
Jay Nayegandhi jayng@bbiv02.enet.dec.com
Karl L. Noell noell@informatik.fh-wiesbaden.dbp.de Karl L. Noell noell@informatik.fh-wiesbaden.dbp.de
Arthur David Olson ado@elsie.nci.nih.gov Arthur David Olson ado@elsie.nci.nih.gov
Piet van Oostrum piet@cs.ruu.nl Piet van Oostrum piet@cs.ruu.nl
Rafael R. Pappalardo rafapa@obelix.cica.es Rafael R. Pappalardo rafapa@obelix.cica.es
Yves Perrenoud pyves@nuga.alphanet.ch
Hal Peterson hrp@pecan.cray.com Hal Peterson hrp@pecan.cray.com
Pascal Petit petit@cadillac.ibp.fr Pascal Petit petit@cadillac.ibp.fr
Bruno Pillard bp@chorus.fr Bruno Pillard bp@chorus.fr
@@ -146,7 +168,11 @@ Andreas Raab ar@nvmr.robin.de
Eric S. Raymond esr@snark.thyrsus.com Eric S. Raymond esr@snark.thyrsus.com
Klaus Reimann kr@cip.physik.uni-stuttgart.de Klaus Reimann kr@cip.physik.uni-stuttgart.de
Michael Rendell michael@mercury.cs.mun.ca Michael Rendell michael@mercury.cs.mun.ca
Hal Render render@massive.uccs.edu
Julian F. Reschke julian@math.uni-muenster.de
Phil Richards Phil.Richards@prg.oxford.ac.uk
Roland B Roberts roberts@nsrl31.nsrl.rochester.edu Roland B Roberts roberts@nsrl31.nsrl.rochester.edu
Arnold Robbins arnold@cc.gatech.edu
Kevin Rodgers kevin@rolling-stone.den.mmc.com Kevin Rodgers kevin@rolling-stone.den.mmc.com
Kai Uwe Rommel rommel@informatik.tu-muenchen.de Kai Uwe Rommel rommel@informatik.tu-muenchen.de
Paul Rubin phr@america.telebit.com Paul Rubin phr@america.telebit.com
@@ -159,13 +185,16 @@ Niimi Satoshi a01309@cfi.waseda.ac.jp
Marc Schaefer sysadm@alphanet.ch Marc Schaefer sysadm@alphanet.ch
Andreas Schwab schwab@lamothe.informatik.uni-dortmund.de Andreas Schwab schwab@lamothe.informatik.uni-dortmund.de
Eric Schenk schenk@cs.toronto.edu Eric Schenk schenk@cs.toronto.edu
Sunando Sen sens@fasecon.econ.nyu.edu
Rick Sladkey jrs@world.std.com Rick Sladkey jrs@world.std.com
Daniel L Smith dls@autodesk.com Daniel L Smith dls@autodesk.com
Fred Smith fredex%fcshome@merk.merk.com Fred Smith fredex%fcshome@merk.merk.com
Stephen Soliday soliday@ncat.edu
Paul Southworth pauls@css.itd.umich.edu Paul Southworth pauls@css.itd.umich.edu
Rob Spencer robbie@winkle.bhpese.oz.au Rob Spencer robbie@winkle.bhpese.oz.au
Richard Stallman rms@gnu.ai.mit.edu Richard Stallman rms@gnu.ai.mit.edu
Carsten Steger carsten.steger@informatik.tu-muenchen.de Carsten Steger carsten.steger@informatik.tu-muenchen.de
David Sundstrom sunds@anon.asic.sc.ti.com
Ed Sznyter ews@babel.babel.com Ed Sznyter ews@babel.babel.com
Hideaki Tanabe arctanx@iyeyasu.ynl.t.u-tokyo.ac.jp Hideaki Tanabe arctanx@iyeyasu.ynl.t.u-tokyo.ac.jp
Andrew Telford ajt@peregrin.resmel.bhp.com.au Andrew Telford ajt@peregrin.resmel.bhp.com.au
@@ -188,6 +217,7 @@ Stephen J. Walick steve@nshore.org
Gray Watson gray@antaire.com Gray Watson gray@antaire.com
Scott Weikart scott@igc.apc.org Scott Weikart scott@igc.apc.org
Ivo Welch iwelch@agsm.ucla.edu Ivo Welch iwelch@agsm.ucla.edu
Jochen Wiedmann zrawi01@zmcipdec1.zdv.uni-tuebingen.de
Gijsb. Wiesenekker wiesenecker@sara.nl Gijsb. Wiesenekker wiesenecker@sara.nl
Wietze van Winden wietze@swi.psy.uva.nl Wietze van Winden wietze@swi.psy.uva.nl
Larry W. Virden lwv26@cas.org Larry W. Virden lwv26@cas.org
+1 -6
View File
@@ -48,11 +48,6 @@ Some of the planned features include:
- Use a larger window size to deal with some large redundant files that - Use a larger window size to deal with some large redundant files that
'compress' currently handles better than gzip. 'compress' currently handles better than gzip.
- implement the following options: - Implement the -e (encrypt) option.
-e encrypt
-l list .z file contents
- support .Z files in SCO 'compress -H' format.
Send comments to Jean-loup Gailly <jloup@chorus.fr>. Send comments to Jean-loup Gailly <jloup@chorus.fr>.
+23
View File
@@ -48,6 +48,12 @@ match, thus speeding up the whole process. If compression ratio is more
important than speed, zip attempts a complete second search even if important than speed, zip attempts a complete second search even if
the first match is already long enough. the first match is already long enough.
The lazy match evaluation is no performed for the fastest compression
modes (speed options -1 to -3). For these fast modes, new strings
are inserted in the hash table only when no match was found, or
when the match is not too long. This degrades the compression ratio
but saves time since there are both fewer insertions and fewer searches.
2. gzip file format 2. gzip file format
@@ -100,6 +106,23 @@ cleared indicating binary data. For systems which have different
file formats for ascii text and binary data, the decompressor can file formats for ascii text and binary data, the decompressor can
use the flag to choose the appropriate format. use the flag to choose the appropriate format.
The extra field, if present, must consist of one or more subfields,
each with the following format:
subfield id : 2 bytes
subfield size : 2 bytes (little-endian format)
subfield data
The subfield id can consist of two letters with some mnemonic value.
Please send any such id to jloup@chorus.fr. Ids with a zero second
byte are reserved for future use. The following ids are defined:
Ap (0x41, 0x70) : Apollo file type information
The subfield size is the size of the subfield data and does not
include the id and the size itself. The field 'extra field length' is
the total size of the extra field, including subfield ids and sizes.
It must be possible to detect the end of the compressed data with any It must be possible to detect the end of the compressed data with any
compression format, regardless of the actual size of the compressed compression format, regardless of the actual size of the compressed
data. If the compressed data cannot fit in one file (in particular for data. If the compressed data cannot fit in one file (in particular for
+2 -2
View File
@@ -60,7 +60,7 @@
#endif #endif
#ifndef lint #ifndef lint
static char rcsid[] = "$Id: bits.c,v 0.8 1993/02/04 13:21:06 jloup Exp $"; static char rcsid[] = "$Id: bits.c,v 0.9 1993/06/11 10:16:58 jloup Exp $";
#endif #endif
/* =========================================================================== /* ===========================================================================
@@ -84,7 +84,7 @@ local int bi_valid;
* are always zero. * are always zero.
*/ */
int (*read_buf) OF((char *buf, unsigned size)) = file_read; int (*read_buf) OF((char *buf, unsigned size));
/* Current input function. Set to mem_read for in-memory compression */ /* Current input function. Set to mem_read for in-memory compression */
#ifdef DEBUG #ifdef DEBUG
+60 -27
View File
@@ -68,7 +68,7 @@
#include "lzw.h" /* just for consistency checking */ #include "lzw.h" /* just for consistency checking */
#ifndef lint #ifndef lint
static char rcsid[] = "$Id: deflate.c,v 0.13 1993/05/25 16:25:40 jloup Exp $"; static char rcsid[] = "$Id: deflate.c,v 0.14 1993/06/12 20:11:10 jloup Exp $";
#endif #endif
/* =========================================================================== /* ===========================================================================
@@ -187,8 +187,17 @@ unsigned near max_chain_length;
local unsigned int max_lazy_match; local unsigned int max_lazy_match;
/* Attempt to find a better match only when the current match is strictly /* Attempt to find a better match only when the current match is strictly
* smaller than this value. * smaller than this value. This mechanism is used only for compression
* levels >= 4.
*/ */
#define max_insert_length max_lazy_match
/* Insert new strings in the hash table only if the match length
* is not greater than this length. This saves time but degrades compression.
* max_insert_length is used only for compression levels <= 3.
*/
local int compr_level;
/* compression level (1..9) */
int near good_match; int near good_match;
/* Use a faster search when the previous match is longer than this */ /* Use a faster search when the previous match is longer than this */
@@ -216,18 +225,20 @@ typedef struct config {
local config configuration_table[10] = { local config configuration_table[10] = {
/* good lazy nice chain */ /* good lazy nice chain */
/* 0 */ {0, 0, 0, 0}, /* store only */ /* 0 */ {0, 0, 0, 0}, /* store only */
/* 1 */ {4, 4, 16, 16}, /* maximum speed */ /* 1 */ {4, 4, 8, 4}, /* maximum speed, no lazy matches */
/* 2 */ {6, 8, 16, 16}, /* 2 */ {4, 5, 16, 8},
/* 3 */ {8, 16, 32, 32}, /* 3 */ {4, 6, 32, 32},
/* 4 */ {8, 16, 64, 64},
/* 5 */ {8, 16, 128, 128}, /* 4 */ {4, 4, 16, 16}, /* lazy matches */
/* 6 */ {8, 32, 128, 256}, /* 5 */ {8, 16, 32, 32},
/* 7 */ {8, 64, 128, 512}, /* 6 */ {8, 16, 128, 128},
/* 7 */ {8, 32, 128, 256},
/* 8 */ {32, 128, 258, 1024}, /* 8 */ {32, 128, 258, 1024},
/* 9 */ {32, 258, 258, 4096}}; /* maximum compression */ /* 9 */ {32, 258, 258, 4096}}; /* maximum compression */
/* Note: the current code requires max_lazy >= MIN_MATCH and max_chain >= 4 /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
* but these restrictions can easily be removed at a small cost. * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
* meaning.
*/ */
#define EQUAL 0 #define EQUAL 0
@@ -237,6 +248,8 @@ local config configuration_table[10] = {
* Prototypes for local functions. * Prototypes for local functions.
*/ */
local void fill_window OF((void)); local void fill_window OF((void));
local ulg deflate_fast OF((void));
int longest_match OF((IPos cur_match)); int longest_match OF((IPos cur_match));
#ifdef ASMV #ifdef ASMV
void match_init OF((void)); /* asm code initialization */ void match_init OF((void)); /* asm code initialization */
@@ -277,6 +290,7 @@ void lm_init (pack_level, flags)
register unsigned j; register unsigned j;
if (pack_level < 1 || pack_level > 9) error("bad pack level"); if (pack_level < 1 || pack_level > 9) error("bad pack level");
compr_level = pack_level;
/* Initialize the hash table. */ /* Initialize the hash table. */
#if defined(MAXSEG_64K) && HASH_BITS == 15 #if defined(MAXSEG_64K) && HASH_BITS == 15
@@ -558,10 +572,12 @@ local void fill_window()
(char*)NULL, (long)strstart - block_start, (eof)) (char*)NULL, (long)strstart - block_start, (eof))
/* =========================================================================== /* ===========================================================================
* Processes a new input file and return its compressed length. * Processes a new input file and return its compressed length. This
* function does not perform lazy evaluationof matches and inserts
* new strings in the dictionary only for unmatched strings. It is used
* only for the fast compression options.
*/ */
#ifdef NO_LAZY local ulg deflate_fast()
ulg deflate()
{ {
IPos hash_head; /* head of the hash chain */ IPos hash_head; /* head of the hash chain */
int flush; /* set if current block must be flushed */ int flush; /* set if current block must be flushed */
@@ -592,22 +608,38 @@ ulg deflate()
flush = ct_tally(strstart-match_start, match_length - MIN_MATCH); flush = ct_tally(strstart-match_start, match_length - MIN_MATCH);
lookahead -= match_length; lookahead -= match_length;
match_length--; /* string at strstart already in hash table */
do { /* Insert new strings in the hash table only if the match length
strstart++; * is not too large. This saves time but degrades compression.
INSERT_STRING(strstart, hash_head); */
/* strstart never exceeds WSIZE-MAX_MATCH, so there are if (match_length <= max_insert_length) {
* always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH match_length--; /* string at strstart already in hash table */
* these bytes are garbage, but it does not matter since the do {
* next lookahead bytes will always be emitted as literals. strstart++;
*/ INSERT_STRING(strstart, hash_head);
} while (--match_length != 0); /* strstart never exceeds WSIZE-MAX_MATCH, so there are
* always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH
* these bytes are garbage, but it does not matter since
* the next lookahead bytes will be emitted as literals.
*/
} while (--match_length != 0);
strstart++;
} else {
strstart += match_length;
match_length = 0;
ins_h = window[strstart];
UPDATE_HASH(ins_h, window[strstart+1]);
#if MIN_MATCH != 3
Call UPDATE_HASH() MIN_MATCH-3 more times
#endif
}
} else { } else {
/* No match, output a literal byte */ /* No match, output a literal byte */
Tracevv((stderr,"%c",window[strstart]));
flush = ct_tally (0, window[strstart]); flush = ct_tally (0, window[strstart]);
lookahead--; lookahead--;
strstart++;
} }
strstart++;
if (flush) FLUSH_BLOCK(0), block_start = strstart; if (flush) FLUSH_BLOCK(0), block_start = strstart;
/* Make sure that we always have enough lookahead, except /* Make sure that we always have enough lookahead, except
@@ -620,7 +652,7 @@ ulg deflate()
} }
return FLUSH_BLOCK(1); /* eof */ return FLUSH_BLOCK(1); /* eof */
} }
#else /* LAZY */
/* =========================================================================== /* ===========================================================================
* Same as above, but achieves better compression. We use a lazy * Same as above, but achieves better compression. We use a lazy
* evaluation for matches: a match is finally adopted only if there is * evaluation for matches: a match is finally adopted only if there is
@@ -637,6 +669,8 @@ ulg deflate()
extern long isize; /* byte length of input file, for debug only */ extern long isize; /* byte length of input file, for debug only */
#endif #endif
if (compr_level <= 3) return deflate_fast(); /* optimized for speed */
/* Process the input block. */ /* Process the input block. */
while (lookahead != 0) { while (lookahead != 0) {
/* Insert the string window[strstart .. strstart+2] in the /* Insert the string window[strstart .. strstart+2] in the
@@ -727,4 +761,3 @@ ulg deflate()
return FLUSH_BLOCK(1); /* eof */ return FLUSH_BLOCK(1); /* eof */
} }
#endif /* LAZY */
+5
View File
@@ -34,6 +34,11 @@ char *alloca ();
#endif /* alloca.h */ #endif /* alloca.h */
#endif /* not __GNUC__ */ #endif /* not __GNUC__ */
/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. */
#ifndef _NO_PROTO
# define _NO_PROTO
#endif
#include <stdio.h> #include <stdio.h>
#if defined(USG) || defined(STDC_HEADERS) || defined(__GNU_LIBRARY__) #if defined(USG) || defined(STDC_HEADERS) || defined(__GNU_LIBRARY__)
-2
View File
@@ -99,8 +99,6 @@ enum _argtype
differences in the consts, in stdlib.h. To avoid compilation differences in the consts, in stdlib.h. To avoid compilation
errors, only prototype getopt for the GNU C library. */ errors, only prototype getopt for the GNU C library. */
extern int getopt (int argc, char *const *argv, const char *shortopts); extern int getopt (int argc, char *const *argv, const char *shortopts);
#else /* not __GNU_LIBRARY__ */
extern int getopt ();
#endif /* not __GNU_LIBRARY__ */ #endif /* not __GNU_LIBRARY__ */
extern int getopt_long (int argc, char *const *argv, const char *shortopts, extern int getopt_long (int argc, char *const *argv, const char *shortopts,
const struct option *longopts, int *longind); const struct option *longopts, int *longind);
+30 -14
View File
@@ -8,8 +8,9 @@
# We also try to retain the original file permissions on the compressed file. # We also try to retain the original file permissions on the compressed file.
# For safety reasons, gzexe will not create setuid or setgid shell scripts. # For safety reasons, gzexe will not create setuid or setgid shell scripts.
# Warning: the first line of this file must be either : or #!/bin/sh # WARNING: the first line of this file must be either : or #!/bin/sh
# The : is required for some old versions of csh. # The : is required for some old versions of csh.
# On Ultrix, /bin/sh is too buggy, change the first line to: #!/bin/sh5
x=`basename $0` x=`basename $0`
if test $# = 0; then if test $# = 0; then
@@ -37,6 +38,21 @@ if test -z "`(${CPMOD-cpmod} zfoo1$$ zfoo2$$) 2>&1`"; then
fi fi
rm -f zfoo[12]$$ rm -f zfoo[12]$$
tail=""
IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:"
for dir in $PATH; do
test -z "$dir" && dir=.
if test -f $dir/tail; then
tail="$dir/tail"
break
fi
done
IFS="$saveifs"
if test -z "$tail"; then
echo cannot find tail
exit 1
fi
for i do for i do
if test ! -f "$i" ; then if test ! -f "$i" ; then
echo ${x}: $i not a file echo ${x}: $i not a file
@@ -57,10 +73,10 @@ for i do
echo "${x}: $i has setgid permission, unchanged" echo "${x}: $i has setgid permission, unchanged"
continue continue
fi fi
if test "`basename $i`" = gzip; then case "`basename $i`" in
echo "${x}: cannot compress gzip itself" gzip | tail | chmod | ln | sleep | rm)
continue echo "${x}: $i would depend on itself"; continue ;;
fi esac
if test -z "$cpmod"; then if test -z "$cpmod"; then
cp -p "$i" $tmp 2>/dev/null || cp "$i" $tmp cp -p "$i" $tmp 2>/dev/null || cp "$i" $tmp
if test -w $tmp 2>/dev/null; then if test -w $tmp 2>/dev/null; then
@@ -72,25 +88,25 @@ for i do
fi fi
if test $decomp -eq 0; then if test $decomp -eq 0; then
sed 1q $0 > $tmp sed 1q $0 > $tmp
cat >> $tmp <<'EOF' sed "s|^if tail|if $tail|" >> $tmp <<'EOF'
skip=18 skip=18
if tail +$skip $0 | gzip -cd > /tmp/gztmp$$; then if tail +$skip $0 | "/usr/local/bin"/gzip -cd > /tmp/gztmp$$; then
chmod 755 /tmp/gztmp$$ /bin/chmod 700 /tmp/gztmp$$
prog="`basename $0`" prog="`echo $0 | /bin/sed 's|^.*/||`"
if ln /tmp/gztmp$$ "/tmp/$prog" 2>/dev/null; then if /bin/ln /tmp/gztmp$$ "/tmp/$prog" 2>/dev/null; then
trap '/bin/rm -f /tmp/gztmp$$ "/tmp/$prog"; exit $res' 0 trap '/bin/rm -f /tmp/gztmp$$ "/tmp/$prog"; exit $res' 0
(sleep 5; /bin/rm -f /tmp/gztmp$$ "/tmp/$prog") 2>/dev/null & (/bin/sleep 5; /bin/rm -f /tmp/gztmp$$ "/tmp/$prog") 2>/dev/null &
/tmp/"$prog" ${1+"$@"}; res=$? /tmp/"$prog" ${1+"$@"}; res=$?
else else
trap '/bin/rm -f /tmp/gztmp$$; exit $res' 0 trap '/bin/rm -f /tmp/gztmp$$; exit $res' 0
(sleep 5; /bin/rm -f /tmp/gztmp$$) 2>/dev/null & (/bin/sleep 5; /bin/rm -f /tmp/gztmp$$) 2>/dev/null &
/tmp/gztmp$$ ${1+"$@"}; res=$? /tmp/gztmp$$ ${1+"$@"}; res=$?
fi fi
else else
echo Cannot decompress $0; exit 1 echo Cannot decompress $0; exit 1
fi; exit $res fi; exit $res
EOF EOF
gzip -cv9 "$i" >> $tmp || { "/usr/local/bin"/gzip -cv9 "$i" >> $tmp || {
/bin/rm -f $tmp /bin/rm -f $tmp
echo ${x}: compression not possible for $i, file unchanged. echo ${x}: compression not possible for $i, file unchanged.
res=1 res=1
@@ -103,7 +119,7 @@ EOF
if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then
eval `sed -e 1d -e 2q "$i"` eval `sed -e 1d -e 2q "$i"`
fi fi
if tail +$skip "$i" | gzip -cd > $tmp; then if tail +$skip "$i" | "/usr/local/bin"/gzip -cd > $tmp; then
: :
else else
echo ${x}: $i probably not in gzexe format, file unchanged. echo ${x}: $i probably not in gzexe format, file unchanged.
+7
View File
@@ -27,6 +27,13 @@ This utility is most useful on systems with very small disks.
Decompress the given executables instead of compressing them. Decompress the given executables instead of compressing them.
.SH "SEE ALSO" .SH "SEE ALSO"
gzip(1), znew(1), zmore(1), zcmp(1), zforce(1) gzip(1), znew(1), zmore(1), zcmp(1), zforce(1)
.SH CAVEATS
The compressed executable is a shell script. This may create some
security holes. In particular, the compressed executable relies
on the PATH environment variable to find
.I gzip
and some other utilities
.I (tail, chmod, ln, sleep).
.SH "BUGS" .SH "BUGS"
.I gzexe .I gzexe
attempts to retain the original file attributes on the compressed executable, attempts to retain the original file attributes on the compressed executable,
+30 -14
View File
@@ -9,8 +9,9 @@
# We also try to retain the original file permissions on the compressed file. # We also try to retain the original file permissions on the compressed file.
# For safety reasons, gzexe will not create setuid or setgid shell scripts. # For safety reasons, gzexe will not create setuid or setgid shell scripts.
# Warning: the first line of this file must be either : or #!/bin/sh # WARNING: the first line of this file must be either : or #!/bin/sh
# The : is required for some old versions of csh. # The : is required for some old versions of csh.
# On Ultrix, /bin/sh is too buggy, change the first line to: #!/bin/sh5
x=`basename $0` x=`basename $0`
if test $# = 0; then if test $# = 0; then
@@ -38,6 +39,21 @@ if test -z "`(${CPMOD-cpmod} zfoo1$$ zfoo2$$) 2>&1`"; then
fi fi
rm -f zfoo[12]$$ rm -f zfoo[12]$$
tail=""
IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:"
for dir in $PATH; do
test -z "$dir" && dir=.
if test -f $dir/tail; then
tail="$dir/tail"
break
fi
done
IFS="$saveifs"
if test -z "$tail"; then
echo cannot find tail
exit 1
fi
for i do for i do
if test ! -f "$i" ; then if test ! -f "$i" ; then
echo ${x}: $i not a file echo ${x}: $i not a file
@@ -58,10 +74,10 @@ for i do
echo "${x}: $i has setgid permission, unchanged" echo "${x}: $i has setgid permission, unchanged"
continue continue
fi fi
if test "`basename $i`" = gzip; then case "`basename $i`" in
echo "${x}: cannot compress gzip itself" gzip | tail | chmod | ln | sleep | rm)
continue echo "${x}: $i would depend on itself"; continue ;;
fi esac
if test -z "$cpmod"; then if test -z "$cpmod"; then
cp -p "$i" $tmp 2>/dev/null || cp "$i" $tmp cp -p "$i" $tmp 2>/dev/null || cp "$i" $tmp
if test -w $tmp 2>/dev/null; then if test -w $tmp 2>/dev/null; then
@@ -73,25 +89,25 @@ for i do
fi fi
if test $decomp -eq 0; then if test $decomp -eq 0; then
sed 1q $0 > $tmp sed 1q $0 > $tmp
cat >> $tmp <<'EOF' sed "s|^if tail|if $tail|" >> $tmp <<'EOF'
skip=18 skip=18
if tail +$skip $0 | gzip -cd > /tmp/gztmp$$; then if tail +$skip $0 | "BINDIR"/gzip -cd > /tmp/gztmp$$; then
chmod 755 /tmp/gztmp$$ /bin/chmod 700 /tmp/gztmp$$
prog="`basename $0`" prog="`echo $0 | /bin/sed 's|^.*/||`"
if ln /tmp/gztmp$$ "/tmp/$prog" 2>/dev/null; then if /bin/ln /tmp/gztmp$$ "/tmp/$prog" 2>/dev/null; then
trap '/bin/rm -f /tmp/gztmp$$ "/tmp/$prog"; exit $res' 0 trap '/bin/rm -f /tmp/gztmp$$ "/tmp/$prog"; exit $res' 0
(sleep 5; /bin/rm -f /tmp/gztmp$$ "/tmp/$prog") 2>/dev/null & (/bin/sleep 5; /bin/rm -f /tmp/gztmp$$ "/tmp/$prog") 2>/dev/null &
/tmp/"$prog" ${1+"$@"}; res=$? /tmp/"$prog" ${1+"$@"}; res=$?
else else
trap '/bin/rm -f /tmp/gztmp$$; exit $res' 0 trap '/bin/rm -f /tmp/gztmp$$; exit $res' 0
(sleep 5; /bin/rm -f /tmp/gztmp$$) 2>/dev/null & (/bin/sleep 5; /bin/rm -f /tmp/gztmp$$) 2>/dev/null &
/tmp/gztmp$$ ${1+"$@"}; res=$? /tmp/gztmp$$ ${1+"$@"}; res=$?
fi fi
else else
echo Cannot decompress $0; exit 1 echo Cannot decompress $0; exit 1
fi; exit $res fi; exit $res
EOF EOF
gzip -cv9 "$i" >> $tmp || { "BINDIR"/gzip -cv9 "$i" >> $tmp || {
/bin/rm -f $tmp /bin/rm -f $tmp
echo ${x}: compression not possible for $i, file unchanged. echo ${x}: compression not possible for $i, file unchanged.
res=1 res=1
@@ -104,7 +120,7 @@ EOF
if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then
eval `sed -e 1d -e 2q "$i"` eval `sed -e 1d -e 2q "$i"`
fi fi
if tail +$skip "$i" | gzip -cd > $tmp; then if tail +$skip "$i" | "BINDIR"/gzip -cd > $tmp; then
: :
else else
echo ${x}: $i probably not in gzexe format, file unchanged. echo ${x}: $i probably not in gzexe format, file unchanged.
+98 -19
View File
@@ -5,7 +5,7 @@ gzip, gunzip, zcat \- compress or expand files
.SH SYNOPSIS .SH SYNOPSIS
.ll +8 .ll +8
.B gzip .B gzip
.RB [ " \-acdfhLrtvV19 " ] .RB [ " \-acdfhlLnrtvV19 " ]
.RB [ \-S\ suffix ] .RB [ \-S\ suffix ]
[ [
.I "name \&..." .I "name \&..."
@@ -13,14 +13,14 @@ gzip, gunzip, zcat \- compress or expand files
.ll -8 .ll -8
.br .br
.B gunzip .B gunzip
.RB [ " \-acfhLrtvV " ] .RB [ " \-acfhlLnrtvV " ]
.RB [ \-S\ suffix ] .RB [ \-S\ suffix ]
[ [
.I "name \&..." .I "name \&..."
] ]
.br .br
.B zcat .B zcat
.RB [ " \-hLV " ] .RB [ " \-fhLV " ]
[ [
.I "name \&..." .I "name \&..."
] ]
@@ -35,21 +35,33 @@ while keeping the same ownership modes, access and modification times.
.B "\-gz" .B "\-gz"
for VMS, for VMS,
.B "z" .B "z"
for MSDOS, OS/2 and Atari.) for MSDOS, OS/2 FAT and Atari.)
If no files are specified, the standard input is compressed to the If no files are specified, the standard input is compressed to the
standard output. If the new file name is too long, standard output.
.I gzip
truncates it and keeps the original file name in the compressed file.
.I Gzip .I Gzip
will only attempt to compress regular files. will only attempt to compress regular files.
In particular, it will ignore symbolic links. In particular, it will ignore symbolic links.
.PP .PP
If the new file name is too long for its file system,
.I gzip
truncates it and keeps the original file name in the compressed file.
.I Gzip
attempts to truncate only the parts of the file name longer than 3 characters.
(A part is delimited by dots.) If the name consists of small parts only,
the longest parts are truncated. For example, if file names are limited
to 14 characters, gzip.msdos.exe is compressed to gzi.msd.exe.gz.
Names are not truncated on systems which do not have a limit on file name
length.
.PP
Compressed files can be restored to their original form using Compressed files can be restored to their original form using
.I gzip -d .I gzip -d
or or
.I gunzip .I gunzip
or or
.I zcat. .I zcat.
If the original name saved in the compressed file is not suitable for its
file system, a new name is constructed from the original one to make it
legal.
.PP .PP
.I gunzip .I gunzip
takes a list of files on its command line and replaces each takes a list of files on its command line and replaces each
@@ -66,10 +78,17 @@ as shorthands for
and and
.B "\&.tar.Z" .B "\&.tar.Z"
respectively. respectively.
When compressing,
.I gzip
uses the
.B "\&.tgz"
extension if necessary instead of truncating a file with a
.B "\&.tar"
extension.
.PP .PP
.I gunzip .I gunzip
can currently decompress files created by can currently decompress files created by
.I gzip, zip, compress .I gzip, zip, compress, compress -H
or or
.I pack. .I pack.
The detection of the input format is automatic. When using The detection of the input format is automatic. When using
@@ -77,7 +96,7 @@ the first two formats,
.I gunzip .I gunzip
checks a 32 bit CRC. For checks a 32 bit CRC. For
.I pack, gunzip .I pack, gunzip
checks the uncompressed length. The checks the uncompressed length. The standard
.I compress .I compress
format was not designed to allow consistency checks. However format was not designed to allow consistency checks. However
.I gunzip .I gunzip
@@ -88,6 +107,8 @@ correct simply because the standard
does not complain. This generally means that the standard does not complain. This generally means that the standard
.I uncompress .I uncompress
does not check its input, and happily generates garbage output. does not check its input, and happily generates garbage output.
The SCO compress -H format (lzh compression method) does not include a CRC
but also allows some consistency checks.
.PP .PP
Files created by Files created by
.I zip .I zip
@@ -150,7 +171,7 @@ Ascii text mode: convert end-of-lines using local conventions. This option
is supported only on some non-Unix systems. For MSDOS, CR LF is converted is supported only on some non-Unix systems. For MSDOS, CR LF is converted
to LF when compressing, and LF is converted to CR LF when decompressing. to LF when compressing, and LF is converted to CR LF when decompressing.
.TP .TP
.B \-c --stdout .B \-c --stdout --to-stdout
Write output on standard output; keep original files unchanged. Write output on standard output; keep original files unchanged.
If there are several input files, the output consists of a sequence of If there are several input files, the output consists of a sequence of
independently compressed members. To obtain better compression, independently compressed members. To obtain better compression,
@@ -162,7 +183,15 @@ Decompress.
.B \-f --force .B \-f --force
Force compression or decompression even if the file has multiple links Force compression or decompression even if the file has multiple links
or the corresponding file already exists, or if the compressed data or the corresponding file already exists, or if the compressed data
is read from or written to a terminal. If is read from or written to a terminal. If the input data is not in
a format recognized by
.I gzip,
and if the option --stdout is also given, copy the input data without change
to the standard ouput: let
.I zcat
behave as
.I cat.
If
.B \-f .B \-f
is not given, is not given,
and when not running in the background, and when not running in the background,
@@ -172,10 +201,47 @@ prompts to verify whether an existing file should be overwritten.
.B \-h --help .B \-h --help
Display a help screen and quit. Display a help screen and quit.
.TP .TP
.B \-l --list
For each compressed file, list the following fields:
compressed size: size of the compressed file
uncompressed size: size of the uncompressed file
ratio: compression ratio (0.0% if unknown)
uncompressed_name: name of the uncompressed file
The uncompressed size is given as -1 for files not in gzip format,
such as compressed .Z files. To get the uncompressed size for such a file,
you can use:
zcat file.Z | wc -c
In combination with the --verbose option, the following fields are also
displayed:
method: compression method
crc: the 32-bit CRC of the uncompressed data
date & time: time stamp for the uncompressed file
The compression methods currently supported are deflate, compress, lzh
(SCO compress -H) and pack. The crc is given as ffffffff for a file
not in gzip format.
With --verbose, the size totals and compression ratio for all files
is also displayed, unless some sizes are unknown. With --quiet,
the title and totals lines are not displayed.
.TP
.B \-L --license .B \-L --license
Display the Display the
.I gzip .I gzip
license. license and quit.
.TP
.B \-n --no-name
When compressing, do not save the original file name by default. (The
original name is always saved if the name had to be truncated.) When
decompressing, do not restore the original file name if present: remove
only the
.I gzip
suffix from the compressed file name.
.TP .TP
.B \-q --quiet .B \-q --quiet
Suppress all warnings. Suppress all warnings.
@@ -189,10 +255,15 @@ will descend into the directory and compress all the files it finds there
.I gunzip .I gunzip
). ).
.TP .TP
.B \-S .z --suffix .z .B \-S .suf --suffix .suf
Use suffix .z instead of .gz. Any suffix can be given, but suffixes Use suffix .suf instead of .gz. Any suffix can be given, but suffixes
other than .z and .gz should be avoided to avoid confusion when files other than .z and .gz should be avoided to avoid confusion when files
are transferred to other systems. Previous versions of gzip used are transferred to other. A null suffix forces gunzip to try
decompression on all given files regardless of suffix, as in:
gunzip -S "" * (*.* for MSDOS)
Previous versions of gzip used
the .z suffix. This was changed to avoid a conflict with the .z suffix. This was changed to avoid a conflict with
.IR pack "(1)". .IR pack "(1)".
.TP .TP
@@ -200,7 +271,8 @@ the .z suffix. This was changed to avoid a conflict with
Test. Check the compressed file integrity. Test. Check the compressed file integrity.
.TP .TP
.B \-v --verbose .B \-v --verbose
Verbose. Display the name and percentage reduction for each file compressed. Verbose. Display the name and percentage reduction for each file compressed
or decompressed.
.TP .TP
.B \-V --version .B \-V --version
Version. Display the version number and compilation options then quit. Version. Display the version number and compilation options then quit.
@@ -219,7 +291,8 @@ or
.B \-\-best .B \-\-best
indicates the slowest compression method (optimal compression). indicates the slowest compression method (optimal compression).
The default compression level is The default compression level is
.BR \-5. .BR \-6
(that is, biased towards high compression at expense of speed).
.SH "ADVANCED USAGE" .SH "ADVANCED USAGE"
Multiple compressed files can be concatenated. In this case, Multiple compressed files can be concatenated. In this case,
.I gunzip .I gunzip
@@ -268,7 +341,7 @@ pack(1), compact(1)
Exit status is normally 0; Exit status is normally 0;
if an error occurs, exit status is 1. If a warning occurs, exit status is 2. if an error occurs, exit status is 1. If a warning occurs, exit status is 2.
.PP .PP
Usage: gzip [-cdfhLrtvV19] [-S suffix] [file ...] Usage: gzip [-cdfhlLnrtvV19] [-S suffix] [file ...]
.in +8 .in +8
Invalid options were specified on the command line. Invalid options were specified on the command line.
.in -8 .in -8
@@ -322,7 +395,9 @@ been corrupted.
.in +8 .in +8
Percentage of the input saved by compression. Percentage of the input saved by compression.
(Relevant only for (Relevant only for
.BR \-v \.) .BR \-v
and
.BR \-l \.)
.in -8 .in -8
-- not a regular file or directory: ignored -- not a regular file or directory: ignored
.in +8 .in +8
@@ -358,3 +433,7 @@ environment variable as in:
In the above example, gzip is invoked implicitly by the -z option In the above example, gzip is invoked implicitly by the -z option
of GNU tar. Make sure that the same block size (-b option of of GNU tar. Make sure that the same block size (-b option of
tar) is used for reading and writing compressed data on tapes. tar) is used for reading and writing compressed data on tapes.
.SH BUGS
The --list option reports incorrect sizes if they exceed 2 gigabytes.
The --list option reports sizes as -1 and crc as ffffffff if the
compressed file is on a non seekable media.
+310 -89
View File
@@ -31,19 +31,23 @@ static char *license_msg[] = {
* Outputs: * Outputs:
* file.gz: compressed file with same mode, owner, and utimes * file.gz: compressed file with same mode, owner, and utimes
* or stdout with -c option or if stdin used as input. * or stdout with -c option or if stdin used as input.
* If the OS does not support file names with multiple dots (MSDOS, VMS) or * If the output file name had to be truncated, the original name is kept
* if the output file name had to be truncated, the original name is kept
* in the compressed file. * in the compressed file.
* On MSDOS, file.tmp -> file.tmz. On VMS, file.tmp -> file.tmp-gz. * On MSDOS, file.tmp -> file.tmz. On VMS, file.tmp -> file.tmp-gz.
* *
* Using gz on MSDOS would create too many file name conflicts. For
* example, foo.txt -> foo.tgz (.tgz must be reserved as shorthand for
* tar.gz). Similarly, foo.dir and foo.doc would both be mapped to foo.dgz.
* I also considered 12345678.txt -> 12345txt.gz but this truncates the name
* too heavily. There is no ideal solution given the MSDOS 8+3 limitation.
*
* For the meaning of all compilation flags, see comments in Makefile.in. * For the meaning of all compilation flags, see comments in Makefile.in.
*/ */
#ifndef lint #ifndef lint
static char rcsid[] = "$Id: gzip.c,v 0.19 1993/06/01 14:21:46 jloup Exp $"; static char rcsid[] = "$Id: gzip.c,v 0.22 1993/06/16 16:53:43 jloup Exp $";
#endif #endif
#include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <sys/types.h> #include <sys/types.h>
#include <signal.h> #include <signal.h>
@@ -58,6 +62,12 @@ static char rcsid[] = "$Id: gzip.c,v 0.19 1993/06/01 14:21:46 jloup Exp $";
/* configuration */ /* configuration */
#ifdef NO_TIME_H
# include <sys/time.h>
#else
# include <time.h>
#endif
#ifndef NO_FCNTL_H #ifndef NO_FCNTL_H
# include <fcntl.h> # include <fcntl.h>
#endif #endif
@@ -157,8 +167,21 @@ typedef RETSIGTYPE (*sig_type) OF((int));
# define MAX_PATH_LEN 1024 /* max pathname length */ # define MAX_PATH_LEN 1024 /* max pathname length */
#endif #endif
#define MAX_HEADER_LEN 16 #ifndef SEEK_END
/* max length of a compressed file header, fixed part only */ # define SEEK_END 2
#endif
#ifdef NO_OFF_T
typedef long off_t;
off_t lseek OF((int fd, off_t offset, int whence));
#endif
/* Separator for file name parts (see shorten_name()) */
#ifdef NO_MULTIPLE_DOTS
# define PART_SEP "-"
#else
# define PART_SEP "."
#endif
/* global buffers */ /* global buffers */
@@ -179,7 +202,9 @@ int ascii = 0; /* convert end-of-lines to local OS conventions */
int to_stdout = 0; /* output to stdout (-c) */ int to_stdout = 0; /* output to stdout (-c) */
int decompress = 0; /* decompress (-d) */ int decompress = 0; /* decompress (-d) */
int force = 0; /* don't ask questions, compress links (-f) */ int force = 0; /* don't ask questions, compress links (-f) */
int no_name = 0; /* don't save or restore the original file name */
int recursive = 0; /* recurse through directories (-r) */ int recursive = 0; /* recurse through directories (-r) */
int list = 0; /* list the file contents (-l) */
int verbose = 0; /* be verbose (-v) */ int verbose = 0; /* be verbose (-v) */
int quiet = 0; /* be very quiet (-q) */ int quiet = 0; /* be very quiet (-q) */
int do_lzw = 0; /* generate output compatible with old compress (-Z) */ int do_lzw = 0; /* generate output compatible with old compress (-Z) */
@@ -188,12 +213,12 @@ int foreground; /* set if program run in foreground */
char *progname; /* program name */ char *progname; /* program name */
int maxbits = BITS; /* max bits per code for LZW */ int maxbits = BITS; /* max bits per code for LZW */
int method = DEFLATED;/* compression method */ int method = DEFLATED;/* compression method */
int level = 5; /* compression level */ int level = 6; /* compression level */
int exit_code = OK; /* program exit code */ int exit_code = OK; /* program exit code */
int save_orig_name; /* set if original name must be saved */ int save_orig_name; /* set if original name must be saved */
int last_member; /* set for .zip and .Z files */ int last_member; /* set for .zip and .Z files */
int part_nb; /* number of parts in .gz file */ int part_nb; /* number of parts in .gz file */
ulg time_stamp; /* original time stamp (modification time) */ long time_stamp; /* original time stamp (modification time) */
long ifile_size; /* input file size, -1 for devices (debug only) */ long ifile_size; /* input file size, -1 for devices (debug only) */
char *env; /* contents of GZIP env variable */ char *env; /* contents of GZIP env variable */
char **args = NULL; /* argv pointer if GZIP env variable defined */ char **args = NULL; /* argv pointer if GZIP env variable defined */
@@ -202,6 +227,8 @@ int z_len; /* strlen(z_suffix) */
long bytes_in; /* number of input bytes */ long bytes_in; /* number of input bytes */
long bytes_out; /* number of output bytes */ long bytes_out; /* number of output bytes */
long total_in = 0; /* input bytes for all files */
long total_out = 0; /* output bytes for all files */
char ifname[MAX_PATH_LEN]; /* input file name */ char ifname[MAX_PATH_LEN]; /* input file name */
char ofname[MAX_PATH_LEN]; /* output file name */ char ofname[MAX_PATH_LEN]; /* output file name */
int remove_ofname = 0; /* remove output file on error */ int remove_ofname = 0; /* remove output file on error */
@@ -224,8 +251,9 @@ struct option longopts[] =
{"force", 0, 0, 'f'}, /* force overwrite of output file */ {"force", 0, 0, 'f'}, /* force overwrite of output file */
{"help", 0, 0, 'h'}, /* give help */ {"help", 0, 0, 'h'}, /* give help */
/* {"pkzip", 0, 0, 'k'}, force output in pkzip format */ /* {"pkzip", 0, 0, 'k'}, force output in pkzip format */
/* {"list", 0, 0, 'l'}, list .gz file contents */ {"list", 0, 0, 'l'}, /* list .gz file contents */
{"license", 0, 0, 'L'}, /* display software license */ {"license", 0, 0, 'L'}, /* display software license */
{"no-name", 0, 0, 'n'}, /* don't save or restore the original name */
{"quiet", 0, 0, 'q'}, /* quiet mode */ {"quiet", 0, 0, 'q'}, /* quiet mode */
{"silent", 0, 0, 'q'}, /* quiet mode */ {"silent", 0, 0, 'q'}, /* quiet mode */
{"recurse", 0, 0, 'r'}, /* recurse through directories */ {"recurse", 0, 0, 'r'}, /* recurse through directories */
@@ -255,7 +283,9 @@ local int get_istat OF((char *iname, struct stat *sbuf));
local int make_ofname OF((void)); local int make_ofname OF((void));
local int same_file OF((struct stat *stat1, struct stat *stat2)); local int same_file OF((struct stat *stat1, struct stat *stat2));
local int name_too_long OF((char *name, struct stat *statb)); local int name_too_long OF((char *name, struct stat *statb));
local void shorten_name OF((char *name));
local int get_method OF((int in)); local int get_method OF((int in));
local void do_list OF((int ifd, int method));
local int check_ofname OF((void)); local int check_ofname OF((void));
local void reset_times OF((char *name, struct stat *statb)); local void reset_times OF((char *name, struct stat *statb));
local void copy_stat OF((struct stat *ifstat)); local void copy_stat OF((struct stat *ifstat));
@@ -270,7 +300,7 @@ int (*work) OF((int infile, int outfile)) = zip; /* function to call */
/* ======================================================================== */ /* ======================================================================== */
local void usage() local void usage()
{ {
fprintf(stderr, "usage: %s [-%scdfhL%stvV19] [-S suffix] [file ...]\n", fprintf(stderr, "usage: %s [-%scdfhlLn%stvV19] [-S suffix] [file ...]\n",
progname, progname,
#if O_BINARY #if O_BINARY
"a", "a",
@@ -298,16 +328,17 @@ local void help()
" -f --force force overwrite of output file and compress links", " -f --force force overwrite of output file and compress links",
" -h --help give this help", " -h --help give this help",
/* -k --pkzip force output in pkzip format */ /* -k --pkzip force output in pkzip format */
/* -l --list list .gz file contents */ " -l --list list .gz file contents",
" -L --license display software license", " -L --license display software license",
" -n --no-name do not save or restore the original name",
" -q --quiet suppress all warnings", " -q --quiet suppress all warnings",
#ifndef NO_DIR #ifndef NO_DIR
" -r --recurse recurse through directories", " -r --recurse recurse through directories",
#endif #endif
#ifdef MAX_EXT_CHARS #ifdef MAX_EXT_CHARS
" -S --suffix .gz use suffix .gz instead of .z", " -S .suf --suffix .suf use suffix .suf instead of .z",
#else #else
" -S --suffix .z use suffix .z instead of .gz", " -S .suf --suffix .suf use suffix .suf instead of .gz",
#endif #endif
" -t --test test compressed file integrity", " -t --test test compressed file integrity",
" -v --verbose verbose mode", " -v --verbose verbose mode",
@@ -435,7 +466,7 @@ int main (argc, argv)
strncpy(z_suffix, Z_SUFFIX, sizeof(z_suffix)-1); strncpy(z_suffix, Z_SUFFIX, sizeof(z_suffix)-1);
z_len = strlen(z_suffix); z_len = strlen(z_suffix);
while ((optc = getopt_long (argc, argv, "ab:cdfhLqrS:tvVZ123456789", while ((optc = getopt_long (argc, argv, "ab:cdfhlLnqrS:tvVZ123456789",
longopts, (int *)0)) != EOF) { longopts, (int *)0)) != EOF) {
switch (optc) { switch (optc) {
case 'a': case 'a':
@@ -451,8 +482,12 @@ int main (argc, argv)
force++; break; force++; break;
case 'h': case 'H': case '?': case 'h': case 'H': case '?':
help(); do_exit(OK); break; help(); do_exit(OK); break;
case 'l':
list = decompress = to_stdout = 1; break;
case 'L': case 'L':
license(); do_exit(OK); break; license(); do_exit(OK); break;
case 'n':
no_name = 1; break;
case 'q': case 'q':
quiet = 1; verbose = 0; break; quiet = 1; verbose = 0; break;
case 'r': case 'r':
@@ -468,11 +503,6 @@ int main (argc, argv)
if (*optarg == '.') optarg++; if (*optarg == '.') optarg++;
#endif #endif
z_len = strlen(optarg); z_len = strlen(optarg);
if (z_len == 0 || z_len > MAX_SUFFIX) {
fprintf(stderr, "%s: incorrect suffix '%s'\n",
progname, optarg);
do_exit(ERROR);
}
strcpy(z_suffix, optarg); strcpy(z_suffix, optarg);
break; break;
case 't': case 't':
@@ -511,6 +541,11 @@ int main (argc, argv)
progname); progname);
} }
#endif #endif
if ((z_len == 0 && !decompress) || z_len > MAX_SUFFIX) {
fprintf(stderr, "%s: incorrect suffix '%s'\n",
progname, optarg);
do_exit(ERROR);
}
if (do_lzw && !decompress) work = lzw; if (do_lzw && !decompress) work = lzw;
/* Allocate all global buffers (for DYN_ALLOC option) */ /* Allocate all global buffers (for DYN_ALLOC option) */
@@ -527,7 +562,7 @@ int main (argc, argv)
/* And get to work */ /* And get to work */
if (file_count != 0) { if (file_count != 0) {
if (to_stdout && !test && (!decompress || !ascii)) { if (to_stdout && !test && !list && (!decompress || !ascii)) {
SET_BINARY_MODE(fileno(stdout)); SET_BINARY_MODE(fileno(stdout));
} }
while (optind < argc) { while (optind < argc) {
@@ -536,6 +571,9 @@ int main (argc, argv)
} else { /* Standard input */ } else { /* Standard input */
treat_stdin(); treat_stdin();
} }
if (list && !quiet) {
do_list(-1, -1); /* print totals */
}
do_exit(exit_code); do_exit(exit_code);
return exit_code; /* just to avoid lint warning */ return exit_code; /* just to avoid lint warning */
} }
@@ -569,7 +607,7 @@ local void treat_stdin()
if (decompress || !ascii) { if (decompress || !ascii) {
SET_BINARY_MODE(fileno(stdin)); SET_BINARY_MODE(fileno(stdin));
} }
if (!test && (!decompress || !ascii)) { if (!test && !list && (!decompress || !ascii)) {
SET_BINARY_MODE(fileno(stdout)); SET_BINARY_MODE(fileno(stdout));
} }
strcpy(ifname, "stdin"); strcpy(ifname, "stdin");
@@ -604,6 +642,10 @@ local void treat_stdin()
do_exit(exit_code); /* error message already emitted */ do_exit(exit_code); /* error message already emitted */
} }
} }
if (list) {
do_list(ifd, method);
return;
}
/* Actually do the compression/decompression. Loop over zipped members. /* Actually do the compression/decompression. Loop over zipped members.
*/ */
@@ -620,14 +662,17 @@ local void treat_stdin()
if (verbose) { if (verbose) {
if (test) { if (test) {
fprintf(stderr, " OK"); fprintf(stderr, " OK\n");
} else if (decompress) { } else if (!decompress) {
display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out); display_ratio(bytes_in-(bytes_out-header_bytes), bytes_in, stderr);
fprintf(stderr, "\n");
#ifdef DISPLAY_STDIN_RATIO
} else { } else {
display_ratio(bytes_in-(bytes_out-header_bytes), bytes_in); display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out,stderr);
fprintf(stderr, "\n");
#endif
} }
fprintf(stderr, "\n");
} }
} }
@@ -671,7 +716,7 @@ local void treat_file(iname)
time_stamp = istat.st_mtime; time_stamp = istat.st_mtime;
/* Generate output file name */ /* Generate output file name */
if (to_stdout) { if (to_stdout && !list) {
strcpy(ofname, "stdout"); strcpy(ofname, "stdout");
} else if (make_ofname() != OK) { } else if (make_ofname() != OK) {
@@ -700,6 +745,11 @@ local void treat_file(iname)
return; /* error message already emitted */ return; /* error message already emitted */
} }
} }
if (list) {
do_list(ifd, method);
close(ifd);
return;
}
/* If compressing to a file, check if ofname is not ambiguous /* If compressing to a file, check if ofname is not ambiguous
* because the operating system truncates names. Otherwise, generate * because the operating system truncates names. Otherwise, generate
@@ -716,6 +766,9 @@ local void treat_file(iname)
progname, ifname, ofname); progname, ifname, ofname);
} }
} }
/* Keep the name even if not truncated except with --no-name: */
if (!save_orig_name) save_orig_name = !no_name;
if (verbose) { if (verbose) {
fprintf(stderr, "%s:\t%s", ifname, (int)strlen(ifname) >= 15 ? fprintf(stderr, "%s:\t%s", ifname, (int)strlen(ifname) >= 15 ?
"" : ((int)strlen(ifname) >= 7 ? "\t" : "\t\t")); "" : ((int)strlen(ifname) >= 7 ? "\t" : "\t\t"));
@@ -749,9 +802,9 @@ local void treat_file(iname)
if (test) { if (test) {
fprintf(stderr, " OK"); fprintf(stderr, " OK");
} else if (decompress) { } else if (decompress) {
display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out); display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out,stderr);
} else { } else {
display_ratio(bytes_in-(bytes_out-header_bytes), bytes_in); display_ratio(bytes_in-(bytes_out-header_bytes), bytes_in, stderr);
} }
if (!test && !to_stdout) { if (!test && !to_stdout) {
fprintf(stderr, " -- replaced with %s", ofname); fprintf(stderr, " -- replaced with %s", ofname);
@@ -768,6 +821,7 @@ local void treat_file(iname)
* Create the output file. Return OK or ERROR. * Create the output file. Return OK or ERROR.
* Try several times if necessary to avoid truncating the z_suffix. For * Try several times if necessary to avoid truncating the z_suffix. For
* example, do not create a compressed file of name "1234567890123." * example, do not create a compressed file of name "1234567890123."
* Sets save_orig_name to true if the file name has been truncated.
* IN assertions: the input file has already been open (ifd is set) and * IN assertions: the input file has already been open (ifd is set) and
* ofname has already been updated if there was an original name. * ofname has already been updated if there was an original name.
* OUT assertions: ifd and ofd are closed in case of error. * OUT assertions: ifd and ofd are closed in case of error.
@@ -775,15 +829,13 @@ local void treat_file(iname)
local int create_outfile() local int create_outfile()
{ {
struct stat ostat; /* stat for ofname */ struct stat ostat; /* stat for ofname */
int len;
int flags = O_WRONLY | O_CREAT | O_EXCL | O_BINARY; int flags = O_WRONLY | O_CREAT | O_EXCL | O_BINARY;
if (ascii && decompress) { if (ascii && decompress) {
flags &= ~O_BINARY; /* force ascii text mode */ flags &= ~O_BINARY; /* force ascii text mode */
} }
for (;;) { for (;;) {
len = strlen(ofname); /* Make sure that ofname is not an existing file */
if (len == 0 || ofname[len] == PATH_SEP) break;
if (check_ofname() != OK) { if (check_ofname() != OK) {
close(ifd); close(ifd);
return ERROR; return ERROR;
@@ -799,7 +851,11 @@ local int create_outfile()
} }
/* Check for name truncation on new file (1234567890123.gz) */ /* Check for name truncation on new file (1234567890123.gz) */
#ifdef NO_FSTAT
if (stat(ofname, &ostat) != 0) {
#else
if (fstat(ofd, &ostat) != 0) { if (fstat(ofd, &ostat) != 0) {
#endif
fprintf(stderr, "%s: ", progname); fprintf(stderr, "%s: ", progname);
perror(ofname); perror(ofname);
close(ifd); close(ofd); close(ifd); close(ofd);
@@ -814,25 +870,16 @@ local int create_outfile()
WARN((stderr, "%s: %s: warning, name truncated\n", WARN((stderr, "%s: %s: warning, name truncated\n",
progname, ofname)); progname, ofname));
return OK; return OK;
} else { }
close(ofd);
unlink(ofname);
#ifdef NO_MULTIPLE_DOTS #ifdef NO_MULTIPLE_DOTS
/* Should never happen, see check_ofname() */ /* Should never happen, see check_ofname() */
fprintf(stderr, "%s: %s: name too long\n", progname, ofname); fprintf(stderr, "%s: %s: name too long\n", progname, ofname);
do_exit(ERROR); do_exit(ERROR);
#else
close(ofd);
unlink(ofname);
save_orig_name = 1;
strcpy(ofname+strlen(ofname)-z_len-1, z_suffix);
/* 123456789012.gz -> 12345678901.gz */
#endif #endif
} /* decompress ? */ shorten_name(ofname);
} /* while non null name */ }
close(ifd);
fprintf(stderr, "%s: %s: name too long\n", progname, ofname);
exit_code = ERROR;
return ERROR;
} }
/* ======================================================================== /* ========================================================================
@@ -861,6 +908,8 @@ local int do_stat(name, sbuf)
* also accepted suffixes. For Unix, we do not want to accept any * also accepted suffixes. For Unix, we do not want to accept any
* .??z suffix as indicating a compressed file; some people use .xyz * .??z suffix as indicating a compressed file; some people use .xyz
* to denote volume data. * to denote volume data.
* On systems allowing multiple versions of the same file (such as VMS),
* this function removes any version suffix in the given name.
*/ */
local char *get_suffix(name) local char *get_suffix(name)
char *name; char *name;
@@ -877,19 +926,19 @@ local char *get_suffix(name)
if (strequ(z_suffix, "z")) suf++; /* check long suffixes first */ if (strequ(z_suffix, "z")) suf++; /* check long suffixes first */
#ifdef SUFFIX_SEP
/* strip a version number from the file name */
{
char *v = strrchr(name, SUFFIX_SEP);
if (v != NULL) *v = '\0';
}
#endif
nlen = strlen(name); nlen = strlen(name);
if (nlen <= MAX_SUFFIX+2) { if (nlen <= MAX_SUFFIX+2) {
strcpy(suffix, name); strcpy(suffix, name);
} else { } else {
strcpy(suffix, name+nlen-MAX_SUFFIX-2); strcpy(suffix, name+nlen-MAX_SUFFIX-2);
} }
#ifdef SUFFIX_SEP
/* strip a version number from the file name */
{
char *v = strrchr(suffix, SUFFIX_SEP);
if (v != NULL) *v = '\0', nlen = v - name;
}
#endif
strlwr(suffix); strlwr(suffix);
slen = strlen(suffix); slen = strlen(suffix);
do { do {
@@ -933,7 +982,8 @@ local int get_istat(iname, sbuf)
exit_code = ERROR; exit_code = ERROR;
return ERROR; return ERROR;
} }
/* file.ext doesn't exist, try adding a suffix. /* file.ext doesn't exist, try adding a suffix (after removing any
* version number for VMS).
*/ */
s = get_suffix(ifname); s = get_suffix(ifname);
if (s != NULL) { if (s != NULL) {
@@ -941,10 +991,6 @@ local int get_istat(iname, sbuf)
exit_code = ERROR; exit_code = ERROR;
return ERROR; return ERROR;
} }
#ifdef SUFFIX_SEP
/* strip a version number from the input file name */
if ((s = strrchr(ifname, SUFFIX_SEP)) != NULL) *s = '\0';
#endif
#ifdef NO_MULTIPLE_DOTS #ifdef NO_MULTIPLE_DOTS
dot = strrchr(ifname, '.'); dot = strrchr(ifname, '.');
if (dot == NULL) { if (dot == NULL) {
@@ -987,20 +1033,24 @@ local int get_istat(iname, sbuf)
/* ======================================================================== /* ========================================================================
* Generate ofname given ifname. Return OK, or WARNING if file must be skipped. * Generate ofname given ifname. Return OK, or WARNING if file must be skipped.
* Initializes save_orig_name. * Sets save_orig_name to true if the file name has been truncated.
* IN assertion: this function is not called if to_stdout is true.
*/ */
local int make_ofname() local int make_ofname()
{ {
char *suff; /* ofname z suffix */ char *suff; /* ofname z suffix */
strcpy(ofname, ifname); strcpy(ofname, ifname);
/* strip a version number if any and get the gzip suffix if present: */
suff = get_suffix(ofname); suff = get_suffix(ofname);
if (decompress) { if (decompress) {
if (suff == NULL) { if (suff == NULL) {
WARN((stderr,"%s: %s: unknown suffix -- ignored\n", if (list) return OK;
progname, ifname)); /* Avoid annoying messages with -r */
if (verbose || (!recursive && !quiet)) {
WARN((stderr,"%s: %s: unknown suffix -- ignored\n",
progname, ifname));
}
return WARNING; return WARNING;
} }
/* Make a special case for .tgz and .taz: */ /* Make a special case for .tgz and .taz: */
@@ -1008,7 +1058,7 @@ local int make_ofname()
if (strequ(suff, ".tgz") || strequ(suff, ".taz")) { if (strequ(suff, ".tgz") || strequ(suff, ".taz")) {
strcpy(suff, ".tar"); strcpy(suff, ".tar");
} else { } else {
*suff = '\0'; /* strip z suffix and optional version number */ *suff = '\0'; /* strip the z suffix */
} }
/* ofname might be changed later if infile contains an original name */ /* ofname might be changed later if infile contains an original name */
@@ -1023,16 +1073,15 @@ local int make_ofname()
} else { } else {
save_orig_name = 0; save_orig_name = 0;
#ifdef SUFFIX_SEP
/* strip a version number from the file name */
if ((suff = strrchr(ofname, SUFFIX_SEP)) != NULL) *suff = '\0';
#endif
#ifdef NO_MULTIPLE_DOTS #ifdef NO_MULTIPLE_DOTS
suff = strrchr(ofname, '.'); suff = strrchr(ofname, '.');
if (suff == NULL) { if (suff == NULL) {
strcat(ofname, "."); strcat(ofname, ".");
# ifdef MAX_EXT_CHARS # ifdef MAX_EXT_CHARS
if (strequ(z_suffix, "z")) {
strcat(ofname, "gz"); /* enough room */
return OK;
}
/* On the Atari and some versions of MSDOS, name_too_long() /* On the Atari and some versions of MSDOS, name_too_long()
* does not work correctly because of a bug in stat(). So we * does not work correctly because of a bug in stat(). So we
* must truncate here. * must truncate here.
@@ -1066,9 +1115,17 @@ local int get_method(in)
uch flags; uch flags;
char magic[2]; /* magic header */ char magic[2]; /* magic header */
magic[0] = (char)get_byte(); /* If --force and --stdout, zcat == cat, so do not complain about
magic[1] = (char)get_byte(); * premature end of file: use try_byte instead of get_byte.
*/
if (force && to_stdout) {
magic[0] = (char)try_byte();
magic[1] = (char)try_byte();
/* If try_byte returned EOF, magic[1] == 0xff */
} else {
magic[0] = (char)get_byte();
magic[1] = (char)get_byte();
}
time_stamp = istat.st_mtime; /* may be modified later for some methods */ time_stamp = istat.st_mtime; /* may be modified later for some methods */
method = -1; /* unknown yet */ method = -1; /* unknown yet */
part_nb++; /* number of parts in gzip file */ part_nb++; /* number of parts in gzip file */
@@ -1079,8 +1136,15 @@ local int get_method(in)
if (memcmp(magic, GZIP_MAGIC, 2) == 0 if (memcmp(magic, GZIP_MAGIC, 2) == 0
|| memcmp(magic, OLD_GZIP_MAGIC, 2) == 0) { || memcmp(magic, OLD_GZIP_MAGIC, 2) == 0) {
work = unzip;
method = (int)get_byte(); method = (int)get_byte();
if (method != DEFLATED) {
fprintf(stderr,
"%s: %s: unknown method %d -- get newer version of gzip\n",
progname, ifname, method);
exit_code = ERROR;
return -1;
}
work = unzip;
flags = (uch)get_byte(); flags = (uch)get_byte();
if ((flags & ENCRYPTED) != 0) { if ((flags & ENCRYPTED) != 0) {
@@ -1132,13 +1196,14 @@ local int get_method(in)
/* Get original file name if it was truncated */ /* Get original file name if it was truncated */
if ((flags & ORIG_NAME) != 0) { if ((flags & ORIG_NAME) != 0) {
if (to_stdout || part_nb > 1) { if (no_name || (to_stdout && !list) || part_nb > 1) {
/* Discard the old name */ /* Discard the old name */
char c; /* dummy used for NeXTstep 3.0 cc optimizer bug */ char c; /* dummy used for NeXTstep 3.0 cc optimizer bug */
while ((c=get_byte()) != 0) c++; while ((c=get_byte()) != 0) c++;
} else { } else {
/* Copy the base name. Keep a directory prefix intact. */ /* Copy the base name. Keep a directory prefix intact. */
char *p = basename(ofname); char *p = basename(ofname);
char *base = p;
for (;;) { for (;;) {
*p = (char)get_char(); *p = (char)get_char();
if (*p++ == '\0') break; if (*p++ == '\0') break;
@@ -1146,8 +1211,13 @@ local int get_method(in)
error("corrupted input -- file name too large"); error("corrupted input -- file name too large");
} }
} }
} /* to_stdout */ /* If necessary, adapt the name to local OS conventions: */
} /* orig_name */ if (!list) {
MAKE_LEGAL_NAME(base);
base++; /* avoid warning about unused variable */
}
} /* no_name || to_stdout */
} /* ORIG_NAME */
/* Discard file comment if any */ /* Discard file comment if any */
if ((flags & COMMENT) != 0) { if ((flags & COMMENT) != 0) {
@@ -1171,23 +1241,125 @@ local int get_method(in)
} else if (memcmp(magic, PACK_MAGIC, 2) == 0) { } else if (memcmp(magic, PACK_MAGIC, 2) == 0) {
work = unpack; work = unpack;
method = PACKED; method = PACKED;
} else if (memcmp(magic, LZW_MAGIC, 2) == 0) { } else if (memcmp(magic, LZW_MAGIC, 2) == 0) {
work = unlzw; work = unlzw;
method = COMPRESSED; method = COMPRESSED;
last_member = 1; last_member = 1;
} else if (memcmp(magic, LZH_MAGIC, 2) == 0) {
work = unlzh;
method = LZHED;
last_member = 1;
} else if (force && to_stdout) { /* pass input unchanged */
method = STORED;
work = copy;
inptr = 0;
last_member = 1;
} }
if (method >= 0) return method; if (method >= 0) return method;
if (part_nb == 1) { if (part_nb == 1) {
fprintf(stderr, "\n%s: %s: not in gzip format\n", progname, ifname); fprintf(stderr, "\n%s: %s: not in gzip format\n", progname, ifname);
exit_code = ERROR; exit_code = ERROR;
return -1; return -1;
} else { } else {
WARN((stderr, "\n%s: %s: trailing garbage ignored\n", WARN((stderr, "\n%s: %s: decompression OK, trailing garbage ignored\n",
progname, ifname)); progname, ifname));
return -2; return -2;
} }
} }
/* ========================================================================
* Display the characteristics of the compressed file.
* If the given method is < 0, display the accumulated totals.
* IN assertions: time_stamp, header_bytes and ifile_size are initialized.
*/
local void do_list(ifd, method)
int ifd; /* input file descriptor */
int method; /* compression method */
{
ulg crc; /* original crc */
static int first_time = 1;
static char* methods[MAX_METHODS] = {
"store", /* 0 */
"compr", /* 1 */
"pack ", /* 2 */
"lzh ", /* 3 */
"", "", "", "", /* 4 to 7 reserved */
"defla"}; /* 8 */
char *date;
if (first_time && method >= 0) {
first_time = 0;
if (verbose) {
printf("method crc date time ");
}
if (!quiet) {
printf("compressed uncompr. ratio uncompressed_name\n");
}
} else if (method < 0) {
if (total_in <= 0 || total_out <= 0) return;
if (verbose) {
printf(" %9lu %9lu ",
total_in, total_out);
} else if (!quiet) {
printf("%9ld %9ld ", total_in, total_out);
}
display_ratio(total_out-(total_in-header_bytes), total_out, stdout);
/* header_bytes is not meaningful but used to ensure the same
* ratio if there is a single file.
*/
printf(" (totals)\n");
return;
}
crc = ~0; /* unknown */
bytes_out = -1L;
bytes_in = ifile_size;
#if RECORD_IO == 0
if (method == DEFLATED && !last_member) {
/* Get the crc and uncompressed size for gzip'ed (not zip'ed) files.
* If the lseek fails, we could use read() to get to the end, but
* --list is used to get quick results.
* Use "gunzip < foo.gz | wc -c" to get the uncompressed size if
* you are not concerned about speed.
*/
bytes_in = (long)lseek(ifd, (off_t)(-8), SEEK_END);
if (bytes_in != -1L) {
uch buf[8];
bytes_in += 8L;
if (read(ifd, buf, sizeof(buf)) != sizeof(buf)) {
read_error();
}
crc = LG(buf);
bytes_out = LG(buf+4);
}
}
#endif /* RECORD_IO */
date = ctime(&time_stamp) + 4; /* skip the day of the week */
date[12] = '\0'; /* suppress the 1/100sec and the year */
if (verbose) {
printf("%5s %08lx %11s ", methods[method], crc, date);
}
printf("%9ld %9ld ", bytes_in, bytes_out);
if (bytes_in == -1L) {
total_in = -1L;
bytes_in = bytes_out = header_bytes = 0;
} else if (total_in >= 0) {
total_in += bytes_in;
}
if (bytes_out == -1L) {
total_out = -1L;
bytes_in = bytes_out = header_bytes = 0;
} else if (total_out >= 0) {
total_out += bytes_out;
}
display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out, stdout);
printf(" %s\n", ofname);
}
/* ======================================================================== /* ========================================================================
* Return true if the two stat structures correspond to the same file. * Return true if the two stat structures correspond to the same file.
*/ */
@@ -1231,6 +1403,62 @@ local int name_too_long(name, statb)
return res; return res;
} }
/* ========================================================================
* Shorten the given name by one character, or replace a .tar extension
* with .tgz. Truncate the last part of the name which is longer than
* MIN_PART characters: 1234.678.012.gz -> 123.678.012.gz. If the name
* has only parts shorter than MIN_PART truncate the longest part.
*
* IN assertion: This function is only called for the compressed file;
* the suffix of the given name is z_suffix.
*/
local void shorten_name(name)
char *name;
{
int len; /* length of name without z_suffix */
char *trunc = NULL; /* character to be truncated */
int plen; /* current part length */
int min_part = MIN_PART; /* current minimum part length */
char *p;
p = get_suffix(name);
if (p == NULL) error("can't recover suffix\n");
*p = '\0';
len = strlen(name);
save_orig_name = 1;
/* compress 1234567890.tar to 1234567890.tgz */
if (len > 4 && strequ(p-4, ".tar")) {
strcpy(p-4, ".tgz");
return;
}
/* Try keeping short extensions intact:
* 1234.678.012.gz -> 123.678.012.gz
*/
do {
p = strrchr(name, PATH_SEP);
p = p ? p+1 : name;
while (*p) {
plen = strcspn(p, PART_SEP);
p += plen;
if (plen > min_part) trunc = p-1;
if (*p) p++;
}
} while (trunc == NULL && --min_part != 0);
if (trunc != NULL) {
do {
trunc[0] = trunc[1];
} while (*trunc++);
trunc--;
} else {
trunc = strrchr(name, PART_SEP[0]);
if (trunc == NULL) error("internal error in shorten_name");
if (trunc[1] == '\0') trunc--; /* force truncation */
}
strcpy(trunc, z_suffix);
}
/* ======================================================================== /* ========================================================================
* If compressing to a file, check if ofname is not ambiguous * If compressing to a file, check if ofname is not ambiguous
* because the operating system truncates names. Otherwise, generate * because the operating system truncates names. Otherwise, generate
@@ -1247,22 +1475,15 @@ local int name_too_long(name, statb)
*/ */
local int check_ofname() local int check_ofname()
{ {
int s = strlen(ofname);
struct stat ostat; /* stat for ofname */ struct stat ostat; /* stat for ofname */
if (stat(ofname, &ostat) != 0) return 0; if (stat(ofname, &ostat) != 0) return 0;
/* Check for name truncation on existing file: */ /* Check for name truncation on existing file: */
#ifdef NO_MULTIPLE_DOTS
if (!decompress && name_too_long(ofname, &ostat)) { if (!decompress && name_too_long(ofname, &ostat)) {
#else shorten_name(ofname);
if (!decompress && s > 8 && name_too_long(ofname, &ostat)) {
#endif
save_orig_name = 1;
strcpy(ofname+s-z_len-1, z_suffix); /* f.ext.gz -> f.ex.gz */
if (stat(ofname, &ostat) != 0) return 0; if (stat(ofname, &ostat) != 0) return 0;
} /* !decompress && name_too_long */ }
/* Check that the input and output files are different (could be /* Check that the input and output files are different (could be
* the same by name truncation or links). * the same by name truncation or links).
+25 -12
View File
@@ -16,7 +16,10 @@
typedef char *voidp; typedef char *voidp;
#endif #endif
/* I don't like nested includes, but the string functions are used too often */ /* I don't like nested includes, but the string and io functions are used
* too often
*/
#include <stdio.h>
#if !defined(NO_STRING_H) || defined(STDC_HEADERS) #if !defined(NO_STRING_H) || defined(STDC_HEADERS)
# include <string.h> # include <string.h>
# if !defined(STDC_HEADERS) && !defined(NO_MEMORY_H) && !defined(__GNUC__) # if !defined(STDC_HEADERS) && !defined(NO_MEMORY_H) && !defined(__GNUC__)
@@ -48,11 +51,13 @@ typedef unsigned long ulg;
#define WARNING 2 #define WARNING 2
/* Compression methods (see algorithm.doc) */ /* Compression methods (see algorithm.doc) */
#define STORED 0 #define STORED 0
#define COMPRESSED 1 #define COMPRESSED 1
#define PACKED 2 #define PACKED 2
/* methods 3 to 7 reserved */ #define LZHED 3
#define DEFLATED 8 /* methods 4 to 7 reserved */
#define DEFLATED 8
#define MAX_METHODS 9
extern int method; /* compression method */ extern int method; /* compression method */
/* To save memory for 16 bit systems, some arrays are overlaid between /* To save memory for 16 bit systems, some arrays are overlaid between
@@ -60,7 +65,8 @@ extern int method; /* compression method */
* deflate: prev+head window d_buf l_buf outbuf * deflate: prev+head window d_buf l_buf outbuf
* unlzw: tab_prefix tab_suffix stack inbuf outbuf * unlzw: tab_prefix tab_suffix stack inbuf outbuf
* inflate: window inbuf * inflate: window inbuf
* unpack: window inbuf * unpack: window inbuf prefix_len
* unlzh: left+right window c_table inbuf c_len
* For compression, input is done in window[]. For decompression, output * For compression, input is done in window[]. For decompression, output
* is done in window except for unlzw. * is done in window except for unlzw.
*/ */
@@ -139,17 +145,18 @@ extern char ifname[]; /* input file name or "stdin" */
extern char ofname[]; /* output file name or "stdout" */ extern char ofname[]; /* output file name or "stdout" */
extern char *progname; /* program name */ extern char *progname; /* program name */
extern ulg time_stamp; /* original time stamp (modification time) */ extern long time_stamp; /* original time stamp (modification time) */
extern long ifile_size; /* input file size, -1 for devices (debug only) */ extern long ifile_size; /* input file size, -1 for devices (debug only) */
typedef int file_t; /* Do not use stdio */ typedef int file_t; /* Do not use stdio */
#define NO_FILE (-1) /* in memory compression */ #define NO_FILE (-1) /* in memory compression */
#define PACK_MAGIC "\037\036" /* Magic header for packed files */
#define GZIP_MAGIC "\037\213" /* Magic header for gzip files, 1F 8B */ #define GZIP_MAGIC "\037\213" /* Magic header for gzip files, 1F 8B */
#define OLD_GZIP_MAGIC "\037\236" /* Magic header for gzip 0.5 = freeze 1.x */ #define OLD_GZIP_MAGIC "\037\236" /* Magic header for gzip 0.5 = freeze 1.x */
#define LZH_MAGIC "\037\240" /* Magic header for SCO LZH Compress files*/
#define PKZIP_MAGIC "\120\113\003\004" /* Magic header for pkzip files */ #define PKZIP_MAGIC "\120\113\003\004" /* Magic header for pkzip files */
#define PACK_MAGIC "\037\036" /* Magic header for packed files */
/* gzip flag byte */ /* gzip flag byte */
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ #define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
@@ -192,7 +199,8 @@ extern int test; /* check .z file integrity */
extern int to_stdout; /* output to stdout (-c) */ extern int to_stdout; /* output to stdout (-c) */
extern int save_orig_name; /* set if original name must be saved */ extern int save_orig_name; /* set if original name must be saved */
#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf()) #define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf(0))
#define try_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf(1))
/* put_byte is used for the compressed output, put_ubyte for the /* put_byte is used for the compressed output, put_ubyte for the
* uncompressed output. However unlzw() uses window for its * uncompressed output. However unlzw() uses window for its
@@ -261,6 +269,9 @@ extern int check_zipfile OF((int in));
/* in unpack.c */ /* in unpack.c */
extern int unpack OF((int in, int out)); extern int unpack OF((int in, int out));
/* in unlzh.c */
extern int unlzh OF((int in, int out));
/* in gzip.c */ /* in gzip.c */
RETSIGTYPE abort_gzip OF((void)); RETSIGTYPE abort_gzip OF((void));
@@ -282,20 +293,22 @@ void copy_block OF((char *buf, unsigned len, int header));
extern int (*read_buf) OF((char *buf, unsigned size)); extern int (*read_buf) OF((char *buf, unsigned size));
/* in util.c: */ /* in util.c: */
extern int copy OF((int in, int out));
extern ulg updcrc OF((uch *s, unsigned n)); extern ulg updcrc OF((uch *s, unsigned n));
extern void clear_bufs OF((void)); extern void clear_bufs OF((void));
extern int fill_inbuf OF((void)); extern int fill_inbuf OF((int eof_ok));
extern void flush_outbuf OF((void)); extern void flush_outbuf OF((void));
extern void flush_window OF((void)); extern void flush_window OF((void));
extern void write_buf OF((int fd, voidp buf, unsigned cnt)); extern void write_buf OF((int fd, voidp buf, unsigned cnt));
extern char *strlwr OF((char *s)); extern char *strlwr OF((char *s));
extern char *basename OF((char *fname)); extern char *basename OF((char *fname));
extern void make_simple_name OF((char *name));
extern char *add_envopt OF((int *argcp, char ***argvp, char *env)); extern char *add_envopt OF((int *argcp, char ***argvp, char *env));
extern void error OF((char *m)); extern void error OF((char *m));
extern void warn OF((char *a, char *b)); extern void warn OF((char *a, char *b));
extern void read_error OF((void)); extern void read_error OF((void));
extern void write_error OF((void)); extern void write_error OF((void));
extern void display_ratio OF((long num, long den)); extern void display_ratio OF((long num, long den, FILE *file));
extern voidp xmalloc OF((unsigned int size)); extern voidp xmalloc OF((unsigned int size));
/* in inflate.c */ /* in inflate.c */
+1 -2
View File
@@ -97,10 +97,9 @@
*/ */
#ifndef lint #ifndef lint
static char rcsid[] = "$Id: inflate.c,v 0.13 1993/04/26 14:18:22 jloup Exp $"; static char rcsid[] = "$Id: inflate.c,v 0.14 1993/06/10 13:27:04 jloup Exp $";
#endif #endif
#include <stdio.h>
#include <sys/types.h> #include <sys/types.h>
#include "tailor.h" #include "tailor.h"
+1 -3
View File
@@ -3,15 +3,13 @@
*/ */
#ifndef lint #ifndef lint
static char rcsid[] = "$Id: lzw.c,v 0.8 1993/04/25 08:09:58 jloup Exp $"; static char rcsid[] = "$Id: lzw.c,v 0.9 1993/06/10 13:27:31 jloup Exp $";
#endif #endif
#include "tailor.h" #include "tailor.h"
#include "gzip.h" #include "gzip.h"
#include "lzw.h" #include "lzw.h"
#include <stdio.h>
static int msg_done = 0; static int msg_done = 0;
/* Compress in to out with lzw method. */ /* Compress in to out with lzw method. */
+10 -10
View File
@@ -9,7 +9,7 @@
* Kristoffer Eriksson <ske@pkmab.se> * Kristoffer Eriksson <ske@pkmab.se>
*/ */
/* $Id: match.S,v 0.13 1993/05/24 12:03:03 jloup Exp $ */ /* $Id: match.S,v 0.14 1993/06/11 18:33:24 jloup Exp $ */
/* Preprocess with -DNO_UNDERLINE if your C compiler does not prefix /* Preprocess with -DNO_UNDERLINE if your C compiler does not prefix
* external symbols with an underline character '_'. * external symbols with an underline character '_'.
@@ -44,11 +44,11 @@
.file "match.S" .file "match.S"
#define MAX_MATCH 258 #define MAX_MATCH 258
#define MAX_MATCH2 128 /* MAX_MATCH/2-1 */ #define MAX_MATCH2 $128 /* MAX_MATCH/2-1 */
#define MIN_MATCH 3 #define MIN_MATCH 3
#define WSIZE 32768 #define WSIZE $32768
#define MAX_DIST WSIZE - MAX_MATCH - MIN_MATCH - 1 #define MAX_DIST WSIZE - MAX_MATCH - MIN_MATCH - 1
.globl _match_init .globl _match_init
.globl _longest_match .globl _longest_match
@@ -87,11 +87,11 @@ _longest_match: /* int longest_match(cur_match) */
mov _max_chain_length,%ebp /* chain_length = max_chain_length */ mov _max_chain_length,%ebp /* chain_length = max_chain_length */
mov _strstart,%edi mov _strstart,%edi
mov %edi,%edx mov %edi,%edx
sub $ MAX_DIST,%edx /* limit = strstart-MAX_DIST */ sub MAX_DIST,%edx /* limit = strstart-MAX_DIST */
jae limit_ok jae limit_ok
sub %edx,%edx /* limit = NIL */ sub %edx,%edx /* limit = NIL */
limit_ok: limit_ok:
add $ _window+2,%edi /* edi = offset(window+strstart+2) */ add $2+_window,%edi /* edi = offset(window+strstart+2) */
mov _prev_length,%ebx /* best_len = prev_length */ mov _prev_length,%ebx /* best_len = prev_length */
movw -3(%ebx,%edi),%ax /* ax = scan[best_len-1..best_len] */ movw -3(%ebx,%edi),%ax /* ax = scan[best_len-1..best_len] */
movw -2(%edi),%cx /* cx = scan[0..1] */ movw -2(%edi),%cx /* cx = scan[0..1] */
@@ -110,7 +110,7 @@ short_loop:
* at this point, di == scan+2, si == cur_match, * at this point, di == scan+2, si == cur_match,
* ax = scan[best_len-1..best_len] and cx = scan[0..1] * ax = scan[best_len-1..best_len] and cx = scan[0..1]
*/ */
and $ WSIZE-1, %esi and WSIZE-1, %esi
movw _prev(%esi,%esi),%si /* cur_match = prev[cur_match] */ movw _prev(%esi,%esi),%si /* cur_match = prev[cur_match] */
/* top word of esi is still 0 */ /* top word of esi is still 0 */
cmp %edx,%esi /* cur_match <= limit ? */ cmp %edx,%esi /* cur_match <= limit ? */
@@ -125,7 +125,7 @@ do_scan:
lea _window+2(%esi),%esi /* si = match */ lea _window+2(%esi),%esi /* si = match */
mov %edi,%eax /* ax = scan+2 */ mov %edi,%eax /* ax = scan+2 */
mov $ MAX_MATCH2,%ecx /* scan for at most MAX_MATCH bytes */ mov MAX_MATCH2,%ecx /* scan for at most MAX_MATCH bytes */
rep; cmpsw /* loop until mismatch */ rep; cmpsw /* loop until mismatch */
je maxmatch /* match of length MAX_MATCH? */ je maxmatch /* match of length MAX_MATCH? */
mismatch: mismatch:
@@ -134,7 +134,7 @@ mismatch:
xchg %edi,%eax /* edi = scan+2, eax = end of scan */ xchg %edi,%eax /* edi = scan+2, eax = end of scan */
sub %edi,%eax /* eax = len */ sub %edi,%eax /* eax = len */
sub %eax,%esi /* esi = cur_match + 2 + offset(window) */ sub %eax,%esi /* esi = cur_match + 2 + offset(window) */
sub $ _window+2,%esi /* esi = cur_match */ sub $2+_window,%esi /* esi = cur_match */
subb $1,%cl /* set carry if cl == 0 (cannot use DEC) */ subb $1,%cl /* set carry if cl == 0 (cannot use DEC) */
adc $0,%eax /* eax = carry ? len+1 : len */ adc $0,%eax /* eax = carry ? len+1 : len */
cmp %ebx,%eax /* len > best_len ? */ cmp %ebx,%eax /* len > best_len ? */
+3 -3
View File
@@ -4,13 +4,13 @@
* terms of the GNU General Public License, see the file COPYING. * terms of the GNU General Public License, see the file COPYING.
*/ */
#define VERSION "1.1.1" #define VERSION "1.2.2"
#define PATCHLEVEL 0 #define PATCHLEVEL 0
#define REVDATE "1 Jun 93" #define REVDATE "17 Jun 93"
/* This version does not support compression into old compress format: */ /* This version does not support compression into old compress format: */
#ifdef LZW #ifdef LZW
# undef LZW # undef LZW
#endif #endif
/* $Id: revision.h,v 0.20 1993/06/01 14:03:17 jloup Exp $ */ /* $Id: revision.h,v 0.23 1993/06/16 15:03:51 jloup Exp $ */
+37 -5
View File
@@ -8,12 +8,16 @@
* The target dependent functions should be defined in tailor.c. * The target dependent functions should be defined in tailor.c.
*/ */
/* $Id: tailor.h,v 0.16 1993/06/01 12:46:03 jloup Exp $ */ /* $Id: tailor.h,v 0.18 1993/06/14 19:32:20 jloup Exp $ */
#if defined(__MSDOS__) && !defined(MSDOS) #if defined(__MSDOS__) && !defined(MSDOS)
# define MSDOS # define MSDOS
#endif #endif
#if defined(__OS2__) && !defined(OS2)
# define OS2
#endif
#if defined(OS2) && defined(MSDOS) /* MS C under OS/2 */ #if defined(OS2) && defined(MSDOS) /* MS C under OS/2 */
# undef MSDOS # undef MSDOS
#endif #endif
@@ -31,6 +35,7 @@
# define MAXSEG_64K # define MAXSEG_64K
# ifdef __TURBOC__ # ifdef __TURBOC__
# define NO_UTIME # define NO_UTIME
# define NO_OFF_T
# else /* MSC */ # else /* MSC */
# define HAVE_SYS_UTIME_H # define HAVE_SYS_UTIME_H
# define NO_UTIME_H # define NO_UTIME_H
@@ -69,22 +74,34 @@
# define NO_CHOWN # define NO_CHOWN
# define PROTO # define PROTO
# define STDC_HEADERS # define STDC_HEADERS
# define HAVE_SYS_UTIME_H
# define NO_UTIME_H
# define casemap(c) tolow(c) # define casemap(c) tolow(c)
# include <io.h> # include <io.h>
# define OS_CODE 0x06 # define OS_CODE 0x06
# define SET_BINARY_MODE(fd) setmode(fd, O_BINARY) # define SET_BINARY_MODE(fd) setmode(fd, O_BINARY)
# ifdef _MSC_VER # ifdef _MSC_VER
# define HAVE_SYS_UTIME_H
# define NO_UTIME_H
# define MAXSEG_64K # define MAXSEG_64K
# undef near # undef near
# define near _near # define near _near
# endif # endif
# ifdef __EMX__ # ifdef __EMX__
# define HAVE_SYS_UTIME_H
# define NO_UTIME_H
# define DIRENT # define DIRENT
# define EXPAND(argc,argv) \ # define EXPAND(argc,argv) \
{_response(&argc, &argv); _wildcard(&argc, &argv);} {_response(&argc, &argv); _wildcard(&argc, &argv);}
# endif # endif
# ifdef __BORLANDC__
# define DIRENT
# endif
# ifdef __ZTC__
# define NO_DIR
# define NO_UTIME_H
# include <dos.h>
# define EXPAND(argc,argv) \
{response_expand(&argc, &argv);}
# endif
#endif #endif
#ifdef MSDOS #ifdef MSDOS
@@ -138,7 +155,6 @@
# ifdef __GNUC__ # ifdef __GNUC__
# define DIRENT # define DIRENT
# define HAVE_UNISTD_H # define HAVE_UNISTD_H
# define RETSIGTYPE int
# else /* SASC */ # else /* SASC */
# define NO_STDIN_FSTAT # define NO_STDIN_FSTAT
# define SYSDIR # define SYSDIR
@@ -149,6 +165,7 @@
# define direct dirent # define direct dirent
extern void _expand_args(int *argc, char ***argv); extern void _expand_args(int *argc, char ***argv);
# define EXPAND(argc,argv) _expand_args(&argc,&argv); # define EXPAND(argc,argv) _expand_args(&argc,&argv);
# undef O_BINARY /* disable useless --ascii option */
# endif # endif
#endif #endif
@@ -199,7 +216,9 @@
# define put_char(c) put_byte((c) & 0x7F) # define put_char(c) put_byte((c) & 0x7F)
# define get_char(c) ascii2pascii(get_byte()) # define get_char(c) ascii2pascii(get_byte())
# define OS_CODE 0x0F /* temporary, subject to change */ # define OS_CODE 0x0F /* temporary, subject to change */
# undef SIGTERM /* We don't want a signal handler for SIGTERM */ # ifdef SIGTERM
# undef SIGTERM /* We don't want a signal handler for SIGTERM */
# endif
#endif #endif
#ifdef WIN32 #ifdef WIN32
@@ -243,6 +262,19 @@
# define MAX_SUFFIX 30 # define MAX_SUFFIX 30
#endif #endif
#ifndef MAKE_LEGAL_NAME
# ifdef NO_MULTIPLE_DOTS
# define MAKE_LEGAL_NAME(name) make_simple_name(name)
# else
# define MAKE_LEGAL_NAME(name)
# endif
#endif
#ifndef MIN_PART
# define MIN_PART 3
/* keep at least MIN_PART chars between dots in a file name. */
#endif
#ifndef EXPAND #ifndef EXPAND
# define EXPAND(argc,argv) # define EXPAND(argc,argv)
#endif #endif
+1 -2
View File
@@ -54,13 +54,12 @@
*/ */
#include <ctype.h> #include <ctype.h>
#include <stdio.h>
#include "tailor.h" #include "tailor.h"
#include "gzip.h" #include "gzip.h"
#ifndef lint #ifndef lint
static char rcsid[] = "$Id: trees.c,v 0.11 1993/03/26 14:55:43 jloup Exp $"; static char rcsid[] = "$Id: trees.c,v 0.12 1993/06/10 13:27:54 jloup Exp $";
#endif #endif
/* =========================================================================== /* ===========================================================================
+385
View File
@@ -0,0 +1,385 @@
/* unlzh.c -- decompress files in SCO compress -H (LZH) format.
* The code in this file is directly derived from the public domain 'ar002'
* written by Haruhiko Okumura.
*/
#include <stdio.h>
#include "tailor.h"
#include "gzip.h"
#include "lzw.h" /* just for consistency checking */
/* decode.c */
local unsigned decode OF((unsigned count, uch buffer[]));
local void decode_start OF((void));
/* huf.c */
local void huf_decode_start OF((void));
local unsigned decode_c OF((void));
local unsigned decode_p OF((void));
/* io.c */
local void fillbuf OF((int n));
local unsigned getbits OF((int n));
local void init_getbits OF((void));
#define DICBIT 13 /* 12(-lh4-) or 13(-lh5-) */
#define DICSIZ ((unsigned) 1 << DICBIT)
#ifndef CHAR_BIT
# define CHAR_BIT 8
#endif
#ifndef UCHAR_MAX
# define UCHAR_MAX 255
#endif
#define BITBUFSIZ (CHAR_BIT * 2 * sizeof(char))
/* Do not use CHAR_BIT * sizeof(bitbuf), does not work on machines
* for which short is not on 16 bits (Cray).
*/
/* encode.c and decode.c */
#define MAXMATCH 256 /* formerly F (not more than UCHAR_MAX + 1) */
#define THRESHOLD 3 /* choose optimal value */
/* huf.c */
#define NC (UCHAR_MAX + MAXMATCH + 2 - THRESHOLD)
/* alphabet = {0, 1, 2, ..., NC - 1} */
#define CBIT 9 /* $\lfloor \log_2 NC \rfloor + 1$ */
#define CODE_BIT 16 /* codeword length */
#define NP (DICBIT + 1)
#define NT (CODE_BIT + 3)
#define PBIT 4 /* smallest integer such that (1U << PBIT) > NP */
#define TBIT 5 /* smallest integer such that (1U << TBIT) > NT */
#if NT > NP
# define NPT NT
#else
# define NPT NP
#endif
/* local ush left[2 * NC - 1]; */
/* local ush right[2 * NC - 1]; */
#define left prev
#define right head
#if NC > 1<<(BITS-2)
error cannot overlay left+right and prev
#endif
/* local uch c_len[NC]; */
#define c_len outbuf
#if NC > OUTBUFSIZ
error cannot overlay c_len and outbuf
#endif
local uch pt_len[NPT];
local unsigned blocksize;
local ush pt_table[256];
/* local ush c_table[4096]; */
#define c_table d_buf
#if DIST_BUFSIZE < 4096
error cannot overlay c_table and d_buf
#endif
local ush bitbuf;
local unsigned subbitbuf;
local int bitcount;
local void fillbuf(n) /* Shift bitbuf n bits left, read n bits */
int n;
{
bitbuf <<= n;
while (n > bitcount) {
bitbuf |= subbitbuf << (n -= bitcount);
subbitbuf = (unsigned)try_byte();
if ((int)subbitbuf == EOF) subbitbuf = 0;
bitcount = CHAR_BIT;
}
bitbuf |= subbitbuf >> (bitcount -= n);
}
local unsigned getbits(n)
int n;
{
unsigned x;
x = bitbuf >> (BITBUFSIZ - n); fillbuf(n);
return x;
}
local void init_getbits()
{
bitbuf = 0; subbitbuf = 0; bitcount = 0;
fillbuf(BITBUFSIZ);
}
/***********************************************************
maketbl.c -- make table for decoding
***********************************************************/
local void make_table(nchar, bitlen, tablebits, table)
int nchar;
uch bitlen[];
int tablebits;
ush table[];
{
ush count[17], weight[17], start[18], *p;
unsigned i, k, len, ch, jutbits, avail, nextcode, mask;
for (i = 1; i <= 16; i++) count[i] = 0;
for (i = 0; i < nchar; i++) count[bitlen[i]]++;
start[1] = 0;
for (i = 1; i <= 16; i++)
start[i + 1] = start[i] + (count[i] << (16 - i));
if (start[17] != (ush)((unsigned) 1 << 16))
error("Bad table\n");
jutbits = 16 - tablebits;
for (i = 1; i <= tablebits; i++) {
start[i] >>= jutbits;
weight[i] = (unsigned) 1 << (tablebits - i);
}
while (i <= 16) {
weight[i] = (unsigned) 1 << (16 - i);
i++;
}
i = start[tablebits + 1] >> jutbits;
if (i != (ush)((unsigned) 1 << 16)) {
k = 1 << tablebits;
while (i != k) table[i++] = 0;
}
avail = nchar;
mask = (unsigned) 1 << (15 - tablebits);
for (ch = 0; ch < nchar; ch++) {
if ((len = bitlen[ch]) == 0) continue;
nextcode = start[len] + weight[len];
if (len <= tablebits) {
for (i = start[len]; i < nextcode; i++) table[i] = ch;
} else {
k = start[len];
p = &table[k >> jutbits];
i = len - tablebits;
while (i != 0) {
if (*p == 0) {
right[avail] = left[avail] = 0;
*p = avail++;
}
if (k & mask) p = &right[*p];
else p = &left[*p];
k <<= 1; i--;
}
*p = ch;
}
start[len] = nextcode;
}
}
/***********************************************************
huf.c -- static Huffman
***********************************************************/
local void read_pt_len(nn, nbit, i_special)
int nn;
int nbit;
int i_special;
{
int i, c, n;
unsigned mask;
n = getbits(nbit);
if (n == 0) {
c = getbits(nbit);
for (i = 0; i < nn; i++) pt_len[i] = 0;
for (i = 0; i < 256; i++) pt_table[i] = c;
} else {
i = 0;
while (i < n) {
c = bitbuf >> (BITBUFSIZ - 3);
if (c == 7) {
mask = (unsigned) 1 << (BITBUFSIZ - 1 - 3);
while (mask & bitbuf) { mask >>= 1; c++; }
}
fillbuf((c < 7) ? 3 : c - 3);
pt_len[i++] = c;
if (i == i_special) {
c = getbits(2);
while (--c >= 0) pt_len[i++] = 0;
}
}
while (i < nn) pt_len[i++] = 0;
make_table(nn, pt_len, 8, pt_table);
}
}
local void read_c_len()
{
int i, c, n;
unsigned mask;
n = getbits(CBIT);
if (n == 0) {
c = getbits(CBIT);
for (i = 0; i < NC; i++) c_len[i] = 0;
for (i = 0; i < 4096; i++) c_table[i] = c;
} else {
i = 0;
while (i < n) {
c = pt_table[bitbuf >> (BITBUFSIZ - 8)];
if (c >= NT) {
mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
do {
if (bitbuf & mask) c = right[c];
else c = left [c];
mask >>= 1;
} while (c >= NT);
}
fillbuf((int) pt_len[c]);
if (c <= 2) {
if (c == 0) c = 1;
else if (c == 1) c = getbits(4) + 3;
else c = getbits(CBIT) + 20;
while (--c >= 0) c_len[i++] = 0;
} else c_len[i++] = c - 2;
}
while (i < NC) c_len[i++] = 0;
make_table(NC, c_len, 12, c_table);
}
}
local unsigned decode_c()
{
unsigned j, mask;
if (blocksize == 0) {
blocksize = getbits(16);
if (blocksize == 0) {
return NC; /* end of file */
}
read_pt_len(NT, TBIT, 3);
read_c_len();
read_pt_len(NP, PBIT, -1);
}
blocksize--;
j = c_table[bitbuf >> (BITBUFSIZ - 12)];
if (j >= NC) {
mask = (unsigned) 1 << (BITBUFSIZ - 1 - 12);
do {
if (bitbuf & mask) j = right[j];
else j = left [j];
mask >>= 1;
} while (j >= NC);
}
fillbuf((int) c_len[j]);
return j;
}
local unsigned decode_p()
{
unsigned j, mask;
j = pt_table[bitbuf >> (BITBUFSIZ - 8)];
if (j >= NP) {
mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
do {
if (bitbuf & mask) j = right[j];
else j = left [j];
mask >>= 1;
} while (j >= NP);
}
fillbuf((int) pt_len[j]);
if (j != 0) j = ((unsigned) 1 << (j - 1)) + getbits((int) (j - 1));
return j;
}
local void huf_decode_start()
{
init_getbits(); blocksize = 0;
}
/***********************************************************
decode.c
***********************************************************/
local int j; /* remaining bytes to copy */
local int done; /* set at end of input */
local void decode_start()
{
huf_decode_start();
j = 0;
done = 0;
}
/* Decode the input and return the number of decoded bytes put in buffer
*/
local unsigned decode(count, buffer)
unsigned count;
uch buffer[];
/* The calling function must keep the number of
bytes to be processed. This function decodes
either 'count' bytes or 'DICSIZ' bytes, whichever
is smaller, into the array 'buffer[]' of size
'DICSIZ' or more.
Call decode_start() once for each new file
before calling this function.
*/
{
local unsigned i;
unsigned r, c;
r = 0;
while (--j >= 0) {
buffer[r] = buffer[i];
i = (i + 1) & (DICSIZ - 1);
if (++r == count) return r;
}
for ( ; ; ) {
c = decode_c();
if (c == NC) {
done = 1;
return r;
}
if (c <= UCHAR_MAX) {
buffer[r] = c;
if (++r == count) return r;
} else {
j = c - (UCHAR_MAX + 1 - THRESHOLD);
i = (r - decode_p() - 1) & (DICSIZ - 1);
while (--j >= 0) {
buffer[r] = buffer[i];
i = (i + 1) & (DICSIZ - 1);
if (++r == count) return r;
}
}
}
}
/* ===========================================================================
* Unlzh in to out. Return OK or ERROR.
*/
int unlzh(in, out)
int in;
int out;
{
unsigned n;
ifd = in;
ofd = out;
decode_start();
while (!done) {
n = decode((unsigned) DICSIZ, window);
if (!test && n > 0) {
write_buf(out, (char*)window, n);
}
}
return OK;
}
+12 -7
View File
@@ -8,10 +8,9 @@
*/ */
#ifndef lint #ifndef lint
static char rcsid[] = "$Id: unlzw.c,v 0.13 1993/05/27 10:32:55 jloup Exp $"; static char rcsid[] = "$Id: unlzw.c,v 0.15 1993/06/10 13:28:35 jloup Exp $";
#endif #endif
#include <stdio.h>
#include <sys/types.h> #include <sys/types.h>
#include "tailor.h" #include "tailor.h"
@@ -263,6 +262,7 @@ int unlzw(in, out)
read_error(); read_error();
} }
insize += rsize; insize += rsize;
bytes_in += (ulg)rsize;
} }
inbits = ((rsize != 0) ? ((long)insize - insize%n_bits)<<3 : inbits = ((rsize != 0) ? ((long)insize - insize%n_bits)<<3 :
((long)insize<<3)-(n_bits-1)); ((long)insize<<3)-(n_bits-1));
@@ -313,7 +313,8 @@ int unlzw(in, out)
posbits, p[-1],p[0],p[1],p[2],p[3]); posbits, p[-1],p[0],p[1],p[2],p[3]);
#endif #endif
if (!test && outpos > 0) { if (!test && outpos > 0) {
write_buf(out, outbuf, outpos); write_buf(out, (char*)outbuf, outpos);
bytes_out += (ulg)outpos;
} }
error("corrupt input. Use zcat to recover some data."); error("corrupt input. Use zcat to recover some data.");
} }
@@ -341,7 +342,10 @@ int unlzw(in, out)
outpos += i; outpos += i;
} }
if (outpos >= OUTBUFSIZ) { if (outpos >= OUTBUFSIZ) {
if (!test) write_buf(out, outbuf, outpos); if (!test) {
write_buf(out, (char*)outbuf, outpos);
bytes_out += (ulg)outpos;
}
outpos = 0; outpos = 0;
} }
stackp+= i; stackp+= i;
@@ -360,10 +364,11 @@ int unlzw(in, out)
} }
oldcode = incode; /* Remember previous code. */ oldcode = incode; /* Remember previous code. */
} }
bytes_in += rsize;
} while (rsize != 0); } while (rsize != 0);
if (!test && outpos > 0) write_buf(out, outbuf, outpos); if (!test && outpos > 0) {
write_buf(out, (char*)outbuf, outpos);
bytes_out += (ulg)outpos;
}
return OK; return OK;
} }
+7 -9
View File
@@ -5,11 +5,9 @@
*/ */
#ifndef lint #ifndef lint
static char rcsid[] = "$Id: unpack.c,v 1.3 1993/05/28 17:56:07 jloup Exp $"; static char rcsid[] = "$Id: unpack.c,v 1.4 1993/06/11 19:25:36 jloup Exp $";
#endif #endif
#include <stdio.h>
#include "tailor.h" #include "tailor.h"
#include "gzip.h" #include "gzip.h"
#include "crypt.h" #include "crypt.h"
@@ -26,11 +24,7 @@ static char rcsid[] = "$Id: unpack.c,v 1.3 1993/05/28 17:56:07 jloup Exp $";
#define LITERALS 256 #define LITERALS 256
/* Number of literals, excluding the End of Block (EOB) code */ /* Number of literals, excluding the End of Block (EOB) code */
#ifdef SMALL_MEM #define MAX_PEEK 12
# define MAX_PEEK 10
#else
# define MAX_PEEK 12
#endif
/* Maximum number of 'peek' bits used to optimize traversal of the /* Maximum number of 'peek' bits used to optimize traversal of the
* Huffman tree. * Huffman tree.
*/ */
@@ -54,7 +48,8 @@ local int parents[MAX_BITLEN+1]; /* Number of parents for each bit length */
local int peek_bits; /* Number of peek bits currently used */ local int peek_bits; /* Number of peek bits currently used */
local uch prefix_len[1 << MAX_PEEK]; /* local uch prefix_len[1 << MAX_PEEK]; */
#define prefix_len outbuf
/* For each bit pattern b of peek_bits bits, prefix_len[b] is the length /* For each bit pattern b of peek_bits bits, prefix_len[b] is the length
* of the Huffman code starting with a prefix of b (upper bits), or 0 * of the Huffman code starting with a prefix of b (upper bits), or 0
* if all codes of prefix b have more than peek_bits bits. It is not * if all codes of prefix b have more than peek_bits bits. It is not
@@ -62,6 +57,9 @@ local uch prefix_len[1 << MAX_PEEK];
* codes encountered in the input stream are short codes (by construction). * codes encountered in the input stream are short codes (by construction).
* So for most codes a single lookup will be necessary. * So for most codes a single lookup will be necessary.
*/ */
#if 1<<MAX_PEEK > OUTBUFSIZ
error cannot overlay prefix_len and outbuf
#endif
local ulg bitbuf; local ulg bitbuf;
/* Bits are added on the low part of bitbuf and read from the high part. */ /* Bits are added on the low part of bitbuf and read from the high part. */
+1 -3
View File
@@ -14,11 +14,9 @@
*/ */
#ifndef lint #ifndef lint
static char rcsid[] = "$Id: unzip.c,v 0.12 1993/05/28 17:56:23 jloup Exp $"; static char rcsid[] = "$Id: unzip.c,v 0.13 1993/06/10 13:29:00 jloup Exp $";
#endif #endif
#include <stdio.h>
#include "tailor.h" #include "tailor.h"
#include "gzip.h" #include "gzip.h"
#include "crypt.h" #include "crypt.h"
+52 -9
View File
@@ -5,10 +5,9 @@
*/ */
#ifndef lint #ifndef lint
static char rcsid[] = "$Id: util.c,v 0.14 1993/05/27 10:31:52 jloup Exp $"; static char rcsid[] = "$Id: util.c,v 0.15 1993/06/15 09:04:13 jloup Exp $";
#endif #endif
#include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
#include <sys/types.h> #include <sys/types.h>
@@ -33,6 +32,26 @@ static char rcsid[] = "$Id: util.c,v 0.14 1993/05/27 10:31:52 jloup Exp $";
extern ulg crc_32_tab[]; /* crc table, defined below */ extern ulg crc_32_tab[]; /* crc table, defined below */
/* ===========================================================================
* Copy input to output unchanged: zcat == cat with --force.
* IN assertion: insize bytes have already been read in inbuf.
*/
int copy(in, out)
int in, out; /* input and output file descriptors */
{
errno = 0;
while (insize != 0 && (int)insize != EOF) {
write_buf(out, (char*)inbuf, insize);
bytes_out += insize;
insize = read(in, (char*)inbuf, INBUFSIZ);
}
if ((int)insize == EOF && errno != 0) {
read_error();
}
bytes_in = bytes_out;
return OK;
}
/* =========================================================================== /* ===========================================================================
* Run a set of bytes through the crc shift register. If s is a NULL * Run a set of bytes through the crc shift register. If s is a NULL
* pointer, then initialize the crc shift register contents instead. * pointer, then initialize the crc shift register contents instead.
@@ -69,10 +88,10 @@ void clear_bufs()
} }
/* =========================================================================== /* ===========================================================================
* Fill the input buffer. This is called only when the buffer is empty * Fill the input buffer. This is called only when the buffer is empty.
* and at least one byte is really needed.
*/ */
int fill_inbuf() int fill_inbuf(eof_ok)
int eof_ok; /* set if EOF acceptable as a result */
{ {
int len; int len;
@@ -86,6 +105,7 @@ int fill_inbuf()
} while (insize < INBUFSIZ); } while (insize < INBUFSIZ);
if (insize == 0) { if (insize == 0) {
if (eof_ok) return EOF;
read_error(); read_error();
} }
bytes_in += (ulg)insize; bytes_in += (ulg)insize;
@@ -177,6 +197,26 @@ char *basename(fname)
return fname; return fname;
} }
/* ========================================================================
* Make a file name legal for file systems not allowing file names with
* multiple dots or starting with a dot (such as MSDOS), by changing
* all dots except the last one into underlines. A target dependent
* function can be used instead of this simple function by defining the macro
* MAKE_LEGAL_NAME in tailor.h and providing the function in a target
* dependent module.
*/
void make_simple_name(name)
char *name;
{
char *p = strrchr(name, '.');
if (p == NULL) return;
if (p == name) p++;
do {
if (*--p == '.') *p = '_';
} while (p != name);
}
#if defined(NO_STRING_H) && !defined(STDC_HEADERS) #if defined(NO_STRING_H) && !defined(STDC_HEADERS)
/* Provide missing strspn and strcspn functions. */ /* Provide missing strspn and strcspn functions. */
@@ -325,11 +365,12 @@ void write_error()
} }
/* ======================================================================== /* ========================================================================
* Display compression ratio on stderr. * Display compression ratio on the given stream on 6 characters.
*/ */
void display_ratio(num, den) void display_ratio(num, den, file)
long num; long num;
long den; long den;
FILE *file;
{ {
long ratio; /* 1000 times the compression ratio */ long ratio; /* 1000 times the compression ratio */
@@ -341,10 +382,12 @@ void display_ratio(num, den)
ratio = num/(den/1000L); ratio = num/(den/1000L);
} }
if (ratio < 0) { if (ratio < 0) {
putc('-', stderr); putc('-', file);
ratio = -ratio; ratio = -ratio;
} else {
putc(' ', file);
} }
fprintf(stderr, "%2ld.%ld%%", ratio / 10L, ratio % 10L); fprintf(file, "%2ld.%1ld%%", ratio / 10L, ratio % 10L);
} }
+2
View File
@@ -1,4 +1,5 @@
#!/bin/sh #!/bin/sh
# sh is buggy on RS/6000 AIX 3.2. Replace above line with #!/bin/ksh
# Zcmp and zdiff are used to invoke the cmp or the diff pro- # Zcmp and zdiff are used to invoke the cmp or the diff pro-
# gram on compressed files. All options specified are passed # gram on compressed files. All options specified are passed
@@ -8,6 +9,7 @@
# necessary) and fed to cmp or diff. The exit status from cmp # necessary) and fed to cmp or diff. The exit status from cmp
# or diff is preserved. # or diff is preserved.
PATH="/usr/local/bin:$PATH"; export PATH
prog=`echo $0 | sed 's|.*/||'` prog=`echo $0 | sed 's|.*/||'`
case "$prog" in case "$prog" in
*cmp) comp=${CMP-cmp} ;; *cmp) comp=${CMP-cmp} ;;
+1 -1
View File
@@ -35,7 +35,7 @@ or
.I diff .I diff
is preserved. is preserved.
.SH "SEE ALSO" .SH "SEE ALSO"
cmp(1), diff(1), zmore(1), znew(1), zforce(1), gzip(1), gzexe(1) cmp(1), diff(1), zmore(1), zgrep(1), znew(1), zforce(1), gzip(1), gzexe(1)
.SH BUGS .SH BUGS
Messages from the Messages from the
.I cmp .I cmp
+12 -10
View File
@@ -5,6 +5,7 @@
# This can be useful for files with names truncated after a file transfer. # This can be useful for files with names truncated after a file transfer.
# 12345678901234 is renamed to 12345678901.gz # 12345678901234 is renamed to 12345678901.gz
PATH="/usr/local/bin:$PATH"; export PATH
x=`basename $0` x=`basename $0`
if test $# = 0; then if test $# = 0; then
echo "force a '.gz' extension on all gzip files" echo "force a '.gz' extension on all gzip files"
@@ -23,17 +24,18 @@ for i do
test `expr "$i" : '.*[.-]gz$'` -eq 0 || continue test `expr "$i" : '.*[.-]gz$'` -eq 0 || continue
test `expr "$i" : '.*[.]t[ag]z$'` -eq 0 || continue test `expr "$i" : '.*[.]t[ag]z$'` -eq 0 || continue
gzip -t "$i" 2>/dev/null || continue if gzip -l < "$i" 2>/dev/null | grep '^defl' > /dev/null; then
if test `expr "$i" : '^............'` -eq 12; then if test `expr "$i" : '^............'` -eq 12; then
new=`expr "$i" : '\(.*\)...$`.gz new=`expr "$i" : '\(.*\)...$`.gz
else else
new="$i.gz" new="$i.gz"
fi
if mv "$i" "$new" 2>/dev/null; then
echo $i -- replaced with $new
continue
fi
res=1; echo ${x}: cannot rename $i to $new
fi fi
if mv "$i" "$new" 2>/dev/null; then
echo $i -- replaced with $new
continue
fi
res=1; echo ${x}: cannot rename $i to $new
done done
exit $res exit $res
+1 -1
View File
@@ -17,4 +17,4 @@ is truncated to make room for the .gz suffix. For example,
12345678901234 is renamed to 12345678901.gz. A file name such as foo.tgz 12345678901234 is renamed to 12345678901.gz. A file name such as foo.tgz
is left intact. is left intact.
.SH "SEE ALSO" .SH "SEE ALSO"
gzip(1), znew(1), zmore(1), zcmp(1), gzexe(1) gzip(1), znew(1), zmore(1), zgrep(1), zdiff(1), gzexe(1)
+72
View File
@@ -0,0 +1,72 @@
#!/bin/sh
# zgrep -- a wrapper around a grep program that decompresses files as needed
# Adapted from a version sent by Charles Levert <charles@comm.polymtl.ca>
PATH="/usr/local/bin:$PATH"; export PATH
prog=`echo $0 | sed 's|.*/||'`
case "$prog" in
*egrep) grep=${EGREP-egrep} ;;
*fgrep) grep=${FGREP-fgrep} ;;
*) grep=${GREP-grep} ;;
esac
A=
fileno=0
pat=""
while test $# -ne 0; do
case "$1" in
-e | -f) opt="$opt $1"; shift; pat="$1"
if test "$grep" = grep; then # grep is buggy with -e on SVR4
grep=egrep
fi;;
-*) opt="$opt $1";;
*) if test -z "$pat"; then
pat="$1"
else
fileno=`expr $fileno + 1`
eval A$fileno=\$1
A="$A \"\$A$fileno\""
fi
;;
esac
shift
done
if test -z "$pat"; then
echo "grep through gzip files"
echo "usage: $prog [grep_options] pattern [files]"
exit 1
fi
list=0
silent=0
op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
case "$op" in
*l*) list=1
esac
case "$op" in
*h*) silent=1
esac
if test $fileno -eq 0; then
gzip -cdfq | $grep $opt "$pat"
exit $?
fi
eval set "$A" # files in $1, $2 ...
res=0
for i do
if test $list -eq 1; then
gzip -cdfq "$i" | $grep $opt "$pat" > /dev/null && echo $i
r=$?
elif test $# -eq 1 -o $silent -eq 1; then
gzip -cdfq "$i" | $grep $opt "$pat"
r=$?
else
gzip -cdfq "$i" | $grep $opt "$pat" | sed "s|^|${i}:|"
r=$?
fi
test "$r" -ne 0 && res="$r"
done
exit $res
+44
View File
@@ -0,0 +1,44 @@
.TH ZGREP 1
.SH NAME
zgrep \- search possibly compressed files for a regular expression
.SH SYNOPSIS
.B zgrep
[ grep_options ]
.BI [\ -e\ ] " pattern"
.IR filename ".\|.\|."
.SH DESCRIPTION
.IR Zgrep
is used to invoke the
.I grep
on compress'ed or gzip'ed files. All options specified are passed directly to
.I grep.
If no file is specified, then the standard input is decompressed
if necessary and fed to grep.
Otherwise the given files are uncompressed if necessary and fed to
.I grep.
.PP
If
.I zgrep
is invoked as
.I zegrep
or
.I zfgrep
then
.I egrep
or
.I fgrep
is used instead of
.I grep.
If the GREP environment variable is set,
.I zgrep
uses it as the
.I grep
program to be invoked. For example:
for sh: GREP=fgrep zgrep string files
for csh: (setenv GREP fgrep; zgrep string files)
.SH AUTHOR
Charles Levert (charles@comm.polymtl.ca)
.SH "SEE ALSO"
grep(1), egrep(1), fgrep(1), zdiff(1), zmore(1), znew(1), zforce(1),
gzip(1), gzexe(1)
+1 -2
View File
@@ -5,11 +5,10 @@
*/ */
#ifndef lint #ifndef lint
static char rcsid[] = "$Id: zip.c,v 0.16 1993/05/28 14:51:17 jloup Exp $"; static char rcsid[] = "$Id: zip.c,v 0.17 1993/06/10 13:29:25 jloup Exp $";
#endif #endif
#include <ctype.h> #include <ctype.h>
#include <stdio.h>
#include <sys/types.h> #include <sys/types.h>
#include "tailor.h" #include "tailor.h"
+9 -4
View File
@@ -1,22 +1,27 @@
#!/bin/sh #!/bin/sh
PATH="/usr/local/bin:$PATH"; export PATH
if test "`echo -n a`" = "-n a"; then if test "`echo -n a`" = "-n a"; then
# looks like a SysV system: # looks like a SysV system:
n1=''; n2='\c' n1=''; n2='\c'
else else
n1='-n'; n2='' n1='-n'; n2=''
fi fi
oldtty=`stty -g 2>/dev/null`
if stty -cbreak 2>/dev/null; then if stty -cbreak 2>/dev/null; then
cb='cbreak'; ncb='-cbreak' cb='cbreak'; ncb='-cbreak'
else else
# 'stty min 1' resets eof to ^a on both SunOS and SysV! # 'stty min 1' resets eof to ^a on both SunOS and SysV!
cb='min 1 -icanon'; ncb='icanon eof ^d' cb='min 1 -icanon'; ncb='icanon eof ^d'
fi fi
oldtty=`stty -g` if test $? -eq 0 -a -n "$oldtty"; then
trap 'stty -g $oldtty 2>/dev/null; exit' 0 2 3 5 10 13 15 trap 'stty $oldtty 2>/dev/null; exit' 0 2 3 5 10 13 15
else
trap 'stty $ncb echo 2>/dev/null; exit' 0 2 3 5 10 13 15
fi
if test $# = 0; then if test $# = 0; then
gzip -cd | eval ${PAGER-more} gzip -cdfq | eval ${PAGER-more}
else else
FIRST=1 FIRST=1
for FILE for FILE
@@ -33,7 +38,7 @@ else
fi fi
if test "$ANS" != 's'; then if test "$ANS" != 's'; then
echo "------> $FILE <------" echo "------> $FILE <------"
gzip -cd "$FILE" | eval ${PAGER-more} gzip -cdfq "$FILE" | eval ${PAGER-more}
fi fi
if test -t; then if test -t; then
FIRST=0 FIRST=0
+14 -3
View File
@@ -6,9 +6,20 @@ zmore \- file perusal filter for crt viewing of compressed text
[ name ... ] [ name ... ]
.SH DESCRIPTION .SH DESCRIPTION
.I Zmore .I Zmore
is a filter which allows examination of compressed text files is a filter which allows examination of compressed or plain text files
one screenful at a time on a soft-copy terminal. one screenful at a time on a soft-copy terminal.
It normally pauses after each screenful, printing --More-- .I zmore
works on files compressed with
.I compress, pack
or
.I gzip,
and also on uncompressed files.
If a file does not exist,
.I zmore
looks for a file of the same name with the addition of a .gz, .z or .Z suffix.
.PP
.I Zmore
normally pauses after each screenful, printing --More--
at the bottom of the screen. at the bottom of the screen.
If the user then types a carriage return, one more line is displayed. If the user then types a carriage return, one more line is displayed.
If the user hits a space, If the user hits a space,
@@ -131,4 +142,4 @@ except that a header is printed before each file.
.DT .DT
/etc/termcap Terminal data base /etc/termcap Terminal data base
.SH "SEE ALSO" .SH "SEE ALSO"
more(1), gzip(1), zcmp(1), znew(1), zforce(1), gzexe(1) more(1), gzip(1), zdiff(1), zgrep(1), znew(1), zforce(1), gzexe(1)
+27 -14
View File
@@ -1,5 +1,6 @@
#!/bin/sh #!/bin/sh
PATH="/usr/local/bin:$PATH"; export PATH
check=0 check=0
pipe=0 pipe=0
opt= opt=
@@ -25,7 +26,19 @@ if test -z "$cpmod" && ${TOUCH-touch} -r $tmp.1 $tmp.2 2>/dev/null; then
cpmodarg="-r" cpmodarg="-r"
warn="(does not preserve file modes)" warn="(does not preserve file modes)"
fi fi
rm -f $tmp.[12]
# check if GZIP env. variable uses -S or --suffix
gzip -q $tmp.1
ext=`echo $tmp.1* | sed "s|$tmp.1||"`
rm -f $tmp.[12]*
if test -z "$ext"; then
echo znew: error determining gzip extension
exit 1
fi
if test "$ext" = ".Z"; then
echo znew: cannot use .Z as gzip extension.
exit 1
fi
A= A=
fileno=0 fileno=0
@@ -42,12 +55,12 @@ do
done done
if test $fileno -eq 0; then if test $fileno -eq 0; then
echo 'recompress .Z files into .gz (gzip) files' echo "recompress .Z files into $ext (gzip) files"
echo usage: `echo $0 | sed 's,^.*/,,'` "[-tv9P]" file.Z... echo usage: `echo $0 | sed 's,^.*/,,'` "[-tv9KP]" file.Z...
echo " -t tests the new files before deleting originals" echo " -t tests the new files before deleting originals"
echo " -v be verbose" echo " -v be verbose"
echo " -9 use the slowest compression method (optimal compression)" echo " -9 use the slowest compression method (optimal compression)"
echo " -K keep a .Z file when it is smaller than the .gz file" echo " -K keep a .Z file when it is smaller than the $ext file"
echo " -P use pipes for the conversion $warn" echo " -P use pipes for the conversion $warn"
exit 1 exit 1
fi fi
@@ -76,9 +89,9 @@ for i do
fi fi
test $keep -eq 1 && old=`wc -c < "$n.Z"` test $keep -eq 1 && old=`wc -c < "$n.Z"`
if test $pipe -eq 1; then if test $pipe -eq 1; then
if gzip -d < "$n.Z" | gzip $opt > "$n.gz"; then if gzip -d < "$n.Z" | gzip $opt > "$n$ext"; then
# Copy file attributes from old file to new one, if possible. # Copy file attributes from old file to new one, if possible.
test -n "$cpmod" && $cpmod $cpmodarg "$n.Z" "$n.gz" 2> /dev/null test -n "$cpmod" && $cpmod $cpmodarg "$n.Z" "$n$ext" 2> /dev/null
else else
echo error while recompressing $n.Z echo error while recompressing $n.Z
res=1; continue res=1; continue
@@ -112,25 +125,25 @@ for i do
res=1; continue res=1; continue
fi fi
fi fi
test $keep -eq 1 && new=`wc -c < "$n.gz"` test $keep -eq 1 && new=`wc -c < "$n$ext"`
if test $keep -eq 1 -a `expr \( $old + $block - 1 \) / $block` -lt \ if test $keep -eq 1 -a `expr \( $old + $block - 1 \) / $block` -lt \
`expr \( $new + $block - 1 \) / $block`; then `expr \( $new + $block - 1 \) / $block`; then
if test $pipe -eq 1; then if test $pipe -eq 1; then
rm -f "$n.gz" rm -f "$n$ext"
elif test $check -eq 1; then elif test $check -eq 1; then
mv "$n.$$" "$n.Z" && rm -f "$n.gz" mv "$n.$$" "$n.Z" && rm -f "$n$ext"
else else
gzip -d "$n.gz" && compress "$n" && rm -f "$n.gz" gzip -d "$n$ext" && compress "$n" && rm -f "$n$ext"
fi fi
echo "$n.Z smaller than $n.gz -- unchanged" echo "$n.Z smaller than $n$ext -- unchanged"
elif test $check -eq 1; then elif test $check -eq 1; then
if gzip -t "$n.gz" ; then if gzip -t "$n$ext" ; then
rm -f "$n.$$" "$n.Z" rm -f "$n.$$" "$n.Z"
else else
test $pipe -eq 0 && mv "$n.$$" "$n.Z" test $pipe -eq 0 && mv "$n.$$" "$n.Z"
rm -f "$n.gz" rm -f "$n$ext"
echo error while testing $n.gz, $n.Z unchanged echo error while testing $n$ext, $n.Z unchanged
res=1; continue res=1; continue
fi fi
elif test $pipe -eq 1; then elif test $pipe -eq 1; then
+2 -1
View File
@@ -8,6 +8,7 @@ znew \- recompress .Z files to .gz files
.I Znew .I Znew
recompresses files from .Z (compress) format to .gz (gzip) format. recompresses files from .Z (compress) format to .gz (gzip) format.
.SH OPTIONS .SH OPTIONS
.TP
.B \-f .B \-f
Force recompression from .Z to .gz format even if a .gz file already exists. Force recompression from .Z to .gz format even if a .gz file already exists.
.TP .TP
@@ -26,7 +27,7 @@ Use pipes for the conversion to reduce disk space usage.
.B \-K .B \-K
Keep a .Z file when it is smaller than the .gz file Keep a .Z file when it is smaller than the .gz file
.SH "SEE ALSO" .SH "SEE ALSO"
gzip(1), zmore(1), zcmp(1), zforce(1), gzexe(1), compress(1) gzip(1), zmore(1), zdiff(1), zgrep(1), zforce(1), gzexe(1), compress(1)
.SH BUGS .SH BUGS
.I Znew .I Znew
does not maintain the time stamp with the -P option if does not maintain the time stamp with the -P option if