# PaCkAgE DaTaStReAm FSFgzip 1 784 # end of header 0707010000cee8000081a400000000000000010000000135609ade000000b7000000660000000300000000000000000000001000000004FSFgzip/pkginfoPKG=FSFgzip NAME=gzip ARCH=Intel VERSION=1.2.4 CATEGORY=application VENDOR=Free Software Foundation EMAIL=gnu@PREP.AI.MIT.EDU PSTAMP=Steve Christensen BASEDIR=/usr/local CLASSES=none 0707010000cee7000081a400000000000000010000000135609ade000006e8000000660000000300000000000000000000000f00000004FSFgzip/pkgmap: 1 784 1 d none bin 0755 bin bin 1 l none bin/gunzip=gzip 1 f none bin/gzexe 0755 bin bin 3858 34901 895512635 1 f none bin/gzip 0755 bin bin 71924 52167 895512635 1 l none bin/zcat=gzip 1 l none bin/zcmp=zdiff 1 f none bin/zdiff 0755 bin bin 2006 3813 895512635 1 f none bin/zforce 0755 bin bin 1010 10473 895512635 1 f none bin/zgrep 0755 bin bin 1339 32986 895512635 1 f none bin/zmore 0755 bin bin 1074 12149 895512635 1 f none bin/znew 0755 bin bin 3508 62944 895512635 1 d none doc.gzip 0755 bin bin 1 f none doc.gzip/COPYING 0444 bin bin 17982 28433 895514618 1 f none doc.gzip/ChangeLog 0444 bin bin 26312 39742 895514618 1 f none doc.gzip/NEWS 0444 bin bin 9967 8956 895514618 1 f none doc.gzip/README 0444 bin bin 7299 3833 895514618 1 f none doc.gzip/THANKS 0444 bin bin 13037 8467 895514618 1 f none doc.gzip/TODO 0444 bin bin 2635 35646 895514618 1 f none doc.gzip/gpl.texinfo 0444 bin bin 18317 13624 895514618 1 f none doc.gzip/gzip.texi 0444 bin bin 17382 5879 895514618 1 f none doc.gzip/texinfo.tex 0444 bin bin 108872 34125 895514618 1 d none info 0755 bin bin 1 f none info/gzip.info 0644 bin bin 35587 15617 895512636 1 d none lib 0755 bin bin 1 d none man 0755 bin bin 1 d none man/man1 0755 bin bin 1 l none man/man1/gunzip.1=gzip.1 1 f none man/man1/gzexe.1 0644 bin bin 1296 45404 895512636 1 f none man/man1/gzip.1 0644 bin bin 13923 37380 895512636 1 l none man/man1/zcat.1=gzip.1 1 l none man/man1/zcmp.1=zdiff.1 1 f none man/man1/zdiff.1 0644 bin bin 802 494 895512636 1 f none man/man1/zforce.1 0644 bin bin 591 48615 895512636 1 f none man/man1/zgrep.1 0644 bin bin 958 14701 895512636 1 f none man/man1/zmore.1 0644 bin bin 4226 42237 895512636 1 f none man/man1/znew.1 0644 bin bin 999 17965 895512636 1 i pkginfo 183 14901 895523550 07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000b00000000TRAILER!!!0707010000cee8000081a400000000000000010000000135609ade000000b7000000660000000300000000000000000000000800000004pkginfoPKG=FSFgzip NAME=gzip ARCH=Intel VERSION=1.2.4 CATEGORY=application VENDOR=Free Software Foundation EMAIL=gnu@PREP.AI.MIT.EDU PSTAMP=Steve Christensen BASEDIR=/usr/local CLASSES=none 0707010000cee7000081a400000000000000010000000135609ade000006e8000000660000000300000000000000000000000700000004pkgmap: 1 784 1 d none bin 0755 bin bin 1 l none bin/gunzip=gzip 1 f none bin/gzexe 0755 bin bin 3858 34901 895512635 1 f none bin/gzip 0755 bin bin 71924 52167 895512635 1 l none bin/zcat=gzip 1 l none bin/zcmp=zdiff 1 f none bin/zdiff 0755 bin bin 2006 3813 895512635 1 f none bin/zforce 0755 bin bin 1010 10473 895512635 1 f none bin/zgrep 0755 bin bin 1339 32986 895512635 1 f none bin/zmore 0755 bin bin 1074 12149 895512635 1 f none bin/znew 0755 bin bin 3508 62944 895512635 1 d none doc.gzip 0755 bin bin 1 f none doc.gzip/COPYING 0444 bin bin 17982 28433 895514618 1 f none doc.gzip/ChangeLog 0444 bin bin 26312 39742 895514618 1 f none doc.gzip/NEWS 0444 bin bin 9967 8956 895514618 1 f none doc.gzip/README 0444 bin bin 7299 3833 895514618 1 f none doc.gzip/THANKS 0444 bin bin 13037 8467 895514618 1 f none doc.gzip/TODO 0444 bin bin 2635 35646 895514618 1 f none doc.gzip/gpl.texinfo 0444 bin bin 18317 13624 895514618 1 f none doc.gzip/gzip.texi 0444 bin bin 17382 5879 895514618 1 f none doc.gzip/texinfo.tex 0444 bin bin 108872 34125 895514618 1 d none info 0755 bin bin 1 f none info/gzip.info 0644 bin bin 35587 15617 895512636 1 d none lib 0755 bin bin 1 d none man 0755 bin bin 1 d none man/man1 0755 bin bin 1 l none man/man1/gunzip.1=gzip.1 1 f none man/man1/gzexe.1 0644 bin bin 1296 45404 895512636 1 f none man/man1/gzip.1 0644 bin bin 13923 37380 895512636 1 l none man/man1/zcat.1=gzip.1 1 l none man/man1/zcmp.1=zdiff.1 1 f none man/man1/zdiff.1 0644 bin bin 802 494 895512636 1 f none man/man1/zforce.1 0644 bin bin 591 48615 895512636 1 f none man/man1/zgrep.1 0644 bin bin 958 14701 895512636 1 f none man/man1/zmore.1 0644 bin bin 4226 42237 895512636 1 f none man/man1/znew.1 0644 bin bin 999 17965 895512636 1 i pkginfo 183 14901 895523550 0707010000cee9000041ed00000000000000010000000635609ade00000000000000660000000300000000000000000000000600000004reloc0707010000ceea000041ed00000000000000010000000235609ade00000000000000660000000300000000000000000000000a00000004reloc/bin0707010000ceeb000081ed0000000200000002000000013560703b00000f12000000660000000300000000000000000000001000000004reloc/bin/gzexe#!/bin/sh # gzexe: compressor for Unix executables. # Use this only for binaries that you do not use frequently. # # The compressed version is a shell script which decompresses itself after # skipping $skip lines of shell commands. We try invoking the compressed # executable with the original name (for programs looking at their name). # 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. # WARNING: the first line of this file must be either : or #!/bin/sh # 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` if test $# = 0; then echo compress executables. original file foo is renamed to foo~ echo usage: ${x} [-d] files... echo " -d decompress the executables" exit 1 fi tmp=gz$$ trap "rm -f $tmp; exit 1" 1 2 3 5 10 13 15 decomp=0 res=0 test "$x" = "ungzexe" && decomp=1 if test "x$1" = "x-d"; then decomp=1 shift fi echo hi > zfoo1$$ echo hi > zfoo2$$ if test -z "`(${CPMOD-cpmod} zfoo1$$ zfoo2$$) 2>&1`"; then cpmod=${CPMOD-cpmod} fi 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 if test ! -f "$i" ; then echo ${x}: $i not a file res=1 continue fi if test $decomp -eq 0; then if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then echo "${x}: $i is already gzexe'd" continue fi fi if ls -l "$i" | grep '^...[sS]' > /dev/null; then echo "${x}: $i has setuid permission, unchanged" continue fi if ls -l "$i" | grep '^......[sS]' > /dev/null; then echo "${x}: $i has setgid permission, unchanged" continue fi case "`basename $i`" in gzip | tail | chmod | ln | sleep | rm) echo "${x}: $i would depend on itself"; continue ;; esac if test -z "$cpmod"; then cp -p "$i" $tmp 2>/dev/null || cp "$i" $tmp if test -w $tmp 2>/dev/null; then writable=1 else writable=0 chmod u+w $tmp 2>/dev/null fi fi if test $decomp -eq 0; then sed 1q $0 > $tmp sed "s|^if tail|if $tail|" >> $tmp <<'EOF' skip=18 if tail +$skip $0 | "/usr/local/bin"/gzip -cd > /tmp/gztmp$$; then /bin/chmod 700 /tmp/gztmp$$ prog="`echo $0 | /bin/sed 's|^.*/||'`" if /bin/ln /tmp/gztmp$$ "/tmp/$prog" 2>/dev/null; then trap '/bin/rm -f /tmp/gztmp$$ "/tmp/$prog"; exit $res' 0 (/bin/sleep 5; /bin/rm -f /tmp/gztmp$$ "/tmp/$prog") 2>/dev/null & /tmp/"$prog" ${1+"$@"}; res=$? else trap '/bin/rm -f /tmp/gztmp$$; exit $res' 0 (/bin/sleep 5; /bin/rm -f /tmp/gztmp$$) 2>/dev/null & /tmp/gztmp$$ ${1+"$@"}; res=$? fi else echo Cannot decompress $0; exit 1 fi; exit $res EOF "/usr/local/bin"/gzip -cv9 "$i" >> $tmp || { /bin/rm -f $tmp echo ${x}: compression not possible for $i, file unchanged. res=1 continue } else # decompression skip=18 if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then eval `sed -e 1d -e 2q "$i"` fi if tail +$skip "$i" | "/usr/local/bin"/gzip -cd > $tmp; then : else echo ${x}: $i probably not in gzexe format, file unchanged. res=1 continue fi fi rm -f "$i~" mv "$i" "$i~" || { echo ${x}: cannot backup $i as $i~ rm -f $tmp res=1 continue } mv $tmp "$i" || cp -p $tmp "$i" 2>/dev/null || cp $tmp "$i" || { echo ${x}: cannot create $i rm -f $tmp res=1 continue } rm -f $tmp if test -n "$cpmod"; then $cpmod "$i~" "$i" 2>/dev/null elif test $writable -eq 0; then chmod u-w $i 2>/dev/null fi done exit $res 0707010000ceec000081ed0000000200000002000000013560703b000118f4000000660000000300000000000000000000000f00000004reloc/bin/gzipELF44 (44ffhhQ((R/usr/lib/ld.so.1Z}Q|8e@%\>uAgHS5C[$2qXUha/V?o'{ink~EDJtY_4+m^I.0:6;BF*7, `Rb-)=lO!dW(v]j&ywc3"1PMsTNG#zp9frxL<KԀX(@ . . . hQ (RR]]]bSHS(SS# $o +ȕ4̕?(D" LXSxXx ) dЕpԕyPSHu m \ !S+H TȟhhQ  X#(* 4 <5 CxI U^Henuȝ| S@][ \   ,S h= x &h.| 2(R;XC MT Z`0Sh4So8u|H X(HL & P   A   ,j  T  K 8 !T "X (xW.\ 1؞8؝B' HNa \a\h oȞu}h ؟? \' U` d,U 07 e x](@ b,l & 4;d Bd$ HIP* Zdl `< kfA rX}. hl h$Sl # H  !H l 0 l l  LS Xm #). /X 4m ;DSDSN\1 V"_8g ov@U (Slisttotal_outdo_lzwasciigetopt_startbytes_inforegroundread_mcountcallocatoiwrite_errorlast_memberz_suffixlongoptsprognameinflate_fixed_environ_endblock_mode_iobdecompress__register_frame_infoworktime_stampreaddir__flsbuf_GLOBAL_OFFSET_TABLE_inflate_codeslbitsmake_simple_name__ctypestrlwrabortprev_lengthstrstartsignalread_bufwindowatexitexitforcedecryptinbufoptoptmalloc_xstatunlzhprevopendirexit_codeblock_startunlzw_initadd_envoptext_headerread_errorifdinflate_storedmatch_start_fxstatgood_matchnice_matchcheck_zipfileno_timeverbosebytes_outsave_orig_namelevel__register_frame_info_tableabort_gzipmask_bitsct_tallyto_stdoutcopy_blockflush_outbufargsifnamegetenvlzw_getopt_internalbi_winduptestlm_initmax_chain_lengthstrncpyenv_DYNAMICstrncmpfile_typeprintf__iobchownmaxbitsmethodctimestrcatifile_sizedbitswritestrrchrinsizeunzipfile_methoddisplay_ratiowarnsend_bits__frame_state_forinflate_blockd_bufinflateupdcrcwrite_bufenvironperrorbberrnopkzipbkunlink__fpstarterrorutimelongest_matchfreeoptindunpackclose_lxstatfill_inbufclosediropenzipoptargbi_reversewindow_sizehufts__deregister_frame_infoclear_bufsflush_blockstrcmpfgetsopterrfile_read_edata_PROCEDURE_LINKAGE_TABLE_xmallocmemsetofnameoutbufstrcpyhuft_freeinptrhuft_build_etextcrc_32_tab_lib_versionistatfflushquietz_lengetopt_longdeflate_ctypestrspninflate_dynamicheader_bytesmainkeyofdchmodbasenameremove_ofnamememcpystrcspnpart_nblseek_finicopyoutcnttotal_inrecursivebi_init_cleanupfprintfct_initisattyflush_window_xmknodno_namelibc.so.1SUNW_0.7libc.so.1(= . x<tQxQD|QQEQKQQYQQQAQuQrQ'QQQQQQQQ}QwQQ$Q|QQQQQQQyQNQ6QRRRJ RRRkRR& R7$R>5lQ%pQ%tQh%xQh%|Qh%Qh%Qh %Qh(%Qh0%Qh8p%Qh@`%QhHP%QhP@%QhX0%Qh` %Qhh%Qhp%Qhx%Qh%Qh%Qh%Qh%Qh%Qh%Qh%Qhp%Qh`%QhP%Qh@%Qh0%Qh %Qh%Qh%Qh%Qh%Qh%Qh%Rh%Rh %Rh(% Rh0%Rh8p%Rh@`%RhHP%RhP@% RhX0%$Rh` jjRt h&(Rth. ETRU RP諍Q PjUS[gPXЋX8u荃 P4]ÐUS[']ÐUS[P Pe]US[]Uu ujXÐUu ujTÐUu ujPÐUuu ujIÐUh92h05h;2h 2USTh5h55h5h =Tt3h5h  ;u]ÐUSRh5h55h5h =Rt3h5h  ;u]ÐUh5h55h5h Vh5h5h5h =$h6h +h#6h h26h  ÐUWVSEE 0c؉3ыHE=~"t463tҀuTh96E PEPcЉ|  tE @Sjj=%̕thjcjjW=thjAjj5=thjjh>65 tPjhA65 t7rE6tI6uSSjhO6hԕԕ3ыHl  jhPShS6u u~ȃQσE$ttȦ<,HXhtئ,lS5\A0SSuSe SYjwSSS%jCSSSSSS$S SS\3ыHl Rhԕ%aSS,S= S$S'jF5ht6h ojwЉ 8SjP=S} SS=S} SS\]+؃=St!=$Su5h6h  =l u =St =l ~%5\5h6h j=(St=Su T t2\9E~+E 4\\9U;=St=$Su~ jj5 u\؃u h<;Gt ~,C8u`8Cd8j/u؃UtSڀ;t&hR;S؃9E}CE;tC;uڃ}u Mu}tE@uFuuNu1j.uEu hT;FExuHEhԕue[^_ÐUSX xShd qt=X NuNhd [֐=Su?xShd t'hd )Shd  t 3xPhhl Gtdhd hx 9u&0=St6Phx 5hs;hd hx 5h;h == Sf;f(hd 5h;h =̕tA C PEt+h;h h SjO(P(t =Yu 2(yt'h;h =tG=$Su5h7h y =r,m d$ Gm =m @usՍe[^_UWVSEdl ` NF VF ЍTӉdl 9L r&F VF  ʁPKthx 5h<nF4St=thx 5h<FF$Љu"F=|WxW)hx 5h<h >h Bdl 9L v dl j% 9 w#ߋ؉Q+Sw$A wCdl 9L v dl j% v߁9BscwCdl 9L v dl j% v߁94Bsdl 9L v dl jm% v߁ 9r&BsDž9eF=T 5\ X PPh XhWhPd t=hB>h 9rXPPhXhHXjPt9=uh\>h ӛh ZG _u[^_UVS5T \ uAdl 9L v dl jM% t‹E΁KwBdl 9L v dl j% v%5T \ =u!u =t {e[^UVSm \ T 3ۍu` Vu:9` v` }tՃ=\ v\  dl =\ w3e[^UVSu] X =L tC=L tA5L hSL p hhV{L u=L u=X tTp ȕ3e[^ÐUWVSu] t$ XtX2Ћ3 FKu XЍe[^_ÐUm dl L p ȕÐUSL X L +RP5` 腙ЍB =vL =L vă=L u}t #CL ȕdl ]ÐU=m t+5m hd$ 5l rm p m ÐU=m tG5m h=,Su5m h5l m p m ÐUWVS} uVWuz؃ ;tu+ݐe[^_USMр9t t B:u]ÐUS]j/S1tXË]ÐUS]j.St;u@H8.u_;u]ÐUWVSuEEuĘE+}3щMQuSE؃ ;t8hw>S艘؃;t!hw>S脗؃;tCE;uʃ}uuEEj@PDu hz>E 80EEHE}} h>m]}~+hw>Sٗ؉CuM}؃mrmsEe[^_ÐUuhx 5h>h `۾ÐU=$Su u uhx 5h>h ,=h  =X thx fhx h>h ̔ DÐU5h>h 訔hd ÐUVSM] utc +!MbUE+‰E}؅}"yVj-b F-F yVj @ F Fgfff+ЍE+؉]SRh>Vԓe[^ÐUSu萕؃u hz>-Ë]U=\u+\h>h E 9Et +uFu*h/@誂t =t8=uw9t9\t2u \%9\t\ \M9 \}\u 8-u߀xt١\M9 \\u ?@uV\9t*9\tu 9u \M  \u95\u9t)\"\M 8-uxuV=u \u \\{MMuuE\3tM x-%@u *\M 8-x-t }=Euuuu?t ?=tG?u]E;td+PRM1Z~ u6+u6;}u uMMEEEu>u}tH}uB=]t\M 41hB@h }5}nuu\?MytG=\=]tX\u Dx-uM16h`@h 7}+u6\M DP1h@h  }53ju~uwM9 \}\u \\T=]t \M t1h@h |5`3u>::55}tuM1MytQA 3uF }t)\M x-tPuuu=]tR\u x-u56h@h {(5\M P1hAh { A\3PuWС8u\t:u1=]tPu 6h!Ah ,{ã]3z:z:u8ue\d8uMM9 \u7=]tPu 6h;Ah zã]3ۋM9:u:\u \\Íe[^_ÐUjjjuu u5ÐUjuuuu uUWV3MAM% }E 8Ee^_ÐUWV}EM7G% Eք|w@t EE UǍe^_ÐUWVU Eut6 9}utuFw+ƅ}}9}u|Ju΍e^_ÐUU3Ƀ:tztztAPxuÐUWVS[F,uU:M MUU>t?~t*~t$VWGu -F 9EvEF 9EsEpxuËM9MU MU e[^_ÐUWVS[ö+UB t)E>t,6 E>uUrEEUBPyE3EEUB t/>t@UUuEPEPW6>uEPEPEPWUrUz EEBe[^_ÐUWVS[*\Dtt>u VM9w9Nwvu߅u LEH3NM;s7v M9 MA9EsUMA 9Evz9}w3e[^_ÐUWVS[**UB+Ѝr u} 7uEt%utz zt 3E EЋ3щMD EBuu}u@u FU } GE PRЋu VRu FB>?zuEPRUe[^_ÐUWVS[)}UMAM@ut%?GB}D%?EEPuPEEG EEM D\uED t%?EMu L0\=.+ᐐ%''|'h'P''%%&0&&&p&P&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%uuMAMuuMMEPuEEPuEEG EEu D0\MED2kEPuEEu D0\IEPudEEPuUEEM D\uED  EPu$EEPuEEM fAXEAEPuEEu fFXEPuEEM AjttЋE M Qptu Vp‹RvtXEEM D\ETpu=v&EPu@EEM A tEe[^_ÐUS[Ç%EU BBB B\DB\D]US[?%EU BB BB\DB\D]US[$E\D\Dt'9BuB:tr GsJzus]ÐUWVS[Û$ul.M쉍hQl. jtjxdQrEfEҋE| lA+ȋx;s6h`d\j`\V;r㋵lE8zutPVMtlxlAp;s7pXM9pw XEPxPVJ;rՋ} xE L[^_UVS[6# pxt Ѓ>ue[^ÐUS[#]rCr Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. along with this program; if not, write to the Free Software You should have received a copy of the GNU General Public License GNU General Public License for more details. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the but WITHOUT ANY WARRANTY; without even the implied warranty of This program is distributed in the hope that it will be useful, any later version. the Free Software Foundation; either version 2, or (at your option) it under the terms of the GNU General Public License as published by This program is free software; you can redistribute it and/or modify Copyright (C) 1992-1993 Jean-loup Gaillybitslzwbestfastversionverboseno-timetestsuffixrecursivesilentquietnameno-namelicenselisthelpforceuncompressdecompressstdoutto-stdoutasciirusage: %s [-%scdfhlLnN%stvV19] [-S suffix] [file ...] file... files to (de)compress. If none given, use standard input. -9 --best compress better -1 --fast compress faster -V --version display version number -v --verbose verbose mode -t --test test compressed file integrity -S .suf --suffix .suf use suffix .suf on compressed files -r --recursive operate recursively on directories -q --quiet suppress all warnings -N --name save or restore the original name and time stamp -n --no-name do not save or restore the original name and time stamp -L --license display software license -l --list list compressed file contents -h --help give this help -f --force force overwrite of output file and compress links -d --decompress decompress -c --stdout write on standard output, keep original files unchanged18 Aug 931.2.4%s %s (%s) %s UTIMEDIRENTCompilation options: %s %s STDC_HEADERS HAVE_UNISTD_H .exeGZIPunguncatgzcat.gzab:cdfhH?lLmMnNqrS:tvVZ123456789%s: -Z not supported in this version %s: option --ascii ignored on this system %s: incorrect suffix '%s' deread fromwritten to%s: compressed data not %s a terminal. Use -f to force %scompression. For help, type: %s -h stdinfstat(stdin) OK -%s: %s is a directory -- ignored %s: %s is not a directory or a regular file - ignored %s: %s has %d other link%c -- unchanged %s: %s: %s compressed to %s %s: %s OK -- replaced with %s%s: %s: warning, name truncated _z-z-gz.tgz.taz.zz.Z%s: %s: unknown suffix -- ignored .tar%s: %s already has %s suffix -- unchanged %s: %s: unknown method %d -- get newer version of gzip %s: %s is encrypted -- get newer version of gzip %s: %s is a a multi-part gzip file -- get newer version of gzip %s: %s has flags 0x%x -- get newer version of gzip %s: %s: part number %u %s: %s: extra field of %u bytes ignored corrupted input -- file name too largePK %s: %s: not in gzip format %s: %s: decompression OK, trailing garbage ignored deflalzh pack comprstoremethod crc date time compressed uncompr. ratio uncompressed_name %9lu %9lu %9ld %9ld (totals) %5s %08lx %11s %s name too shortcan't recover suffix .internal error in shorten_name%s: %s: cannot %scompress onto itself %s: %s and %s are the same file n%s: %s already exists; do you wish to overwrite (y or n)? not overwritten %s: time stamp restored %s: %s unreadable ..%s: %s/%s: pathname too long bad pack levelblock vanished-l used on binary file %s: %s: not a valid zip file %s: %s: first entry not deflated or stored -- use unzip %s: %s: encrypted file -- use unzip out of memoryinvalid compressed data--format violatedlen %ld, siz %ld invalid compressed data--length mismatchinternal error, invalid methodinvalid compressed data--crc errorinvalid compressed data--length error%s: %s has more than one entry--rest ignored %s: %s has more than one entry -- unchanged incomplete literal tree incomplete distance tree out of memoryargc<=0 %s: %s: %s %s: %s: warning: %s%s %s: %s: unexpected end of file %2ld.%1ld%%output in compress .Z format not supported %s: %s: warning, unknown flags 0x%x %s: %s: compressed with %d bits, can only handle %d bits corrupt input.corrupt input. Use zcat to recover some data.invalid compressed data -- Huffman code > 32 bitstoo many leaves in Huffman treeinvalid compressed data--length errorBad table POSIXLY_CORRECT--%s: option `%s' is ambiguous %s: option `--%s' doesn't allow an argument %s: option `%c%s' doesn't allow an argument %s: option `%s' requires an argument %s: unrecognized option `--%s' %s: unrecognized option `%c%s' %s: illegal option -- %c %s: option requires an argument -- %c eh(RΝޝ.>N^n~Ξޞ.>N^n~Οޟ.>N^n~ . .ooX  hQh@(]m1%10000<0///0D//.32a)2c"2c2d 2d2f2h1l1L1n1N1q1q1r1S1t1T1v1V11191Z1b5e5!5544[4433{3J3+3322r2ԕO6j8e8`8\8Y8V8ԕO6j8Y8o8::~:x:0000r:      Hbjm Zjz  ' }Dңhi]Wbgeq6lknv+ӉZzJgo߹ホCՎ`~ѡ8ROggW?K6H+ L J6`zA`Ugn1yiFafo%6hRw G "/&U;( Z+j\1е,[d&c윣ju m ?6grWJz+{8 Ғ |! ӆBhn[&wowGZpj;f\ eibkaElx TN³9a&g`MGiIwn>JjѮZf @;7SŞϲG0򽽊º0S$6к)WTg#.zfJah]+o*7 Z-| ,#; ,H0$Y ,x$U $. P% 8...  .%  ). .. . ..... ...... ...@& ..l0'    ... .. ... H(  K..5.H.. . .6...... . .*... . ............8...$+H $ ,D 4d,U 4..0,j -./.... . .. . .6... . ....;... . .ԀX(@ . . . hQ (RR]]]bh m   + :R>]L b]u8 bP x R] R<   ̡ $ T] hU m Ll $ /4Z ;  Ck ND XZ b( nLg zl A .  c  9 UH @UXU\U$% U  /0b3=h LUP`4bl8b{ X>HX<X<X X  &,  ;\DL  [d s }8<@hh4 hx|   d& ) z )4 5<E8G P Yc8{ l }      $& L # #; "0$Y 1$U <$. G% P% [& dĕl0' }H( ](. (.  ]\. ]]bSHS%(S,S2# 9o @ȕI̕T(Y" aXpxux ) ЕԕPSHu m \ !S+H T ȟ h hQ ,  : X@ (* Q  Y 5 ` xf r { H   ȝ  S  @ ]   [ \     !  + ,S0 h= 8 x I hQ | U (R^ Xf  p w  }  0S 4S 8  H  X ( H L  & P   A   ,j    T   " K ) 8 3 !; B T E X K xWQ \ T ؞[ ؝e ' k q a   \  Ȟ  h ؟  ? \ ' U `  d,U 07  e   x ]$ (@ . b5 O l & W ^ d e d$ Hl s * } dl  < fA X . hl  h $S l  # H  ! H  l 0 l l  !LS/6X>m FL. RX Wm ^DSgSq\1 y"8 @U (Sgzipcrt1.scrti.svalues-Xa.ccrtstuff.cgcc2_compiled.p.2__DTOR_LIST____do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.7frame_dummyinit_dummyforce_to_data__CTOR_LIST__gzip.cgcc2_compiled.license_msgstatlstatfstatmknodusagehelp_msg.12helplicenseversiondo_exittreat_filetreat_stdindo_listget_methodget_istattreat_dirreset_timesmake_ofnamecreate_outfilecopy_statcheck_ofnamename_too_longshorten_namedo_statknown_suffixes.29get_suffixsuffixes.32first_time.39methods.40same_filein_exit.57zip.cgcc2_compiled.crcdeflate.cgcc2_compiled.configuration_tablecompr_levelmax_lazy_matchlookaheadeofilefill_windowins_hdeflate_fasttrees.cgcc2_compiled.extra_lbitsextra_dbitsextra_blbitsl_descdyn_ltreestatic_ltreed_descdyn_dtreestatic_dtreebl_descbl_treebl_orderinput_lencompressed_lenbase_lengthlength_codebase_distdist_codebl_countgen_codesinit_blockstatic_lenopt_lenlast_flagslast_distlast_litflagsflag_bitpqdownheapheapheap_lendepthgen_bitlenheap_maxbuild_treescan_treesend_treebuild_bl_treesend_all_treesflag_bufset_file_typecompress_blockbits.cgcc2_compiled.zfilebi_bufbi_validunzip.cgcc2_compiled.inflate.cgcc2_compiled.bordercplenscplextcpdistcpdextutil.cgcc2_compiled.crc.4crypt.cgcc2_compiled.lzw.cgcc2_compiled.msg_doneunlzw.cgcc2_compiled.unpack.cgcc2_compiled.read_treeorig_lenmax_lenleaveslit_baseliteralbuild_treeparentspeek_bitsvalidbitbufunlzh.cgcc2_compiled.fillbufbitbufbitcountsubbitbufgetbitsinit_getbitsmake_tableread_pt_lenpt_lenpt_tableread_c_lendecode_cblocksizedecode_phuf_decode_startdecode_startjdonei.22decodegetopt.cgcc2_compiled.my_strlenmy_indexexchangefirst_nonoptlast_nonoptnextcharorderingframe.cgcc2_compiled.decode_uleb128decode_sleb128fde_insertcount_fdesadd_fdesframe_initfind_fdeobjectsextract_cie_infoexecute_cfa_insn__FRAME_BEGIN__crtstuff.cgcc2_compiled.__do_global_ctors_aux__CTOR_END__init_dummyforce_to_data__DTOR_END____FRAME_END__crtn.olisttotal_outdo_lzwasciigetopt_startbytes_inforegroundread_mcountcalloc_START_atoiwrite_errorlast_memberz_suffixlongoptsprognameinflate_fixed_environ_endblock_mode_iobdecompress__register_frame_infoworktime_stampreaddir__flsbuf_GLOBAL_OFFSET_TABLE_inflate_codeslbitsmake_simple_name__ctypestrlwrabortprev_lengthstrstartsignalread_bufwindowatexitexitforcedecryptinbufoptoptmalloc_xstatunlzhprevopendirexit_codeblock_startunlzw_initadd_envoptext_headerread_errorifdinflate_storedmatch_start_fxstatgood_matchnice_matchcheck_zipfileno_timeverbosebytes_outsave_orig_namelevel__register_frame_info_tableabort_gzipmask_bitsct_tallyto_stdoutcopy_blockflush_outbufargsifnamegetenv_END_lzw_getopt_internalbi_winduptestlm_initmax_chain_lengthstrncpyenv_DYNAMICstrncmpfile_typeprintf__iobchownmaxbitsmethodctimestrcatifile_sizedbitswritestrrchrinsizeunzipfile_methoddisplay_ratiowarnsend_bits__frame_state_forinflate_blockd_bufinflateupdcrcwrite_bufenvironperrorbberrnopkzipbkunlink__fpstarterrorutimelongest_matchfreeoptindunpackclose_lxstatfill_inbufclosediropenzipoptargbi_reversewindow_sizehufts__deregister_frame_infoclear_bufsflush_blockstrcmpfgetsopterrfile_read_edata_PROCEDURE_LINKAGE_TABLE_xmallocmemsetofnameoutbufstrcpyhuft_freeinptrhuft_build_etextcrc_32_tab_lib_versionistatfflushquietz_lengetopt_longdeflate_ctypestrspninflate_dynamicheader_bytesmainkeyofdchmodbasenameremove_ofnamememcpystrcspnpart_nblseek_finicopyoutcnttotal_inrecursivebi_init_cleanupfprintfct_initisattyflush_window_xmknodno_nameGNU C crt1.sas: WorkShop Compilers 4.2 alpha 14 Jun 1996GNU C crti.sas: WorkShop Compilers 4.2 alpha 14 Jun 1996@(#)SunOS 5.6 Generic August 1997GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GCC: (GNU) 2.8.1as: WorkShop Compilers 4.2 alpha 14 Jun 1996GNU C crtn.oas: WorkShop Compilers 4.2 alpha 14 Jun 1996ld: Software Generation Utilities - Solaris/ELF (3.0) <I4Q8./frame.cXGNU C 2.8.16#!&./opt/SOURCES/gcc-2.8.1?8decode_uleb128xc#!/$A#Q/$(8bufc#  8rc #?a8decode_sleb128xc0$!$A0$Q$"=8bufc# ]8rc#(8read_pointerxc8pc#8read_1bytexU 8pc# 8read_2bytexU 8pc#^8read_4bytexU Z8pc#8read_8bytexU 8pc$8fde_comparexU8x8y8dwarf_fde) =8lengthBU #, i8CIE_deltaBU#. 8pc_beginBc#+ 8pc_rangeBU # & 8next_fdex8p48fde_insertx$!$A$Q$-j8array# 8iU #)8this_fde#$!$8]8count_fdesxU $!%A$Q%)78this_fde#Y%!%28add_fdesx%!%A%Q%)8this_fde#-8array#  *8i_ptrc # -<8beg_ptrc# -i8end_ptrc# x%!x%48frame_initx%!&A%Q&)8ob#  8object. 98pc_beginBc#, e8pc_endBc#1 8fde_beginB#2 8fde_arrayB# ( 8countBU #, 8nextB#;8find_fdex&!-'A&Q-''8pcc# U 8dwarf_cie ) 8lengthBU #) 8CIE_idBU#*  8versionBU#1 Q 8augmentationBr # % 8get_ciex 8f  UA 8extract_cie_infoxc0'!G(A0'QG(" 8f#(B 8c #  d U 0'!0' a'!' 8cie_info2  8augmentationB c#,  8eh_ptrB c#- 2 8code_alignB U#- _ 8data_alignB U# +  8ra_regnoB U #A 8execute_cfa_insnxcH(!+AH(Q+& 8pc# ,! 8state #  %F 8info #"h 8pcc# a)!) )!) )!)  *!*)z 8frame_state_internalt& C 8sB rz #3 v 8saved_stateB  #p 8frame_statep)  8cfaBz c#,  8eh_ptrBz c#- 8cfa_offsetBz U #, H8args_sizeBz U # 2 z8reg_or_offsetBz r#* 8cfa_regBz U#X1 8retaddr_columnBz U#Z* 8savedBz r##\ #U CU?8__register_frame_infox+! ,A+Q ,$8beginc##8ob#E]8__register_frame_info_tablex ,!d,A ,Qd,$68beginc##Y8ob#A8__deregister_frame_infoxd,!,Ad,Q,$8beginc#D8__frame_state_forxz ,!&.A,Q&..88pc_targetc# /g8state_inz #  U -!--!--!-8rtx_defC__register_frame_info__register_frame_info_table]__deregister_frame_info__frame_state_for.interp.hash.dynsym.dynstr.SUNW_version.rel.bss.rel.plt.plt.text.init.fini.rodata.got.dynamic.data.ctors.dtors.eh_frame.bss.symtab.strtab.comment.stab.index.debug.debug_pubnames.shstrtab.stab.indexstrvalues-Xa.cXt ; O ; V=3.1 ; R=WorkShop Compilers 4.2 30 Oct 1996 C 4.2/builds2/respin/usr/src/lib/libc; /ws/on297-tools/SUNWspro/SC4.2/bin/../SC4.2/bin/cc -O -Xt -Iinc -DTEXT_DOMAIN='\"SUNW_OST_OSLIB\"' -I/builds2/respin/proto/root_i386/usr/include -c port/gen/values-Xa.c -W0,-xpԀ   XXo - ((6 @@h?D J.#P.V.Į^hQhc(R(lRH r]y]]b  8%$ 8$lt 0707010000ceed000081ed0000000200000002000000013560703b000007d6000000660000000300000000000000000000001000000004reloc/bin/zdiff#!/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- # gram on compressed files. All options specified are passed # directly to cmp or diff. If only 1 file is specified, then # the files compared are file1 and an uncompressed file1.gz. # If two files are specified, then they are uncompressed (if # necessary) and fed to cmp or diff. The exit status from cmp # or diff is preserved. PATH="/usr/local/bin:$PATH"; export PATH prog=`echo $0 | sed 's|.*/||'` case "$prog" in *cmp) comp=${CMP-cmp} ;; *) comp=${DIFF-diff} ;; esac OPTIONS= FILES= for ARG do case "$ARG" in -*) OPTIONS="$OPTIONS $ARG";; *) if test -f "$ARG"; then FILES="$FILES $ARG" else echo "${prog}: $ARG not found or not a regular file" exit 1 fi ;; esac done if test -z "$FILES"; then echo "Usage: $prog [${comp}_options] file [file]" exit 1 fi set $FILES if test $# -eq 1; then FILE=`echo "$1" | sed 's/[-.][zZtga]*$//'` gzip -cd "$1" | $comp $OPTIONS - "$FILE" STAT="$?" elif test $# -eq 2; then case "$1" in *[-.]gz* | *[-.][zZ] | *.t[ga]z) case "$2" in *[-.]gz* | *[-.][zZ] | *.t[ga]z) F=`echo "$2" | sed 's|.*/||;s|[-.][zZtga]*||'` gzip -cdfq "$2" > /tmp/"$F".$$ gzip -cdfq "$1" | $comp $OPTIONS - /tmp/"$F".$$ STAT="$?" /bin/rm -f /tmp/"$F".$$;; *) gzip -cdfq "$1" | $comp $OPTIONS - "$2" STAT="$?";; esac;; *) case "$2" in *[-.]gz* | *[-.][zZ] | *.t[ga]z) gzip -cdfq "$2" | $comp $OPTIONS "$1" - STAT="$?";; *) $comp $OPTIONS "$1" "$2" STAT="$?";; esac;; esac exit "$STAT" else echo "Usage: $prog [${comp}_options] file [file]" exit 1 fi 0707010000ceee000081ed0000000200000002000000013560703b000003f2000000660000000300000000000000000000001100000004reloc/bin/zforce#!/bin/sh # zforce: force a gz extension on all gzip files so that gzip will not # compress them twice. # # This can be useful for files with names truncated after a file transfer. # 12345678901234 is renamed to 12345678901.gz PATH="/usr/local/bin:$PATH"; export PATH x=`basename $0` if test $# = 0; then echo "force a '.gz' extension on all gzip files" echo usage: $x files... exit 1 fi res=0 for i do if test ! -f "$i" ; then echo ${x}: $i not a file res=1 continue fi test `expr "$i" : '.*[.-]z$'` -eq 0 || continue test `expr "$i" : '.*[.-]gz$'` -eq 0 || continue test `expr "$i" : '.*[.]t[ag]z$'` -eq 0 || continue if gzip -l < "$i" 2>/dev/null | grep '^defl' > /dev/null; then if test `expr "$i" : '^............'` -eq 12; then new=`expr "$i" : '\(.*\)...$`.gz else 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 done exit $res 0707010000ceef000081ed0000000200000002000000013560703b0000053b000000660000000300000000000000000000001000000004reloc/bin/zgrep#!/bin/sh # zgrep -- a wrapper around a grep program that decompresses files as needed # Adapted from a version sent by Charles Levert 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 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 break; 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 $# -eq 0; then gzip -cdfq | $grep $opt "$pat" exit $? fi 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 0707010000cef0000081ed0000000200000002000000013560703b00000432000000660000000300000000000000000000001000000004reloc/bin/zmore#!/bin/sh PATH="/usr/local/bin:$PATH"; export PATH if test "`echo -n a`" = "-n a"; then # looks like a SysV system: n1=''; n2='\c' else n1='-n'; n2='' fi oldtty=`stty -g 2>/dev/null` if stty -cbreak 2>/dev/null; then cb='cbreak'; ncb='-cbreak' else # 'stty min 1' resets eof to ^a on both SunOS and SysV! cb='min 1 -icanon'; ncb='icanon eof ^d' fi if test $? -eq 0 -a -n "$oldtty"; then 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 -t 0; then echo usage: zmore files... else gzip -cdfq | eval ${PAGER-more} fi else FIRST=1 for FILE do if test $FIRST -eq 0; then echo $n1 "--More--(Next file: $FILE)$n2" stty $cb -echo 2>/dev/null ANS=`dd bs=1 count=1 2>/dev/null` stty $ncb echo 2>/dev/null echo " " if test "$ANS" = 'e' -o "$ANS" = 'q'; then exit fi fi if test "$ANS" != 's'; then echo "------> $FILE <------" gzip -cdfq "$FILE" | eval ${PAGER-more} fi if test -t; then FIRST=0 fi done fi 0707010000cef1000081ed0000000200000002000000013560703b00000db4000000660000000300000000000000000000000f00000004reloc/bin/znew#!/bin/sh PATH="/usr/local/bin:$PATH"; export PATH check=0 pipe=0 opt= files= keep=0 res=0 old=0 new=0 block=1024 # block is the disk block size (best guess, need not be exact) warn="(does not preserve modes and timestamp)" tmp=/tmp/zfoo.$$ echo hi > $tmp.1 echo hi > $tmp.2 if test -z "`(${CPMOD-cpmod} $tmp.1 $tmp.2) 2>&1`"; then cpmod=${CPMOD-cpmod} warn="" fi if test -z "$cpmod" && ${TOUCH-touch} -r $tmp.1 $tmp.2 2>/dev/null; then cpmod="${TOUCH-touch}" cpmodarg="-r" warn="(does not preserve file modes)" fi # 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 for arg do case "$arg" in -*) opt="$opt $arg"; shift;; *) break;; esac done if test $# -eq 0; then echo "recompress .Z files into $ext (gzip) files" echo usage: `echo $0 | sed 's,^.*/,,'` "[-tv9KP]" file.Z... echo " -t tests the new files before deleting originals" echo " -v be verbose" echo " -9 use the slowest compression method (optimal compression)" echo " -K keep a .Z file when it is smaller than the $ext file" echo " -P use pipes for the conversion $warn" exit 1 fi opt=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'` case "$opt" in *t*) check=1; opt=`echo "$opt" | sed 's/t//g'` esac case "$opt" in *K*) keep=1; opt=`echo "$opt" | sed 's/K//g'` esac case "$opt" in *P*) pipe=1; opt=`echo "$opt" | sed 's/P//g'` esac if test -n "$opt"; then opt="-$opt" fi for i do n=`echo $i | sed 's/.Z$//'` if test ! -f "$n.Z" ; then echo $n.Z not found res=1; continue fi test $keep -eq 1 && old=`wc -c < "$n.Z"` if test $pipe -eq 1; then if gzip -d < "$n.Z" | gzip $opt > "$n$ext"; then # Copy file attributes from old file to new one, if possible. test -n "$cpmod" && $cpmod $cpmodarg "$n.Z" "$n$ext" 2> /dev/null else echo error while recompressing $n.Z res=1; continue fi else if test $check -eq 1; then if cp -p "$n.Z" "$n.$$" 2> /dev/null || cp "$n.Z" "$n.$$"; then : else echo cannot backup "$n.Z" res=1; continue fi fi if gzip -d "$n.Z"; then : else test $check -eq 1 && mv "$n.$$" "$n.Z" echo error while uncompressing $n.Z res=1; continue fi if gzip $opt "$n"; then : else if test $check -eq 1; then mv "$n.$$" "$n.Z" && rm -f "$n" echo error while recompressing $n else # compress $n (might be dangerous if disk full) echo error while recompressing $n, left uncompressed fi res=1; continue fi fi test $keep -eq 1 && new=`wc -c < "$n$ext"` if test $keep -eq 1 -a `expr \( $old + $block - 1 \) / $block` -lt \ `expr \( $new + $block - 1 \) / $block`; then if test $pipe -eq 1; then rm -f "$n$ext" elif test $check -eq 1; then mv "$n.$$" "$n.Z" && rm -f "$n$ext" else gzip -d "$n$ext" && compress "$n" && rm -f "$n$ext" fi echo "$n.Z smaller than $n$ext -- unchanged" elif test $check -eq 1; then if gzip -t "$n$ext" ; then rm -f "$n.$$" "$n.Z" else test $pipe -eq 0 && mv "$n.$$" "$n.Z" rm -f "$n$ext" echo error while testing $n$ext, $n.Z unchanged res=1; continue fi elif test $pipe -eq 1; then rm -f "$n.Z" fi done exit $res 0707010000cef2000041ed00000000000000010000000235609ade00000000000000660000000300000000000000000000000f00000004reloc/doc.gzip0707010000cef3000081a4000000020000000200000001356077fa0000463e000000660000000300000000000000000000001700000004reloc/doc.gzip/COPYING GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. 0707010000cef4000081a4000000020000000200000001356077fa000066c8000000660000000300000000000000000000001900000004reloc/doc.gzip/ChangeLogWed Aug 18 09:34:23 1993 Jean-loup Gailly (jloup@chorus.fr) * version 1.2.4 By default, do not restore file name and timestamp from those saved inside the .gz file (behave as 'compress'). Added the --name option to force name and timestamp restoration. Accept - as synonym for stdin. Use manlinks=so or ln to support either hard links or .so in man pages Accept foo.gz~ in zdiff. Added support for Windows NT Handle ENAMETOOLONG for strict Posix systems Use --recursive instead of --recurse to comply with Webster and the GNU stdandard. Allow installation of shell scripts with a g prefix: make G=g install Install by default zcat as gzcat if gzcat already exists in path. Let zmore behave as more when invoked without parameters (give help) Let gzip --list reject files not in gzip format even with --force. Don't complain about non gzip files for options -rt or -rl. Added advice in INSTALL for several systems. Added makefile entries for NeXTstep 3.1 (if configure fails) Avoid problem with memcpy on Pyramid (gave crc error on some files) Support the -r option when compiled with Borland C++ on msdos. Force lower case file names only for FAT file systems (not HPFS) Rewrite one expression in inflate.c to avoid cc bug on Solaris x86. In the msdos makefiles, get match.asm from the msdos subdirectory. Catch SIGTERM and SIGHUP only if they are not ignored. getopt.c: on Amiga, "#if !defined(const)" does not compile. Use register parameters on Amiga. Do not force names to lower case on Amiga. Fix support of Atari TOS (Makefile.st and tailor.h) In unlzw.c, do not suggest using zcat if zcat already used. In INSTALL, suggest using bsdinst for HPUX. Document Turbo C++ 1.0 bug in INSTALL. Improved the documentation relative to the --no-name option. Avoid signed/unsigned warnings in several files. Added pointer to jka-compr19.el in README. Added pointer to OS/2 executables in README. Added --block-compress in tar -z example (gzip.1 and gzip.texi). Don't keep rcsid in executable (avoid compilation warnings). Check also the correctness of the first byte of an .Z file. Return non zero status for an invalid option. Remove "NEWFILES" from os2/gzip.def for Borland C++ on OS/2. Remove "time stamp restored" message (just obey the -N request). Thu Jun 24 10:27:57 1993 Jean-loup Gailly (jloup@chorus.fr) * version 1.2.3 Don't display the output name when decompressing except with --verbose. Remove usage of alloca in getopt.c and all makefiles. Use ASCPP instead of CPP to avoid breaking AC_HEADER_CHECK on RiscOS. Added the zfile shell script in subdirectory sample. Moved the list of compiler bugs from README to INSTALL. Added vms/Readme.vms. Fix DIST_BUFSIZE check in unlzh.c for 16 bit machines. Fix REGSIGTYP macro in configure.in. Use 'define' instead of == in vms/gzip.hlp. Avoid warnings in unlzh.c Allow separate installation of binaries and man pages. Simplified handling of file names with spaces in zgrep and znew. Fix dependencies and remove rule for trees.c in amiga/Makefile.sasc Add missing quote in gzexe. 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) * version 1.1.1 Fix serious bug in vms.c (== instead of =). Added --ascii option. Add workaround in configure.in for Ultrix (quote eval argument) Do not use unset in znew (not supported on Ultrix) Use tar.gz instead of tar.z for the distribution of gzip. Add missing menu item in gzip.texi. Use size_t instead of unsigned, add AC_SIZE_T in configure.in. Fri May 28 11:40:01 1993 Jean-loup Gailly (jloup@chorus.fr) * version 1.1 Use .gz suffix by default, add --suffix option. Let gunzip accept a "_z" suffix (used by one 'compress' on Vax/VMS). Quit when reading garbage from stdin instead of reporting an error. Added sub.c and add.c for compression of 8 bit images. Added makefile for VAX/MMS and support for wildcards on VMS. Added support for MSC under OS/2. Added support for Prime/PRIMOS. Display compression ratio also when decompressing. Quit after --version (GNU standard) Use --force to bypass isatty() check. Accept --silent as synonym for --quiet (see longopts.table) Accept --to-stdout as synonym for --stdout (see longopts.table) Accept -H and -? in addition to -h and --help. Added comparison of zip and gzip in the readme file. Return an error code in all main compression/decompression functions. Continue processing other files in case of recoverable error. Add description of -f in znew.1. Do not keep uncompressed version for znew -t if .gz already exists. On Unix, use only st_ino and st_dev in same_file(). Use S_IRUSR and S_IWUSR if they exist. "test $1 = -d" -> "test x$1 = x-d" in gzexe. In match.S, use symbol sysV68 to detect the Motorola Delta. Do not include memory.h with gcc (conflicting declarations on Sun). Fix more typos. On VMS, define unlink as delete also for gcc. In "make check", unset LANG because "wc -c" fails on Kanji. Renamed shdir as scriptdir. Use the 68020 code instead of 68000 code on the NeXT. Documented --uncompress as synonym for --decompress. Include the standard header files before gzip.h (needed on Bull). Do not assume that _POSIX_VERSION implies dirent.h present. Removed gzip-tar.patch since tar 1.11.2 handles gzip directly. Use less memory when compiled with -DSMALL_MEM (for MSDOS). Optimized updcrc(). Don't complain if cc -E does not work correctly. Do not attempt reading 64K bytes on 16 bit Unix systems. Do not use the variable name 'overhead' which is reserved on Lynx! One BULL compiler does not like *p++ in inflate.c => *p, p++. Use casts on free and memcmp to avoid warnings. Remove the "off by more than one minute" time stamp kludge, but document how to avoid saving the time stamp on pipes if desired. Include crypt.h in inflate.c (one system predefines the CRYPT symbol). Add links to gunzip and (g)zcat in the default make rule. Create installation directories if they do not exist. Clarified --prefix option in INSTALL. Use symbol mc68k in match.S for the DIAB DS90. Guard against zero length _match.s in configure.in. In zmore, restore all tty options using stty -g. Added support for MacOS Simplified makecrc.c. Avoid warnings in getopt.c, util.c, unlzw.c. Use autoconf 1.4, in particular for INSTALL and AC_HAVE_POUNDBANG Use .so instead of hard links for zcat.1, gunzip.1 and zcmp.1. Fixed declration of sig_type. Make consistency check in fcfree. Added ztouch. Do not complain if utime fails on a directory (for OS/2). Thu Mar 18 18:56:43 1993 Jean-loup Gailly (jloup@chorus.fr) * version 1.0.7 Allow zmore to read from standard input (like more). Support the 68000 (Atari ST) in match.S. Retry partial writes (required on Linux when gzip is suspended in a pipe). Allow full pathnames and renamings in gzexe. Don't let gzexe compress setuid executables or gzip itself. Added vms/Makefile.gcc for gcc on the Vax. Give a pointer to Solaris and VMS executables of gzip in README. Allow installation of binaries and shell scripts in different dirs. Do not use alloca on the Cray. Provide strspn and strcspn if string.h does not exist. Define O_CREAT and O_EXCL from FCREAT and FEXCL if necessary. Remove gzip.doc in make realclean. Fixed many typos. (Corrections to my English are welcome.) Put "make manext=l install" at the correct place in INSTALL. Fix incorrect examples in INSTALL and give more examples. Include zdiff.1 for install and uninstall. Allows complex PAGER variable in zmore (e.g.: PAGER="col -x | more") Avoid warning on unused indfound in getopt.c. Cast memset arg to void* (required by some buggy compilers). Include sys/types.h before dirent.h in acgeneral.m4. Fix acgeneral.m4 AC_COMPILE_CHECK to avoid warnings. Don't use alloca.c with gcc. (One NeXT user did not have alloca.h). Change all error messages according to GNU standards. Restore time stamp only if off by more than one minute. Allow installation of zcat as gzcat. Suppress help message and send compressed data to the terminal when gzip is invoked without parameters and without redirection. (Explicit request from Noah Friedman.) Add compile option GNU_STANDARD to respect the GNU coding standards: with -DGNU_STANDARD, behave as gzip even if invoked under the name gunzip. (Complaints to /dev/null or the FSF, not to me!) Fri Mar 10 13:27:18 1993 Jean-loup Gailly (jloup@chorus.fr) * version 1.0.6 Let gzexe detect executables that are already gzexe'd. Don't try restoring record format on VMS (the simple 1.0.5 code worked correctly only on fixed-512 files). Suppress text_mode. Added asm version for 68000 in amiga/match.a. Use asm version for Atari TT. Fix "make clean" in vms/Makefile.vms. For OS/2, assume HPFS by default, add flag OS2FAT if necessary. Fixed some bugs in zdiff and define zcmp as a link to zdiff. Added zdiff.1 Remove configure hack for NeXT; add general fix to autoconf instead Do not strip a ".z" extension if this results in an empty name. Avoid array overflow in get_prefix() for extensions > 10 chars. Accept either q or e to quit zmore. In zmore, try restoring tty mode in all cases. Use Motorola style for match.S on the NeXT. configure.in: unsetenv *hangs* with the Siemens csh... Update vms/gzip.hlp. Thu Mar 4 14:13:34 1993 Jean-loup Gailly (jloup@chorus.fr) * version 1.0.5 For VMS, restore the file type for variable record format, otherwise extract in fixed length format (not perfect, but better than forcing all files to be in stream_LF format). Use "-z" suffix for VMS. Use only .z, .*-z, .tgz, .taz as valid gzip extensions; update zforce accordingly. Allow a version number in input file names for VMS. Added sample program zread.c. Fix "make check" for some implementations of /bin/sh. Don't rely on stat() for filenames with extension > 3 chars on MSDOS, OS2 and Atari. Garbage collect files in /tmp created by gzexe. Quote $opt in znew. Use TOUCH env variable in znew if it exists. Better error message for gunzip on empty or truncated file. Allow prototypes in getopt.h when __STDC__ defined but 0. Added "make clean" in vms/Makefile.vms. Removed -g from default CFLAGS (with Noah's permission!) Avoid too many HAVE_xxx_H for most systems; use common defaults. Moved default Atari flags into tailor.h for consistency. Use memzero() to clear the hash table. Update vms/gzip.hlp to reflect the VMS behavior. Fix OS_CODE (to fit in a byte). Add utime.h for the Amiga. Add gcc support for the Amiga. Work around incorrect dirent.h for NeXT 2.0. Added Makefile entry for Coherent. Fri Feb 22 11:20:49 1993 Jean-loup Gailly (jloup@chorus.fr) * version 1.0.4 Added optimized asm version for 68020. Add support for DJGPP. Add support for the Atari ST. Added zforce to rename gzip'ed files with truncated names. Do not install with name uncompress (some systems rely on the absence of any check in the old uncompress). Added missing function (fcfree) in msdos/tailor.c Let gunzip handle .tgz files, and let gzip skip them. Added 'stty min 1' in zmore for SysV and fixed trap code. Suppress .PHONY in Makefile.in, which breaks old makes. Added documentation about pcat and unpack in INSTALL. Add cast to getenv for systems without stdlib.h. Use VAXC instead of VMS to avoid confusion for gcc. Add -K to znew.1. Add gzexe.1. Try preserving file permissions in gzexe. Added -d option for gzexe. Guard against spaces in file names in gzexe. Use CMP env. variable in zcmp. Return a warning exit status for gzip of file with .z suffix. Suppress usage of d_ino which is not portable to all systems. Use #ifdef instead of #if for consistency. For VMS, use "cc util.c" instead of "cc util" (pb with logical names) Added utime() for Amiga. Renamed gzcat.1 as zcat.1. Include fcntl.h for Amiga (for read and write). For VMS, add definition of symbols and links in the makefiles. Give a VMS look to vms/gzip.hlp. Save the original name only when necessary. Add a mode parameter for open in read mode (required by VMS). For VMS, remove the version suffix from the original name. Accept both / and \ as path separator for MSDOS. Let gunzip extract stored .zip files correctly. Added warning about VFC format in vms/gzip.hlp. In znew, skip a bad file but process the others. Cleanup tailor.h. Use GZIP_OPT for VMS to avoid conflict with program name. Added description of GZIP variable in gzip.texi. Thu Feb 11 17:21:32 1993 Jean-loup Gailly (jloup@chorus.fr) * version 1.0.3 Add -K option for znew to keep old .Z files if smaller. Add -q option (quiet) to cancel -v in GZIP env variable. For Turbo C, normalize pointers before freeing them. Add more safety checks in add_envopt(). Add do_exit() for uniform exit path (always free memory). Reduce MAX_PATH_LEN for MSDOS. Include sys/types.h before signal.h Avoid strdup, the NeXT does not have it. Made gzexe safer on systems with filename limitation to 14 chars. Fri Feb 10 09:45:49 1993 Jean-loup Gailly (jloup@chorus.fr) * version 1.0.2 Added env variable GZIP for default options. Added support for the Amiga. znew now keeps the old .Z if it is smaller than the .z file. Added gzexe to compress rarely used executables. Reduce memory usage when using static allocation (no DYN_ALLOC). Better separation of warning and error return codes. Fix unlzw.c to make DYN_ALLOC and MAXSEG_64K independent options. Allow INBUFSIZ to be >= 32K in unlzw (don't use sign of rsize) Generate tar file in old format to avoid problems with old systems. Preserve time stamp in znew -P if touch -r works. Use ${PAGER-more} instead of ${PAGER:-more} in zmore. Do not use unsigned instead of mode_t. Better error message for trailing garbage in .z file; ignore this garbage on VMS. In zmore, use icanon instead of -cbreak on SYSV. Add trap handler in zmore. Use char* instead of void* for non STDC compilers. Added makefile entry for Xenix on 286. Return an error code when existing file was not overwritten. Use prototype of lzw.h for lzw.c. Fix znew with -P option alone. Give warning for directories even without -v. Close output file before unlink() in case of error. Suppress all target dependent ifdef from the portable files. Free all dynamically allocated variables upon exit. Thu Feb 4 18:23:56 1993 Jean-loup Gailly (jloup@chorus.fr) * version 1.0.1 Fixed some trivial errors in msdos/Makefile.bor Thu Feb 4 10:00:59 1993 Jean-loup Gailly (jloup@chorus.fr) * version 1.0 gzip now runs on Vax/VMS (Amiga support will come in next version). Do not overwrite files without -f when using /bin/sh. Support the test option -t for compressed (.Z) files. Flush output for bad compressed files. Add warning in README. Added makefiles for MSDOS. Don't rely on presence of csh in configure Added gunzip.1 and gzcat.1. Updated znew.1. Check reserved flags in unlzw(). Return dummy value in main to avoid lint warning. Define OF in lzw.h for lint. Allow both "znew -v -t" and "znew -vt". Don't overwrite the output file name for multiple parts. Echo just a warning if configure is out of date. Use ; instead of , in trees.c (confuses the SAS Amiga compiler). In INSTALL, document "DEFS='-DM_XENIX' ./configure". Use OTHER_PATH_SEP for more portability (DOS, OS2, VMS, AMIGA). Make all directories world writable for broken versions of tar. Use gzip -cd instead of zcat in zmore, zcmp, zdiff. Don't use GNU tar for distributions, some systems can't untar. Do not exit() for gzip --version. Mon Jan 26 10:26:42 1993 Jean-loup Gailly (jloup@chorus.fr) * Beta version 0.8.2 Avoid 'far' declarations for MSDOS. Use test -f instead of test -x in configure.in (for Ultrix) Add empty else part to if in Makefile.in for broken shells. Use NO_UNDERLINE instead of UNDERLINE (pb with Linux cpp) Accept continuation files with -ff (for damage recovery) Small patch to Makefile.os2 Use memzero instead of bzero to avoid potential conflicts Document restriction on extraction of zip files. Fix quoting in ACL_HAVE_SHELL_HACK. Do not check file size on MSDOS because of bug in DIET. Allow zcat on a file with multiple links. Add fix in inflate.c for compatibility with pkzip 2.04c. Release gzip in tar.z and tar format. (No tar.Z). Fri Jan 22 10:04:13 1993 Jean-loup Gailly (jloup@chorus.fr) * Beta version 0.8.1 Fixed Makefile.os2 Fixed #if directives that TurboC does not like. Don't rely on uncompress in znew, use gzip -d. Add the pipe option -P in znew. Add some more ideas in TODO. Support both NDIR and SYSNDIR. Sat Jan 21 15:46:38 1993 Jean-loup Gailly (jloup@chorus.fr) * Beta version 0.8 Support unpack. Check for _match.o in configure.in in addition to return status. Include in zip.c Define local variables and functions as local. Accept more alternative names for the program (pcat, gzcat, ...). Accept .exe as well as .EXE. Uncompress files with multiple links only with -f. Better error message for gunzip of non-existent file.z. Fix the entry for /etc/magic in INSTALL. Use AC_HAVE_HEADERS uniformly instead of special macros. Install the man pages as .1 by default instead of .l. Document crypt++.el in README. Fix for unlzw() on 16-bit machines (bitmask must be unsigned). Complain if input and output files are identical. Create a correct output name for files of exactly 13 chars. Do not overwrite CPP if set Check for i386 before trying to assemble match.s Check for underline in external name before assembling Add patch for tar 1.11.1. Mon Jan 5 10:16:24 1993 Jean-loup Gailly (jloup@chorus.fr) * Beta version 0.7 Use "make check" instead of "make test". Do not rely on dirname in znew. Keep time stamp and pass options to gzip in znew. Rename .l files back to .1 to avoid conflict with lex Do not create .z.z files with gzip -r. Use nice_match in match.asm Unroll loops in deflate.c Do not attempt matches beyond the window end Allow again gunzip .zip files (was working in 0.5) Allow again compilation with TurboC 2.0 (was working in 0.4) Tue Dec 30 20:00:19 1992 Jean-loup Gailly (jloup@chorus.fr) * Beta version 0.6 The .z extension is used by pack, not compact (README, gzip.1) Accept gzcat in addition to zcat. Use PAGER in zmore if defined. Man pages for /usr/local/man/manl should have extension .l. Don't redefine bzero on the NeXT Allow incomplete Huffman table if there is only one code. Don't lookahead more than 7 bits (caused premature EOF). Added "make test" to check for compiler bugs. Don't rely on `i386`; try to assemble directly Change magic header to avoid conflict with freeze 1.x. Added entry for /etc/magic in INSTALL. Do not destroy an input .zip file with more than one member. Display "untested" instead of "OK" for gzip -t foo.Z With -t, skip stdin in .Z format Allow multiple compressed members in an input file. Ignore a zero time stamp. Made znew safer. Tue Dec 29 10:00:19 1992 Noah Friedman (friedman@gnu.ai.mit.edu) Added test for #!/bin/sh in configure.in. Fix some references to $srcdir in Makefile.in Mon Dec 21 17:33:35 1992 Jean-Loup Gailly (jloup@chorus.fr) * Beta version 0.5 Put RCS ids in all files. Added znew to recompress old .Z files with gzip. Avoid "already .z suffix" messages for -r and no -v. Put back check for d_ino in treat_dir(). Use HAVE_STRING_H instead of USG. Added os2/Makefile.os2 Use SYSUTIME on OS/2. Info dir is $(prefix)/info, not $(prefix)/lib/info. Support long options, added getopt and alloca Support -V and -t Reorder configure.in according to suggestions in autoconf.info Allow links when not removing original file Allow either .z or .Z in zdiff Wed Nov 25 11:40:04 1992 Jean-loup Gailly (jloup@chorus.fr) * Beta version 0.4.1 Save only the original base name, don't include any directory prefix. Don't use HAVE_LONG_FILE_NAMES (support multiple file system types). Fix declaration of abort_gzip in gzip.h. Include unistd.h when it exists to avoid warnings with gcc -Wall. Mon Nov 23 12:39:01 1992 Jean-loup Gailly (jloup@chorus.fr) * Beta version 0.4 Lots of cleanup Use autoconf generated 'configure' Fixed the NO_MULTIPLE_DOTS code Fixed the save_orig_name code Support for MSDOS (Turbo C) Thu Nov 19 15:18:22 1992 Jean-loup Gailly (jloup@chorus.fr) * Beta version 0.3 Added auto configuration. Just type "make" now. Don't overwrite compress by default in "make install". Use "make install_compress" to overwrite. Add match.s for 386 boxes. Added documentation in texinfo format. Provide help for "gunzip" invoked without redirected input. Save original file name when necessary. Support OS/2 (Kai-Uwe Rommel). Tue Nov 17 14:32:53 1992 Jean-loup Gailly (jloup@chorus.fr) * Alpha version 0.2.4 Return 0 in get_istat() when ok (caused error with zcat). Don't update crc on compressed data (caused crc errors on large files). Fri Nov 13 15:04:12 1992 Jean-loup Gailly (jloup@chorus.fr) * Alpha version 0.2.3 Initialize rsize in unlzw.c Initialize ofd for zcat. Do not use volatile ifname as argument of treat_dir. Add -1 to -9 in gzip.1. Sat Oct 31 18:30:00 1992 Jean-loup Gailly (jloup@chorus.fr) * Alpha version 0.2.2. Fix error messages. Accept gunzip on zip files. Sat Oct 31 17:15:00 1992 Jean-loup Gailly (jloup@chorus.fr) * Alpha version 0.2.1 Use ctype.h in util.c (problem on SysV). Create BINDIR if it does not exist. Use cc by default. Added zcmp, zmore, zdiff. Fixed the man page gzip.1. Sat Oct 31 17:00:00 1992 Jean-loup Gailly (jloup@chorus.fr) * Alpha version 0.2 Fixed compilation problems with gcc Sat Oct 31 12:46:00 1992 Jean-loup Gailly (jloup@chorus.fr) * Alpha version 0.1 released (under time pressure), so it's not much tested, sorry. 0707010000cef5000081a4000000020000000200000001356077fa000026ef000000660000000300000000000000000000001400000004reloc/doc.gzip/NEWSCurrent Version: 1.2.4. See the file ChangeLog for the details of all changes. Major changes from 1.2.3 to 1.2.4 * By default, do not restore file name and timestamp from those saved inside the .gz file (behave as 'compress'). Added the --name option to force name and timestamp restoration. * Accept - as synonym for stdin. * Use manlinks=so or ln to support either hard links or .so in man pages * Accept foo.gz~ in zdiff. * Added support for Windows NT * Handle ENAMETOOLONG for strict Posix systems * Use --recursive instead of --recurse to comply with Webster and the GNU stdandard. * Allow installation of shell scripts with a g prefix: make G=g install * Install by default zcat as gzcat if gzcat already exists in path. * Let zmore behave as more when invoked without parameters (give help) * Let gzip --list reject files not in gzip format even with --force. * Don't complain about non gzip files for options -rt or -rl. * Added advice in INSTALL for several systems. Major changes from 1.2.2 to 1.2.3 * Don't display the output name when decompressing except with --verbose. * Remove usage of alloca in getopt.c and all makefiles. * Added the zfile shell script in subdirectory sample. * Moved the list of compiler bugs from README to INSTALL. * Added vms/Readme.vms. Major changes from 1.2.1 to 1.2.2 * 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. * Fix serious bug in vms.c (affects Vax/VMS only). * Added --ascii option. * Add workaround in configure.in for Ultrix (quote eval argument) Major changes from 1.0.7 to 1.1. * Use .gz suffix by default, add --suffix option. * Let gunzip accept a "_z" suffix (used by one 'compress' on Vax/VMS). * Quit when reading garbage from stdin instead of reporting an error. * Added makefile for VAX/MMS and support for wildcards on VMS. * Added support for MSC under OS/2. * Added support for Prime/PRIMOS. * Display compression ratio also when decompressing (with --verbose). * Quit after --version (GNU standard) * Use --force to bypass isatty() check * Continue processing other files in case of recoverable error. * Added comparison of zip and gzip in the readme file. * Added small sample programs (ztouch, sub, add) * Use less memory when compiled with -DSMALL_MEM (for MSDOS). * Remove the "off by more than one minute" time stamp kludge Major changes from 1.0.6 to 1.0.7. * Allow zmore to read from standard input (like more). * Support the 68000 (Atari ST) in match.S. * Retry partial writes (required on Linux when gzip is suspended in a pipe). * Allow full pathnames and renamings in gzexe. * Don't let gzexe compress setuid executables or gzip itself. * Added vms/Makefile.gcc for gcc on the Vax. * Allow installation of binaries and shell scripts in different dirs. * Allows complex PAGER variable in zmore (e.g.: PAGER="col -x | more") * Allow installation of zcat as gzcat. * Several small changes for portability to old or weird systems. * Suppress help message and send compressed data to the terminal when gzip is invoked without parameters and without redirection. * Add compile option GNU_STANDARD to respect the GNU coding standards: with -DGNU_STANDARD, behave as gzip even if invoked under the name gunzip. (I don't like the last two changes, which were requested by the FSF.) Major changes from 1.0.5 to 1.0.6. * Let gzexe detect executables that are already gzexe'd. * Keep file attributes in znew and gzexe if cpmod is available. * Don't try restoring record format on VMS (1.0.5 did not work correctly) * Added asm version for 68000 in amiga/match.a. Use asm version for Atari TT and NeXT. * For OS/2, assume HPFS by default, add flag OS2FAT if necessary. * Fixed some bugs in zdiff and define zcmp as a link to zdiff. Major changes from 1.0.4 to 1.0.5. * For VMS, restore the file type for variable record format, otherwise extract in fixed length format (not perfect, but better than forcing all files to be in stream_LF format). * For VMS, use "-z" default suffix and accept a version number in file names. * For Unix, allow compression of files with name ending in 'z'. Use only .z, .*-z, .tgz, .taz as valid gzip extensions. In the last two cases, extract to .tar by default. * On some versions of MSDOS, files with a 3 character extension could not be compressed. * Garbage collect files in /tmp created by gzexe. * Fix the 'OS code' byte in the gzip header. * For the Amiga, add the missing utime.h and add support for gcc. Major changes from 1.0.3 to 1.0.4. * Added optimized asm version for 68020. * Add support for DJGPP. * Add support for the Atari ST. * Added zforce to rename gzip'ed files with truncated names. * Do not install with name uncompress (some systems rely on the absence of any check in the old uncompress). * Added missing function (fcfree) in msdos/tailor.c * Let gunzip handle .tgz files, and let gzip skip them. * Added -d option (decompress) for gzexe and try preserving file permissions. * Suppress all warnings with -q. * Use GZIP_OPT for VMS to avoid conflict with program name. * ... and many other small changes (see ChangeLog) Major changes from 1.0.2 to 1.0.3 * Added -K option for znew to keep old .Z files if smaller * Added -q option (quiet) to cancel -v in GZIP env variable. * Made gzexe safer on systems with filename limitation to 14 chars. * Fixed bugs in handling of GZIP env variable and incorrect free with Turbo C. Major changes from 1.0.1 to 1.0.2 * Added env variable GZIP for default options. Example: for sh: GZIP="-8 -v"; export GZIP for csh: setenv GZIP "-8 -v" * Added support for the Amiga. * znew now keeps the old .Z if it is smaller than the .z file. This can happen for some large and very redundant files. * Do not complain about trailing garbage for record oriented IO (Vax/VMS). This implies however that multi-part gzip files are not supported on such systems. * Added gzexe to compress rarely used executables. * Reduce memory usage (required for MSDOS and useful on all systems). * Preserve time stamp in znew -P (pipe option) if touch -r works. Major changes from 1.0 to 1.0.1 * fix trivial errors in the Borland makefile (msdos/Makefile.bor) Major changes from 0.8.2 to 1.0 * gzip now runs on Vax/VMS * gzip will not not overwrite files without -f when using /bin/sh in background. * Support the test option -t for compressed (.Z) files. Allow some data recovery for bad .Z files. * Added makefiles for MSDOS (Only tested for MSC, not Borland). * still more changes to configure for several systems Major changes from 0.8.1 to 0.8.2: * yet more changes to configure for Linux and other systems * Allow zcat on a file with multiple links. Major changes from 0.8 to 0.8.1: * znew has now a pipe option -P to reduce the disk space requirements, but this option does not preserve timestamps. * Fixed some #if directives for compilation with TurboC. Major changes from 0.7 to 0.8: * gzip can now extract .z files created by 'pack'. * configure should no longer believe that every machine is a 386 * Fix the entry for /etc/magic in INSTALL. * Add patch for GNU tar 1.11.1 and a pointer to crypt++.el * Uncompress files with multiple links only with -f. * Fix for uncompress of .Z files on 16-bit machines * Create a correct output name for file names of exactly N-1 chars when the system has a limit of N chars. Major changes from 0.6 to 0.7: * Use "make check" instead of "make test". * Keep time stamp and pass options to gzip in znew. * Do not create .z.z files with gzip -r. * Allow again gunzip .zip files (was working in 0.5) * Allow again compilation with TurboC 2.0 (was working in 0.4) Major changes form 0.5 to 0.6: * gunzip reported an error when extracting certain .z files. The .z files produced by gzip 0.5 are correct and can be read by gunzip 0.6. * gunzip now supports multiple compressed members within a single .z file. * Fix the check for i386 in configure. * Added "make test" to check for compiler bugs. (gcc -finline-functions is broken at least on the NeXT.) * Use environment variable PAGER in zmore if it is defined. * Accept gzcat in addition to zcat for people having /usr/bin before /usr/local/bin in their path. 0707010000cef6000081a4000000020000000200000001356077fa00001c83000000660000000300000000000000000000001600000004reloc/doc.gzip/READMEThis is the file README for the gzip distribution, version 1.2.4. gzip (GNU zip) is a compression utility designed to be a replacement for 'compress'. Its main advantages over compress are much better compression and freedom from patented algorithms. The GNU Project uses it as the standard compression program for its system. gzip currently uses by default the LZ77 algorithm used in zip 1.9 (the portable pkzip compatible archiver). The gzip format was however designed to accommodate several compression algorithms. See below for a comparison of zip and gzip. gunzip can currently decompress files created by gzip, compress or pack. The detection of the input format is automatic. For the gzip format, gunzip checks a 32 bit CRC. For pack, gunzip checks the uncompressed length. The 'compress' format was not designed to allow consistency checks. However gunzip is sometimes able to detect a bad .Z file because there is some redundancy in the .Z compression format. If you get an error when uncompressing a .Z file, do not assume that the .Z file is correct simply because the standard uncompress does not complain. This generally means that the standard uncompress does not check its input, and happily generates garbage output. gzip produces files with a .gz extension. Previous versions of gzip used the .z extension, which was already used by the 'pack' Huffman encoder. gunzip is able to decompress .z files (packed or gzip'ed). Several planned features are not yet supported (see the file TODO). See the file NEWS for a summary of changes since 0.5. See the file INSTALL for installation instructions. Some answers to frequently asked questions are given in the file INSTALL, please read it. (In particular, please don't ask me once more for an /etc/magic entry.) WARNING: on several systems, compiler bugs cause gzip to fail, in particular when optimization options are on. See the section "Special targets" at the end of the INSTALL file for a list of known problems. For all machines, use "make check" to check that gzip was compiled correctly. Try compiling gzip without any optimization if you have a problem. Please send all comments and bug reports by electronic mail to: Jean-loup Gailly or, if this fails, to bug-gnu-utils@prep.ai.mit.edu. Bug reports should ideally include: * The complete output of "gzip -V" (or the contents of revision.h if you can't get gzip to compile) * The hardware and operating system (try "uname -a") * The compiler used to compile (if it is gcc, use "gcc -v") * A description of the bug behavior * 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 file from emacs. It recognizes automatically encrypted and compressed files when they are first visited or written. It is available via anonymous ftp to roebling.poly.edu [128.238.5.31] in /pub/crypt++.el. The same directory contains also patches to dired, ange-ftp and info. GNU tar 1.11.2 has a -z option to invoke directly gzip, so you don't have to patch it. The package ftp.uu.net:/languages/emacs-lisp/misc/jka-compr19.el.Z also supports gzip'ed files. The znew and gzexe shell scripts provided with gzip benefit from (but do not require) the cpmod utility to transfer file attributes. It is available by anonymous ftp on gatekeeper.dec.com in /.0/usenet/comp.sources.unix/volume11/cpmod.Z. The sample programs zread.c, sub.c and add.c in subdirectory sample are provided as examples of useful complements to gzip. Read the comments inside each source file. The perl script ztouch is also provided as example (not installed by default since it relies on perl). gzip is free software, you can redistribute it and/or modify it under the terms of the GNU General Public License, a copy of which is 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 mirror sites: - sources in gzip-*.tar (or .shar or .tar.gz). - Solaris 2 executables in sparc-sun-solaris2/gzip-binaries-*.tar - 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. gzip386.exe runs much faster but only on 386 and above; it is compiled with djgpp 1.10 available in directory omnigate.clarkson.edu:/pub/msdos/djgpp. A VMS executable is available in ftp.spc.edu:[.macro32.savesets]gzip-1-*.zip (use [.macro32]unzip.exe to extract). A PRIMOS executable is available in ftp.lysator.liu.se:/pub/primos/run/gzip.run. OS/2 executables (16 and 32 bits versions) are available in ftp.tu-muenchen.de:/pub/comp/os/os2/archiver/gz*-[16,32].zip Some ftp servers can automatically make a tar.Z from a tar file. If you are getting gzip for the first time, you can ask for a tar.Z file instead of the much larger tar file. Many thanks to those who provided me with bug reports and feedback. See the files THANKS and ChangeLog for more details. Note about zip vs. gzip: The name 'gzip' was a very unfortunate choice, because zip and gzip are two really different programs, although the actual compression and decompression sources were written by the same persons. A different name should have been used for gzip, but it is too late to change now. zip is an archiver: it compresses several files into a single archive file. gzip is a simple compressor: each file is compressed separately. Both share the same compression and decompression code for the 'deflate' method. unzip can also decompress old zip archives (implode, shrink and reduce methods). gunzip can also decompress files created by compress and pack. zip 1.9 and gzip do not support compression methods other than deflation. (zip 1.0 supports shrink and implode). Better compression methods may be added in future versions of gzip. zip will always stick to absolute compatibility with pkzip, it is thus constrained by PKWare, which is a commercial company. The gzip header format is deliberately different from that of pkzip to avoid such a constraint. 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" compresses better than zip, since gzip can then take advantage of redundancy between distinct files. The drawback is that you must 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 is no overhead when you extract the whole archive anyway. If a member of a .zip archive is damaged, other files can still be recovered. If a .tar.gz file is damaged, files beyond the failure point cannot be recovered. (Future versions of gzip will have error recovery features.) gzip and gunzip are distributed as a single program. zip and unzip are, for historical reasons, two separate programs, although the authors of these two programs work closely together in the info-zip team. zip and unzip are not associated with the GNU project. The sources are available by ftp in oak.oakland.edu:/pub/misc/unix/zip19p1.zip oak.oakland.edu:/pub/misc/unix/unz50p1.tar-z 0707010000cef7000081a4000000020000000200000001356077fa000032ed000000660000000300000000000000000000001600000004reloc/doc.gzip/THANKSgzip was written by Jean-loup Gailly , with portions written by Mark Adler (inflate.c), Peter Jannesen (unlzw.c) and Haruhiko Okumura (unlzh.c). The zip deflate format was defined by Phil Katz. Thanks to those who reported problems and suggested various improvements. Here is a partial list of them: Robert Abramovitz bromo@cougar.tandem.com Jay Adams jka@ece.cmu.edu Mark Adler madler@cco.caltech.edu Edwin Allum edwin@csri.toronto.edu Joseph Arceneaux jla@gnu.ai.mit.edu Tim Auckland tda10@cus.cam.ac.uk Ken-ichiro Aoki aoki@madonna.physics.ucla.edu David Ascher da@marlowe.cog.brown.edu Eric Backus ericb@lsid.hp.com Becky A. Badgett badgett@cs.utexas.edu Bo Nygaard Bai bai@iesd.auc.dk Dave Barber dbarber@apocalypse.bbn.com Rene Beaulieu reneb@distri.hydro.qc.ca Neal Becker neal@ctd.comsat.com Dieter Becker becker@med-in.uni-sb.de Nelson H. F. Beebe beebe@geronimo.math.utah.edu Jeff Beadles jeff@onion.rain.com David J. N. Begley dbegley@st.nepean.uws.edu.au Bob Beresh rberesh@rd.hydro.on.ca Jim Bernard jbernard@iola.mines.colorado.edu Karl Berry karl@cs.umb.edu James W. Birdsall jwbirdsa@picarefy.picarefy.com Scott Bolte scott@craycos.com Wayne E. Bouchard web@paladine.hacks.arizona.edu Marc Boucher marc@cam.org Ola Brahammar pt90ob@pt.hk-r.se Dave Brennan brennan@hal.com Alan Brown dogbowl@dogbox.acme.gen.nz Michael L. Brown brown@wi.extrel.com Rodney Brown rdb@mel.cocam.oz.au Bruce bde@runx.oz.au Bill Bumgarner bbum@stone.com Leila Burrell-Davis leilabd@syma.sussex.ac.uk Roger Butenuth butenuth@ira.uka.de Jon Cargille jcargill@cs.wisc.edu Bud Carlson bud@isle.pegasus.com Lim Fung Chai fclim@i1sin.daq.semi.harris.com Wes Chalfant wes@kofax.com Andrew A. Chernov ache@astral.msk.su Paul Close pdc@lunch.wpd.sgi.com Jeff Coffler coffler@jac.enet.dec.com Will Colley wcc3@occs.cs.oberlin.edu Roger Cornelius sherpa!rac@uunet.uu.net Kevin Cosgrove kevinc@tekig6.pen.tek.com Stephen J Cowley s.j.cowley@amtp.cam.ac.uk Ron Cox roncox@indirect.com Frank Crawford frank@photon.ansto.gov.au James R. Crawford qralston@cislabs.pitt.edu Lawrence Crowl crowl@research.cs.orst.edu Klaus Dahlenburg kdburg@incoahe.hanse.de William E Davidsen davidsen@ariel.crd.ge.com John M. DeDourek dedourek@aixive2.cs.unb.ca Jeff Deifik jdeifik@isi.edu Vince DeMarco vince@whatnxt.cuc.ab.ca Michael De La Rue p91152@cplab.physics.edinburgh.ac.uk Jeff Delinck delinck@pa621a.inland.com John DeRoo deroo@grout.adv.shr.dec.com Jim Diamond zsd@axe.drea.dnd.ca Stefano Diomedi sd@teculx.tecsiel.it Lawrence R. Dodd dodd@roebling.poly.edu Matthew Donadio donadio@mxd120.rh.psu.edu Andy Dougherty andy@crystal.phys.lafayette.edu Darrell Duane dduane@mason1.gmu.edu John Eaton jwe@che.utexas.edu Will Edgington wedgingt@ptolemy.arc.nasa.gov Brian Edmonds edmonds@edmonds.home.cs.ubc.ca Paul Eggert eggert@twinsun.com Enami enami@sys.ptg.sony.co.jp Kristoffer Eriksson ske@pkmab.se Daniel Eriksson m91der@bellatrix.tdb.uu.se Rik Faith faith@cs.unc.edu Larry Fahnoe fahnoe@c1mpls.mn.org Cristian Ferretti cfs@poincare.mat.puc.cl Karl-Jose Filler pla_jfi@pki-nbg.philips.de Valery Fine fine@vxcern.cern.ch Bob Fischer bobf@milne.geology.yale.edu Per Foreby perf@efd.lth.se Alexander Fraser alex@cs.umb.edu Noah Friedman friedman@gnu.ai.mit.edu Bob Friesenhahn bfriesen@iphase.com Gerhard Friesland-Koepke frieslan@rzdspc3.informatik.uni-hamburg.de Andy Fyfe andy@scp.caltech.edu Geoff geoff@frs.faxon.com Arnd Gerns gerns@informatik.uni-hildesheim.de Kaveh R. Ghazi ghazi@staccato.rutgers.edu Torbjorn Granlund tege@sics.se Carl Greco cgreco@parrot.creighton.edu Bruno Haible haible@ma2s2.mathematik.uni-karlsruhe.de Junio Hamano junio@shadow.twinsun.com Harald Hanche-Olsen hanche@ams.sunysb.edu Darrel R. Hankerson hankedr@mail.auburn.edu Mark Hanning-Lee markhl@romeo.caltech.edu Lars Hecking st000002@hrz1.hrz.th-darmstadt.de Ruediger Helsch ruediger@ramz.ing.tu-bs.de Mark C. Henderson mch@sqwest.wimsey.bc.ca Karl Heuer karl@kelp.boston.ma.us Jarkko Hietaniemi jhi@dol-guldur.hut.fi Thomas Hiller hiller@fzi.de Eiji Hirai hirai@cc.swarthmore.edu Kjetil Torgrim Homme kjetilho@ifi.uio.no Robert D. Houk rdh@sli.com Jim Howard jim_howard@mentorg.com Preston Hunt gt5708a@prism.gatech.edu Shane C Hutchins sch@nymph.msel.unh.edu Hutch hutchinson@wrair-emh1.army.mil Lester Ingber ingber@alumni.caltech.edu Ken Ishii ishii@sni-usa.com Per Steinar Iversen iversen@vsfys1.fi.uib.no Chris Jacobsen jacobsen@xray1.physics.sunysb.edu Michal Jaegermann ntomczak@vm.ucs.ualberta.ca Brian Jones brianj@skat.usc.edu Denny de Jonge witaddj@dutrex.tudelft.nl Arne H. Juul arnej@lise.unit.no Dana Jacobsen jacobsd@solar.cor2.epa.gov Peter Jannesen peter@ncs.nl Brian D. Johnston johnstonb@med.ge.com Walter W. Jones wwj@candela.cfr.nist.gov Tom Judson judson@scf.usc.edu Henry G. Juengst juengst@saph2.physik.uni-bonn.de Sarantos Kapidakis sarantos%manteion@ics.forth.gr Amir J. Katz amir@matis.ingr.com Steve Kelem kelem@castor.xilinx.com Steven Kimball kimball@shrew.sanders.lockheed.com Randy Kirchhof rkk@posms.aus.tx.us 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 Fritz Kleemann kleemann@informatik.uni-wuerzburg.dbp.de Wilhelm B. Kloke wb@ifado.arb-phys.uni-dortmund.de Tom Kloos tk@sequent.com Carsten Koch carsten.koch@icem.de Winfried Koenig win@in.rhein-main.de Mathias Koerber mathias@solomon.technet.sg Steph Konigsdorfer s.konigsdorfer@frmy.bull.fr Leif Kornstaedt leif@rumtifsl.ruessel.sub.org Michael D. Lawler mdlawler@bsu-cs.bsu.edu Kevin Layer layer@franz.com Howard D. Leadmon howardl@wb3ffv.ampr.org Alexander Lehmann alex@hal.rhein-main.de Simon Leinen simon@lia.di.epfl.ch Burt Leland burt@molecular.com Tony Leneis tony@plaza.adp.ds.com Hugues Leroy hugues.leroy@irisa.fr Marty Leisner leisner@eso.mc.xerox.com Charles Levert charles@aramis.comm.polymtl.ca Richard Levitte levitte@e.kth.se Torbj|rn Lindh toobii@elixir.e.kth.se David R. Linn drl@vuse.vanderbilt.edu Antonio Lioy cat@athena.polito.it Jamie Lokier u90jl@ecs.oxford.ac.uk Richard Lloyd R.K.Lloyd@csc.liv.ac.uk David J. MacKenzie djm@eng.umd.edu John R MacMillan john@chance.gts.org Ron Male male@eso.mc.xerox.com Don R. Maszle maze@bea.lbl.gov Jaye Mathisen osyjm@cs.montana.edu Telly Mavroidis mavroidi@acf2.nyu.edu Imed Eddine Mbarki mbarki@pacific.cmpe.psu.edu Steeve McCauley steeve@pooh.geophys.mcgill.ca Tom McConnell tmcconne@sedona.intel.com Tod McQuillin mcquill@ccit05.duq.edu Tye McQueen tye@spillman.com Bernd Melchers melchers@chemie.fu-berlin.de Jason Merrill jason@jarthur.claremont.edu Dean S. Messing deanm@medulla.labs.tek.com M. Mesturino mesturino@cselt.stet.it Luke Mewburn zak@rmit.edu.au Jim Meyering meyering@cs.utexas.edu Dragan Milicic milicic@math.utah.edu Frederic Miserey none.fred@applelink.apple.com Marcel J.E. Mol marcel@duteca.et.tudelft.nl Soren Juul Moller sjm@dde.dk Chris Moore moore@src.bae.co.uk Dan Mosedale mosedale@genome.stanford.edu Helmut Muelner hmuelner@fiicmds04.tu-graz.ac.at Urban D Mueller umueller@amiga.physik.unizh.ch Ulrich Mueller ulm@vsnhdb.cern.ch Timothy Murphy tim@maths.tcd.ie Greg Naber greg@squally.halcyon.com Jay Nayegandhi jayng@bbiv02.enet.dec.com Paul K. Neville II pkn2@idsi.com Karl L. Noell noell@informatik.fh-wiesbaden.dbp.de Demizu Noritoshi nori-d@is.aist-nara.ac.jp Todd Ogasawara todd@protege.pegasus.com Helge Oldach helge.oldach@stollmann.de Arthur David Olson ado@elsie.nci.nih.gov Piet van Oostrum piet@cs.ruu.nl Rafael R. Pappalardo rafapa@obelix.cica.es Mike Pearlman canuck@masc38.rice.edu Yves Perrenoud pyves@nuga.alphanet.ch Hal Peterson hrp@pecan.cray.com Pascal Petit petit@cadillac.ibp.fr Bruno Pillard bp@chorus.fr Franc,ois Pinard pinard@iro.umontreal.ca Jay Pinkos pinkos@butyng.bu.edu Thomas Plass thomas@cogsci.ed.ac.uk Mike Polo mikep@cfsmo.honeywell.com Francesco Potorti pot@fly.cnuce.cnr.it Will Priest bpriest@lobby.ti.com David Purves purves@apogee.com Andreas Raab ar@nvmr.robin.de Eric S. Raymond esr@snark.thyrsus.com Klaus Reimann kr@cip.physik.uni-stuttgart.de 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 Arnold Robbins arnold@cc.gatech.edu Kevin Rodgers kevin@rolling-stone.den.mmc.com Kai Uwe Rommel rommel@informatik.tu-muenchen.de Paul Rubin phr@america.telebit.com Wolfgang Rupprecht wolfgang@wsrcc.com Jonathan Ryshpan jon@amito.hitachi.com Paul A Sand pas@unh.edu Tony Sanders sanders@bsdi.com Mike Sangrey mike@sojurn.lns.pa.us Niimi Satoshi a01309@cfi.waseda.ac.jp Marc Schaefer sysadm@alphanet.ch Andreas Schwab schwab@lamothe.informatik.uni-dortmund.de Eric Schenk schenk@cs.toronto.edu Eric P. Scott eps@cs.sfsu.edu Olaf Seibert rhialto@mbfys.kun.nl Sunando Sen sens@fasecon.econ.nyu.edu Harry Shamansky hts@hertz.eng.ohio-state.edu Amos Shapira amoss@cs.huji.ac.il Rick Sladkey jrs@world.std.com Daniel L Smith dls@autodesk.com Fred Smith fredex%fcshome@merk.merk.com Stephen Soliday soliday@ncat.edu Paul Southworth pauls@css.itd.umich.edu Rob Spencer robbie@winkle.bhpese.oz.au Richard Stallman rms@gnu.ai.mit.edu Carsten Steger carsten.steger@informatik.tu-muenchen.de David Sundstrom sunds@anon.asic.sc.ti.com Ed Sznyter ews@babel.babel.com Hideaki Tanabe arctanx@iyeyasu.ynl.t.u-tokyo.ac.jp Andrew Telford ajt@peregrin.resmel.bhp.com.au Glenn E. Thobe thobe@getunx.info.com Kei Thomsen kt@keihh.hanse.de Karsten Thygesen karthy@dannug.dk Mark Towfiq towfiq@microdyne.com Jeff Treece treece@sabbagh.com Oliver Trepte oliver@ikaros.fysik4.kth.se Stephane Tsacas slt@is21.isoft.fr Stephen Tweedie sct@dcs.ed.ac.uk John R. Vanderpool fish@daacdev1.stx.com Sotiris Vassilopoulos vassilopoulos@virginia.edu Pedro A. M. Vazquez vazquez@iqm.unicamp.br Arjan de Vet devet@win.tue.nl Larry W. Virden lvirden@cas.org Vadim V. Vlasov vvlasov@inucres.msk.su Eduard Vopicka eduard.vopicka@vse.cs Theo Vosse vosse@ruls41.leidenuniv.nl Darin Wayrynen darin@pcg.uucp Marcel Waldvogel marcel@nice.usergroup.ethz.ch Stephen J. Walick steve@nshore.org Gray Watson gray@antaire.com David Watt dmwatt@smersh.cambridge.ma.us Scott Weikart scott@igc.apc.org Ivo Welch iwelch@agsm.ucla.edu Jochen Wiedmann zrawi01@zmcipdec1.zdv.uni-tuebingen.de Gijsb. Wiesenekker wiesenecker@sara.nl Wietze van Winden wietze@swi.psy.uva.nl Frank Wuebbeling wuebbel@math.uni-muenster.de Larry W. Virden lwv26@cas.org Bill Wohler wohler@sap-ag.de Jamie Zawinski jwz@lucid.com Christos Zoulas christos@deshaw.com 0707010000cef8000081a4000000020000000200000001356077fa00000a4b000000660000000300000000000000000000001400000004reloc/doc.gzip/TODOTODO file for gzip. Some of the planned features include: - Structure the sources so that the compression and decompression code form a library usable by any program, and write both gzip and zip on top of this library. This would ideally be a reentrant (thread safe) library, but this would degrade performance. In the meantime, you can look at the sample program zread.c. The library should have one mode in which compressed data is sent as soon as input is available, instead of waiting for complete blocks. This can be useful for sending compressed data to/from interactive programs. - Make it convenient to define alternative user interfaces (in particular for windowing environments). - Support in-memory compression for arbitrarily large amounts of data (zip currently supports in-memory compression only for a single buffer.) - Map files in memory when possible, this is generally much faster than read/write. (zip currently maps entire files at once, this should be done in chunks to reduce memory usage.) - Add a super-fast compression method, suitable for implementing file systems with transparent compression. One problem is that the best candidate (lzrw1) is patented twice (Waterworth 4,701,745 and Gibson & Graybill 5,049,881). The lzrw series of algorithms are available by ftp in ftp.adelaide.edu.au:/pub/compression/lzrw*. - Add a super-tight (but slow) compression method, suitable for long term archives. One problem is that the best versions of arithmetic coding are patented (4,286,256 4,295,125 4,463,342 4,467,317 4,633,490 4,652,856 4,891,643 4,905,297 4,935,882 4,973,961 5,023,611 5,025,258). Note: I will introduce new compression methods only if they are significantly better in either speed or compression ratio than the existing method(s). So the total number of different methods should reasonably not exceed 3. (The current 9 compression levels are just tuning parameters for a single method, deflation.) - Add optional error correction. One problem is that the current version of ecc cannot recover from inserted or missing bytes. It would be nice to recover from the most common error (transfer of a binary file in ascii mode). - Add a block size (-b) option to improve error recovery in case of failure of a complete sector. Each block could be extracted independently, but this reduces the compression ratio. - Use a larger window size to deal with some large redundant files that 'compress' currently handles better than gzip. - Implement the -e (encrypt) option. Send comments to Jean-loup Gailly . 0707010000cef9000081a4000000020000000200000001356077fa0000478d000000660000000300000000000000000000001b00000004reloc/doc.gzip/gpl.texinfo@setfilename gpl.info @unnumbered GNU GENERAL PUBLIC LICENSE @center Version 2, June 1991 @display Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @unnumberedsec Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software---to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. @iftex @unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @end iftex @ifinfo @center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @end ifinfo @enumerate @item This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The ``Program'', below, refers to any such program or work, and a ``work based on the Program'' means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term ``modification''.) Each licensee is addressed as ``you''. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. @item You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. @item You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: @enumerate a @item You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. @item You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. @item If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) @end enumerate These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. @item You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: @enumerate a @item Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, @item Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, @item Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) @end enumerate The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. @item You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. @item You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. @item Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. @item If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. @item If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. @item The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and ``any later version'', you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. @item If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. @iftex @heading NO WARRANTY @end iftex @ifinfo @center NO WARRANTY @end ifinfo @item BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. @item IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. @end enumerate @iftex @heading END OF TERMS AND CONDITIONS @end iftex @ifinfo @center END OF TERMS AND CONDITIONS @end ifinfo @page @unnumberedsec How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found. @smallexample @var{one line to give the program's name and an idea of what it does.} Copyright (C) 19@var{yy} @var{name of author} This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @end smallexample Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: @smallexample Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author} Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @end smallexample The hypothetical commands @samp{show w} and @samp{show c} should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than @samp{show w} and @samp{show c}; they could even be mouse-clicks or menu items---whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. Here is a sample; alter the names: @example Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. @var{signature of Ty Coon}, 1 April 1989 Ty Coon, President of Vice @end example This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. 0707010000cefa000081a4000000020000000200000001356077fa000043e6000000660000000300000000000000000000001900000004reloc/doc.gzip/gzip.texi\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename gzip.info @settitle Gzip User's Manual @finalout @setchapternewpage odd @c %**end of header @ifinfo This file documents the the GNU @code{gzip} command for compressing files. Copyright (C) 1992-1993 Jean-loup Gailly Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @ignore Permission is granted to process this file through TeX and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). @end ignore Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation. @end ifinfo @titlepage @title gzip @subtitle The data compression program @subtitle Edition 1.2.4, for Gzip Version 1.2.4 @subtitle July 1993 @author by Jean-loup Gailly @page @vskip 0pt plus 1filll Copyright @copyright{} 1992-1993 Jean-loup Gailly Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation. @end titlepage @node Top, , , (dir) @ifinfo This file documents the @code{gzip} command to compress files. @end ifinfo @menu * Copying:: How you can copy and share @code{gzip}. * Overview:: Preliminary information. * Sample:: Sample output from @code{gzip}. * Invoking gzip:: How to run @code{gzip}. * Advanced usage:: Concatenated files. * Environment:: The @code{GZIP} environment variable * Tapes:: Using @code{gzip} on tapes. * Problems:: Reporting bugs. * Concept Index:: Index of concepts. @end menu @node Copying, Overview, , Top @include gpl.texinfo @node Overview, Sample, Copying, Top @chapter Overview @cindex overview @code{gzip} reduces the size of the named files using Lempel-Ziv coding (LZ77). Whenever possible, each file is replaced by one with the extension @samp{.gz}, while keeping the same ownership modes, access and modification times. (The default extension is @samp{-gz} for VMS, @samp{z} for MSDOS, OS/2 FAT and Atari.) If no files are specified or if a file name is "-", the standard input is compressed to the standard output. @code{gzip} will only attempt to compress regular files. In particular, it will ignore symbolic links. If the new file name is too long for its file system, @code{gzip} truncates it. @code{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. By default, @code{gzip} keeps the original file name and timestamp in the compressed file. These are used when decompressing the file with the @samp{-N} option. This is useful when the compressed file name was truncated or when the time stamp was not preserved after a file transfer. Compressed files can be restored to their original form using @samp{gzip -d} or @code{gunzip} or @code{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. @code{gunzip} takes a list of files on its command line and replaces each file whose name ends with @samp{.gz}, @samp{.z}, @samp{.Z}, @samp{-gz}, @samp{-z} or @samp{_z} and which begins with the correct magic number with an uncompressed file without the original extension. @code{gunzip} also recognizes the special extensions @samp{.tgz} and @samp{.taz} as shorthands for @samp{.tar.gz} and @samp{.tar.Z} respectively. When compressing, @code{gzip} uses the @samp{.tgz} extension if necessary instead of truncating a file with a @samp{.tar} extension. @code{gunzip} can currently decompress files created by @code{gzip}, @code{zip}, @code{compress} or @code{pack}. The detection of the input format is automatic. When using the first two formats, @code{gunzip} checks a 32 bit CRC (cyclic redundancy check). For @code{pack}, @code{gunzip} checks the uncompressed length. The @code{compress} format was not designed to allow consistency checks. However @code{gunzip} is sometimes able to detect a bad @samp{.Z} file. If you get an error when uncompressing a @samp{.Z} file, do not assume that the @samp{.Z} file is correct simply because the standard @code{uncompress} does not complain. This generally means that the standard @code{uncompress} does not check its input, and happily generates garbage output. The SCO @samp{compress -H} format (@code{lzh} compression method) does not include a CRC but also allows some consistency checks. Files created by @code{zip} can be uncompressed by @code{gzip} only if they have a single member compressed with the 'deflation' method. This feature is only intended to help conversion of @code{tar.zip} files to the @code{tar.gz} format. To extract @code{zip} files with several members, use @code{unzip} instead of @code{gunzip}. @code{zcat} is identical to @samp{gunzip -c}. @code{zcat} uncompresses either a list of files on the command line or its standard input and writes the uncompressed data on standard output. @code{zcat} will uncompress files that have the correct magic number whether they have a @samp{.gz} suffix or not. @code{gzip} uses the Lempel-Ziv algorithm used in @code{zip} and PKZIP. The amount of compression obtained depends on the size of the input and the distribution of common substrings. Typically, text such as source code or English is reduced by 60-70%. Compression is generally much better than that achieved by LZW (as used in @code{compress}), Huffman coding (as used in @code{pack}), or adaptive Huffman coding (@code{compact}). Compression is always performed, even if the compressed file is slightly larger than the original. The worst case expansion is a few bytes for the @code{gzip} file header, plus 5 bytes every 32K block, or an expansion ratio of 0.015% for large files. Note that the actual number of used disk blocks almost never increases. @code{gzip} preserves the mode, ownership and timestamps of files when compressing or decompressing. @node Sample, Invoking gzip, Overview, Top @chapter Sample Output @cindex sample Here are some realistic examples of running @code{gzip}. This is the output of the command @samp{gzip -h}: @example gzip 1.2.4 (18 Aug 93) usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...] -c --stdout write on standard output, keep original files unchanged -d --decompress decompress -f --force force overwrite of output file and compress links -h --help give this help -l --list list compressed file contents -L --license display software license -n --no-name do not save or restore the original name and time stamp -N --name save or restore the original name and time stamp -q --quiet suppress all warnings -r --recursive operate recursively on directories -S .suf --suffix .suf use suffix .suf on compressed files -t --test test compressed file integrity -v --verbose verbose mode -V --version display version number -1 --fast compress faster -9 --best compress better file... files to (de)compress. If none given, use standard input. @end example This is the output of the command @samp{gzip -v texinfo.tex}: @example texinfo.tex: 71.6% -- replaced with texinfo.tex.gz @end example The following command will find all @code{gzip} files in the current directory and subdirectories, and extract them in place without destroying the original: @example find . -name '*.gz' -print | sed 's/^\(.*\)[.]gz$/gunzip < "&" > "\1"/' | sh @end example @node Invoking gzip, Advanced usage, Sample, Top @chapter Invoking @code{gzip} @cindex invoking @cindex options The format for running the @code{gzip} program is: @example gzip @var{option} @dots{} @end example @code{gzip} supports the following options: @table @samp @item --stdout @itemx --to-stdout @itemx -c Write output on standard output; keep original files unchanged. If there are several input files, the output consists of a sequence of independently compressed members. To obtain better compression, concatenate all input files before compressing them. @item --decompress @itemx --uncompress @itemx -d Decompress. @item --force @itemx -f Force compression or decompression even if the file has multiple links or the corresponding file already exists, or if the compressed data is read from or written to a terminal. If the input data is not in a format recognized by @code{gzip}, and if the option --stdout is also given, copy the input data without change to the standard ouput: let @code{zcat} behave as @code{cat}. If @samp{-f} is not given, and when not running in the background, @code{gzip} prompts to verify whether an existing file should be overwritten. @item --help @itemx -h Print an informative help message describing the options then quit. @item --list @itemx -l For each compressed file, list the following fields: @example 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 @end example The uncompressed size is given as @samp{-1} for files not in @code{gzip} format, such as compressed @samp{.Z} files. To get the uncompressed size for such a file, you can use: @example zcat file.Z | wc -c @end example In combination with the --verbose option, the following fields are also displayed: @example method: compression method (deflate,compress,lzh,pack) crc: the 32-bit CRC of the uncompressed data date & time: time stamp for the uncompressed file @end example 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. @item --license @itemx -L Display the @code{gzip} license then quit. @item --no-name @itemx -n When compressing, do not save the original file name and time stamp 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 @code{gzip} suffix from the compressed file name) and do not restore the original time stamp if present (copy it from the compressed file). This option is the default when decompressing. @item --name @itemx -N When compressing, always save the original file name and time stamp; this is the default. When decompressing, restore the original file name and time stamp if present. This option is useful on systems which have a limit on file name length or when the time stamp has been lost after a file transfer. @item --quiet @itemx -q Suppress all warning messages. @item --recursive @itemx -r Travel the directory structure recursively. If any of the file names specified on the command line are directories, @code{gzip} will descend into the directory and compress all the files it finds there (or decompress them in the case of @code{gunzip}). @item --suffix @var{suf} @itemx -S @var{suf} Use suffix @samp{@var{suf}} instead of @samp{.gz}. Any suffix can be given, but suffixes other than @samp{.z} and @samp{.gz} should be avoided to avoid confusion when files are transferred to other systems. A null suffix forces gunzip to try decompression on all given files regardless of suffix, as in: @example gunzip -S "" * (*.* for MSDOS) @end example Previous versions of gzip used the @samp{.z} suffix. This was changed to avoid a conflict with @code{pack}. @item --test @itemx -t Test. Check the compressed file integrity. @item --verbose @itemx -v Verbose. Display the name and percentage reduction for each file compressed. @item --version @itemx -V Version. Display the version number and compilation options, then quit. @item --fast @itemx --best @itemx -@var{n} Regulate the speed of compression using the specified digit @var{n}, where @samp{-1} or @samp{--fast} indicates the fastest compression method (less compression) and @samp{--best} or @samp{-9} indicates the slowest compression method (optimal compression). The default compression level is @samp{-6} (that is, biased towards high compression at expense of speed). @end table @node Advanced usage, Environment, Invoking gzip, Top @chapter Advanced usage @cindex concatenated files Multiple compressed files can be concatenated. In this case, @code{gunzip} will extract all members at once. If one member is damaged, other members might still be recovered after removal of the damaged member. Better compression can be usually obtained if all members are decompressed and then recompressed in a single step. This is an example of concatenating @code{gzip} files: @example gzip -c file1 > foo.gz gzip -c file2 >> foo.gz @end example Then @example gunzip -c foo @end example is equivalent to @example cat file1 file2 @end example In case of damage to one member of a @samp{.gz} file, other members can still be recovered (if the damaged member is removed). However, you can get better compression by compressing all members at once: @example cat file1 file2 | gzip > foo.gz @end example compresses better than @example gzip -c file1 file2 > foo.gz @end example If you want to recompress concatenated files to get better compression, do: @example zcat old.gz | gzip > new.gz @end example If a compressed file consists of several members, the uncompressed size and CRC reported by the @samp{--list} option applies to the last member only. If you need the uncompressed size for all members, you can use: @example zcat file.gz | wc -c @end example If you wish to create a single archive file with multiple members so that members can later be extracted independently, use an archiver such as @code{tar} or @code{zip}. GNU @code{tar} supports the @samp{-z} option to invoke @code{gzip} transparently. @code{gzip} is designed as a complement to @code{tar}, not as a replacement. @node Environment, Tapes, Advanced usage, Top @chapter Environment @cindex Environment The environment variable @code{GZIP} can hold a set of default options for @code{gzip}. These options are interpreted first and can be overwritten by explicit command line parameters. For example: @example for sh: GZIP="-8v --name"; export GZIP for csh: setenv GZIP "-8v --name" for MSDOS: set GZIP=-8v --name @end example On Vax/VMS, the name of the environment variable is @code{GZIP_OPT}, to avoid a conflict with the symbol set for invocation of the program. @node Tapes, Problems, Environment, Top @chapter Using @code{gzip} on tapes @cindex tapes When writing compressed data to a tape, it is generally necessary to pad the output with zeroes up to a block boundary. When the data is read and the whole block is passed to @code{gunzip} for decompression, @code{gunzip} detects that there is extra trailing garbage after the compressed data and emits a warning by default. You have to use the @samp{--quiet} option to suppress the warning. This option can be set in the @code{GZIP} environment variable, as in: @example for sh: GZIP="-q" tar -xfz --block-compress /dev/rst0 for csh: (setenv GZIP "-q"; tar -xfz --block-compress /dev/rst0) @end example In the above example, @code{gzip} is invoked implicitly by the @samp{-z} option of GNU @code{tar}. Make sure that the same block size (@samp{-b} option of @code{tar}) is used for reading and writing compressed data on tapes. (This example assumes you are using the GNU version of @code{tar}.) @node Problems, Concept Index, Tapes, Top @chapter Reporting Bugs @cindex bugs If you find a bug in @code{gzip}, please send electronic mail to @w{@samp{jloup@@chorus.fr}} or, if this fails, to @w{@samp{bug-gnu-utils@@prep.ai.mit.edu}}. Include the version number, which you can find by running @w{@samp{gzip -V}}. Also include in your message the hardware and operating system, the compiler used to compile @code{gzip}, a description of the bug behavior, and the input to @code{gzip} that triggered the bug.@refill @node Concept Index, , Problems, Top @unnumbered Concept Index @printindex cp @contents @bye 0707010000cefb000081a4000000020000000200000001356077fa0001a948000000660000000300000000000000000000001b00000004reloc/doc.gzip/texinfo.tex%% TeX macros to handle texinfo files % Copyright (C) 1985, 1986, 1988, 1990, 1991 Free Software Foundation, Inc. %This texinfo.tex file is free software; you can redistribute it and/or %modify it under the terms of the GNU General Public License as %published by the Free Software Foundation; either version 2, or (at %your option) any later version. %This texinfo.tex file is distributed in the hope that it will be %useful, but WITHOUT ANY WARRANTY; without even the implied warranty %of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU %General Public License for more details. %You should have received a copy of the GNU General Public License %along with this texinfo.tex file; see the file COPYING. If not, write %to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, %USA. %In other words, you are welcome to use, share and improve this program. %You are forbidden to forbid anyone else to use, share and improve %what you give them. Help stamp out software-hoarding! \def\texinfoversion{2.73} \message{Loading texinfo package [Version \texinfoversion]:} \message{} % Print the version number if in a .fmt file. \everyjob{\message{[Texinfo version \texinfoversion]}\message{}} % Save some parts of plain tex whose names we will redefine. \let\ptexlbrace=\{ \let\ptexrbrace=\} \let\ptexdots=\dots \let\ptexdot=\. \let\ptexstar=\* \let\ptexend=\end \let\ptexbullet=\bullet \let\ptexb=\b \let\ptexc=\c \let\ptexi=\i \let\ptext=\t \let\ptexl=\l \let\ptexL=\L \def\tie{\penalty 10000\ } % Save plain tex definition of ~. \message{Basics,} \chardef\other=12 % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J \hyphenation{ap-pen-dix} \hyphenation{mini-buf-fer mini-buf-fers} \hyphenation{eshell} % Margin to add to right of even pages, to left of odd pages. \newdimen \bindingoffset \bindingoffset=0pt \newdimen \normaloffset \normaloffset=\hoffset \newdimen\pagewidth \newdimen\pageheight \pagewidth=\hsize \pageheight=\vsize % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{\tracingcommands2 \tracingstats2 \tracingpages1 \tracingoutput1 \tracinglostchars1 \tracingmacros2 \tracingparagraphs1 \tracingrestores1 \showboxbreadth\maxdimen\showboxdepth\maxdimen }% %---------------------Begin change----------------------- % %%%% For @cropmarks command. % Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\cornerlong \newdimen\cornerthick \newdimen \topandbottommargin \newdimen \outerhsize \newdimen \outervsize \cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks \outerhsize=7in %\outervsize=9.5in % Alternative @smallbook page size is 9.25in \outervsize=9.25in \topandbottommargin=.75in % %---------------------End change----------------------- % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions itself, but you have to call it yourself. \chardef\PAGE=255 \output={\onepageout{\pagecontents\PAGE}} \def\onepageout#1{\hoffset=\normaloffset \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi {\escapechar=`\\\relax % makes sure backslash is used in output files. \shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}% {\let\hsize=\pagewidth \makefootline}}}% \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi} %%%% For @cropmarks command %%%% % Here is a modification of the main output routine for Near East Publications % This provides right-angle cropmarks at all four corners. % The contents of the page are centerlined into the cropmarks, % and any desired binding offset is added as an \hskip on either % site of the centerlined box. (P. A. MacKay, 12 November, 1986) % \def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up \shipout \vbox to \outervsize{\hsize=\outerhsize \vbox{\line{\ewtop\hfill\ewtop}} \nointerlineskip \line{\vbox{\moveleft\cornerthick\nstop} \hfill \vbox{\moveright\cornerthick\nstop}} \vskip \topandbottommargin \centerline{\ifodd\pageno\hskip\bindingoffset\fi \vbox{ {\let\hsize=\pagewidth \makeheadline} \pagebody{#1} {\let\hsize=\pagewidth \makefootline}} \ifodd\pageno\else\hskip\bindingoffset\fi} \vskip \topandbottommargin plus1fill minus1fill \boxmaxdepth\cornerthick \line{\vbox{\moveleft\cornerthick\nsbot} \hfill \vbox{\moveright\cornerthick\nsbot}} \nointerlineskip \vbox{\line{\ewbot\hfill\ewbot}} } \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi} % % Do @cropmarks to get crop marks \def\cropmarks{\let\onepageout=\croppageout } \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi \dimen@=\dp#1 \unvbox#1 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. % The argument can be delimited with [...] or with "..." or braces % or it can be a whole line. % #1 should be a macro which expects % an ordinary undelimited TeX argument. \def\parsearg #1{\let\next=#1\begingroup\obeylines\futurelet\temp\parseargx} \def\parseargx{% \ifx \obeyedspace\temp \aftergroup\parseargdiscardspace \else% \aftergroup \parseargline % \fi \endgroup} {\obeyspaces % \gdef\parseargdiscardspace {\begingroup\obeylines\futurelet\temp\parseargx}} \gdef\obeyedspace{\ } \def\parseargline{\begingroup \obeylines \parsearglinex} {\obeylines % \gdef\parsearglinex #1^^M{\endgroup \next {#1}}} \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} %% These are used to keep @begin/@end levels from running away %% Call \inENV within environments (after a \begingroup) \newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} \def\ENVcheck{% \ifENV\errmessage{Still within an environment. Type Return to continue.} \endgroup\fi} % This is not perfect, but it should reduce lossage % @begin foo is the same as @foo, for now. \newhelp\EMsimple{Type to continue} \outer\def\begin{\parsearg\beginxxx} \def\beginxxx #1{% \expandafter\ifx\csname #1\endcsname\relax {\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else \csname #1\endcsname\fi} %% @end foo executes the definition of \Efoo. %% foo can be delimited by doublequotes or brackets. \def\end{\parsearg\endxxx} \def\endxxx #1{% \expandafter\ifx\csname E#1\endcsname\relax \expandafter\ifx\csname #1\endcsname\relax \errmessage{Undefined command @end #1}\else \errorE{#1}\fi\fi \csname E#1\endcsname} \def\errorE#1{ {\errhelp=\EMsimple \errmessage{@end #1 not within #1 environment}}} % Single-spacing is done by various environments. \newskip\singlespaceskip \singlespaceskip = \baselineskip \def\singlespace{% {\advance \baselineskip by -\singlespaceskip \kern \baselineskip}% \baselineskip=\singlespaceskip } %% Simple single-character @ commands % @@ prints an @ % Kludge this until the fonts are right (grr). \def\@{{\tt \char '100}} % Define @` and @' to be the same as ` and ' % but suppressing ligatures. \def\`{{`}} \def\'{{'}} % Used to generate quoted braces. \def\mylbrace {{\tt \char '173}} \def\myrbrace {{\tt \char '175}} \let\{=\mylbrace \let\}=\myrbrace % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} % @. is an end-of-sentence period. \def\.{.\spacefactor=3000 } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % \def\group{\begingroup \ifnum\catcode13=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \def\Egroup{\egroup\endgroup}% \vtop\bgroup } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \def\need{\parsearg\needx} % Old definition--didn't work. %\def\needx #1{\par % %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{\baselineskip=0pt% %\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000 %\prevdepth=-1000pt %}} \def\needx#1{% % Go into vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % Don't add any leading before our big empty box, but allow a page % break, since the best break might be right here. \allowbreak \nointerlineskip \vtop to #1\mil{\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak } % @br forces paragraph break \let\br = \par % @dots{} output some dots \def\dots{$\ldots$} % @page forces the start of a new page \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \def\exdent{\parsearg\exdentyyy} \def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}} % This defn is used inside nofill environments such as @example. \def\nofillexdent{\parsearg\nofillexdentyyy} \def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} %\hbox{{\rm#1}}\hfil\break}} % @include file insert text of that file as input. \def\include{\parsearg\includezzz} \def\includezzz #1{{\def\thisfile{#1}\input #1 }} \def\thisfile{} % @center line outputs that line, centered \def\center{\parsearg\centerzzz} \def\centerzzz #1{{\advance\hsize by -\leftskip \advance\hsize by -\rightskip \centerline{#1}}} % @sp n outputs n lines of vertical space \def\sp{\parsearg\spxxx} \def\spxxx #1{\par \vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment \def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other% \parsearg \commentxxx} \def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 } \let\c=\comment % Prevent errors for section commands. % Used in @ignore and in failing conditionals. \def\ignoresections{% \let\chapter=\relax \let\unnumbered=\relax \let\top=\relax \let\unnumberedsec=\relax \let\unnumberedsection=\relax \let\unnumberedsubsec=\relax \let\unnumberedsubsection=\relax \let\unnumberedsubsubsec=\relax \let\unnumberedsubsubsection=\relax \let\section=\relax \let\subsec=\relax \let\subsubsec=\relax \let\subsection=\relax \let\subsubsection=\relax \let\appendix=\relax \let\appendixsec=\relax \let\appendixsection=\relax \let\appendixsubsec=\relax \let\appendixsubsection=\relax \let\appendixsubsubsec=\relax \let\appendixsubsubsection=\relax \let\contents=\relax \let\smallbook=\relax \let\titlepage=\relax } \def\ignore{\begingroup\ignoresections % Make sure that spaces turn into tokens that match what \ignorexxx wants. \catcode32=10 \ignorexxx} \long\def\ignorexxx #1\end ignore{\endgroup\ignorespaces} \def\direntry{\begingroup\direntryxxx} \long\def\direntryxxx #1\end direntry{\endgroup\ignorespaces} % Conditionals to test whether a flag is set. \def\ifset{\begingroup\ignoresections\parsearg\ifsetxxx} \def\ifsetxxx #1{\endgroup \expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\ifsetfail \else \let\temp=\relax \fi \temp} \def\Eifset{} \def\ifsetfail{\begingroup\ignoresections\ifsetfailxxx} \long\def\ifsetfailxxx #1\end ifset{\endgroup\ignorespaces} \def\ifclear{\begingroup\ignoresections\parsearg\ifclearxxx} \def\ifclearxxx #1{\endgroup \expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\relax \else \let\temp=\ifclearfail \fi \temp} \def\Eifclear{} \def\ifclearfail{\begingroup\ignoresections\ifclearfailxxx} \long\def\ifclearfailxxx #1\end ifclear{\endgroup\ignorespaces} % @set foo to set the flag named foo. % @clear foo to clear the flag named foo. \def\set{\parsearg\setxxx} \def\setxxx #1{ \expandafter\let\csname IF#1\endcsname=\set} \def\clear{\parsearg\clearxxx} \def\clearxxx #1{ \expandafter\let\csname IF#1\endcsname=\relax} % Some texinfo constructs that are trivial in tex \def\iftex{} \def\Eiftex{} \def\ifinfo{\begingroup\ignoresections\ifinfoxxx} \long\def\ifinfoxxx #1\end ifinfo{\endgroup\ignorespaces} \long\def\menu #1\end menu{} \def\asis#1{#1} % @math means output in math mode. % We don't use $'s directly in the definition of \math because control % sequences like \math are expanded when the toc file is written. Then, % we read the toc file back, the $'s will be normal characters (as they % should be, according to the definition of Texinfo). So we must use a % control sequence to switch into and out of math mode. % % This isn't quite enough for @math to work properly in indices, but it % seems unlikely it will ever be needed there. % \let\implicitmath = $ \def\math#1{\implicitmath #1\implicitmath} \def\node{\ENVcheck\parsearg\nodezzz} \def\nodezzz#1{\nodexxx [#1,]} \def\nodexxx[#1,#2]{\gdef\lastnode{#1}} \let\lastnode=\relax \def\donoderef{\ifx\lastnode\relax\else \expandafter\expandafter\expandafter\setref{\lastnode}\fi \let\lastnode=\relax} \def\unnumbnoderef{\ifx\lastnode\relax\else \expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi \let\lastnode=\relax} \def\appendixnoderef{\ifx\lastnode\relax\else \expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi \let\lastnode=\relax} \let\refill=\relax % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \readauxfile \opencontents \openindices \fixbackslash % Turn off hack to swallow `\input texinfo'. \global\let\setfilename=\comment % Ignore extra @setfilename cmds. \comment % Ignore the actual filename. } \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{See Info file \file{\losespace#3{}}, node \samp{\losespace#1{}}} \def\losespace #1{#1} \message{fonts,} % Font-change commands. % Texinfo supports the sans serif font style, which plain TeX does not. % So we set up a \sf analogous to plain's \rm, etc. \newfam\sffam \def\sf{\fam=\sffam \tensf} \let\li = \sf % Sometimes we call it \li, not \sf. %% Try out Computer Modern fonts at \magstephalf \let\mainmagstep=\magstephalf \ifx\bigger\relax \let\mainmagstep=\magstep1 \font\textrm=cmr12 \font\texttt=cmtt12 \else \font\textrm=cmr10 scaled \mainmagstep \font\texttt=cmtt10 scaled \mainmagstep \fi % Instead of cmb10, you many want to use cmbx10. % cmbx10 is a prettier font on its own, but cmb10 % looks better when embedded in a line with cmr10. \font\textbf=cmb10 scaled \mainmagstep \font\textit=cmti10 scaled \mainmagstep \font\textsl=cmsl10 scaled \mainmagstep \font\textsf=cmss10 scaled \mainmagstep \font\textsc=cmcsc10 scaled \mainmagstep \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep % A few fonts for @defun, etc. \font\defbf=cmbx10 scaled \magstep1 %was 1314 \font\deftt=cmtt10 scaled \magstep1 \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} % Fonts for indices and small examples. % We actually use the slanted font rather than the italic, % because texinfo normally uses the slanted fonts for that. % Do not make many font distinctions in general in the index, since they % aren't very useful. \font\ninett=cmtt9 \font\indrm=cmr9 \font\indit=cmsl9 \let\indsl=\indit \let\indtt=\ninett \let\indsf=\indrm \let\indbf=\indrm \let\indsc=\indrm \font\indi=cmmi9 \font\indsy=cmsy9 % Fonts for headings \font\chaprm=cmbx12 scaled \magstep2 \font\chapit=cmti12 scaled \magstep2 \font\chapsl=cmsl12 scaled \magstep2 \font\chaptt=cmtt12 scaled \magstep2 \font\chapsf=cmss12 scaled \magstep2 \let\chapbf=\chaprm \font\chapsc=cmcsc10 scaled\magstep3 \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \font\secrm=cmbx12 scaled \magstep1 \font\secit=cmti12 scaled \magstep1 \font\secsl=cmsl12 scaled \magstep1 \font\sectt=cmtt12 scaled \magstep1 \font\secsf=cmss12 scaled \magstep1 \font\secbf=cmbx12 scaled \magstep1 \font\secsc=cmcsc10 scaled\magstep2 \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 % \font\ssecrm=cmbx10 scaled \magstep1 % This size an font looked bad. % \font\ssecit=cmti10 scaled \magstep1 % The letters were too crowded. % \font\ssecsl=cmsl10 scaled \magstep1 % \font\ssectt=cmtt10 scaled \magstep1 % \font\ssecsf=cmss10 scaled \magstep1 %\font\ssecrm=cmb10 scaled 1315 % Note the use of cmb rather than cmbx. %\font\ssecit=cmti10 scaled 1315 % Also, the size is a little larger than %\font\ssecsl=cmsl10 scaled 1315 % being scaled magstep1. %\font\ssectt=cmtt10 scaled 1315 %\font\ssecsf=cmss10 scaled 1315 %\let\ssecbf=\ssecrm \font\ssecrm=cmbx12 scaled \magstephalf \font\ssecit=cmti12 scaled \magstephalf \font\ssecsl=cmsl12 scaled \magstephalf \font\ssectt=cmtt12 scaled \magstephalf \font\ssecsf=cmss12 scaled \magstephalf \font\ssecbf=cmbx12 scaled \magstephalf \font\ssecsc=cmcsc10 scaled \magstep1 \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled \magstep1 % The smallcaps and symbol fonts should actually be scaled \magstep1.5, % but that is not a standard magnification. % Fonts for title page: \font\titlerm = cmbx12 scaled \magstep3 \let\authorrm = \secrm % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts, we % don't bother to reset \scriptfont and \scriptscriptfont (which would % also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf \textfont\ttfam = \tentt \textfont\sffam = \tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this so that font changes will continue to work % in math mode, where it is the current \fam that is relevant in most % cases, not the current. Plain TeX does, for example, % \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need % to redefine \bf itself. \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \resetmathfonts} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \resetmathfonts} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \resetmathfonts} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \resetmathfonts} \def\indexfonts{% \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \resetmathfonts} % Set up the default fonts, so we can use them for creating boxes. % \textfonts % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Fonts for short table of contents. \font\shortcontrm=cmr12 \font\shortcontbf=cmbx12 \font\shortcontsl=cmsl12 %% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic % \smartitalic{ARG} outputs arg in italics, followed by an italic correction % unless the following character is such as not to need one. \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} \def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx} \let\i=\smartitalic \let\var=\smartitalic \let\dfn=\smartitalic \let\emph=\smartitalic \let\cite=\smartitalic \def\b#1{{\bf #1}} \let\strong=\b \def\t#1{{\tt \exhyphenpenalty=10000\rawbackslash \frenchspacing #1}\null} \let\ttfont = \t %\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null} \def\samp #1{`\tclose{#1}'\null} \def\key #1{{\tt \exhyphenpenalty=10000\uppercase{#1}}\null} \def\ctrl #1{{\tt \rawbackslash \hat}#1} \let\file=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \newdimen\tclosesave \newdimen\tcloserm \def\tclose#1{{\rm \tcloserm=\fontdimen2\font \tt \tclosesave=\fontdimen2\font \fontdimen2\font=\tcloserm % prevent breaking lines at hyphens. \exhyphenpenalty=10000 \def\ {{\fontdimen2\font=\tclosesave{} }}% \rawbackslash \frenchspacing #1\fontdimen2\font=\tclosesave}\null} \let\code=\tclose %\let\exp=\tclose %Was temporary % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else\tclose{\look}\fi \else\tclose{\look}\fi} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of % @dmn{}pt. % \def\dmn#1{\thinspace #1} \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} \def\l#1{{\li #1}\null} % \def\r#1{{\rm #1}} % roman font % Use of \lowercase was suggested. \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \def\titlefont#1{{\titlerm #1}} \newtoks\realeverypar \newif\ifseenauthor \newif\iffinishedtitlepage \def\titlepage{\begingroup \parindent=0pt \textfonts \let\subtitlerm=\tenrm % I deinstalled the following change because \cmr12 is undefined. % This change was not in the ChangeLog anyway. --rms. % \let\subtitlerm=\cmr12 \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% % \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}% % % Leave some space at the very top of the page. \vglue\titlepagetopglue % % Now you can print the title using @title. \def\title{\parsearg\titlezzz}% \def\titlezzz##1{\leftline{\titlefont{##1}} % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt \vskip4pt}% % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Now you can put text using @subtitle. \def\subtitle{\parsearg\subtitlezzz}% \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% % % @author should come last, but may come many times. \def\author{\parsearg\authorzzz}% \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi {\authorfont \leftline{##1}}}% % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \oldpage \let\page = \oldpage \hbox{}}% % \def\page{\oldpage \hbox{}} } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup \HEADINGSon } \def\finishtitlepage{% \vskip4pt \hrule height 2pt \vskip\titlepagebottomglue \finishedtitlepagetrue } %%% Set up page headings and footings. \let\thispage=\folio \newtoks \evenheadline % Token sequence for heading line of even pages \newtoks \oddheadline % Token sequence for heading line of odd pages \newtoks \evenfootline % Token sequence for footing line of even pages \newtoks \oddfootline % Token sequence for footing line of odd pages % Now make Tex use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\oddheading{\parsearg\oddheadingxxx} \def\everyheading{\parsearg\everyheadingxxx} \def\evenfooting{\parsearg\evenfootingxxx} \def\oddfooting{\parsearg\oddfootingxxx} \def\everyfooting{\parsearg\everyfootingxxx} {\catcode`\@=0 % \gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} \gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} \gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish} \gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}} \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} \gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} \gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% \global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish} \gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}} \global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} % }% unbind the catcode of @. % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\HEADINGSoff{ \global\evenheadline={\hfil} \global\evenfootline={\hfil} \global\oddheadline={\hfil} \global\oddfootline={\hfil}} \HEADINGSoff % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{ %\pagealignmacro \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} } % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{ %\pagealignmacro \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} } % Subroutines used in generating headings % Produces Day Month Year style of output. \def\today{\number\day\space \ifcase\month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi \space\number\year} % Use this if you want the Month Day, Year style of output. %\def\today{\ifcase\month\or %January\or February\or March\or April\or May\or June\or %July\or August\or September\or October\or November\or December\fi %\space\number\day, \number\year} % @settitle line... specifies the title of the document, for headings % It generates no output of its own \def\thistitle{No Title} \def\settitle{\parsearg\settitlezzz} \def\settitlezzz #1{\gdef\thistitle{#1}} \message{tables,} % @tabs -- simple alignment % These don't work. For one thing, \+ is defined as outer. % So these macros cannot even be defined. %\def\tabs{\parsearg\tabszzz} %\def\tabszzz #1{\settabs\+#1\cr} %\def\tabline{\parsearg\tablinezzz} %\def\tablinezzz #1{\+#1\cr} %\def\&{&} % Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @vtable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\par \parsearg\itemzzz} \def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} \def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz} \def\internalBkitem{\smallbreak \parsearg\kitemzzz} \def\internalBkitemx{\par \parsearg\kitemzzz} \def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% \itemzzz {#1}} \def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% \itemzzz {#1}} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemfont{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % Be sure we are not still in the middle of a paragraph. \parskip=0in \par % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax \setbox0=\hbox{\hskip \leftskip \hskip -\tableindent \unhbox0}\box0 \nobreak \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. Since that % text will be indented by \tableindent, we make the item text be in % a zero-width box. \noindent \rlap{\hskip -\tableindent\box0}% \fi \endgroup } \def\item{\errmessage{@item while not in a table}} \def\itemx{\errmessage{@itemx while not in a table}} \def\kitem{\errmessage{@kitem while not in a table}} \def\kitemx{\errmessage{@kitemx while not in a table}} \def\xitem{\errmessage{@xitem while not in a table}} \def\xitemx{\errmessage{@xitemx while not in a table}} %% Contains a kludge to get @end[description] to work \def\description{\tablez{\dontindex}{1}{}{}{}{}} \def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} {\obeylines\obeyspaces% \gdef\tablex #1^^M{% \tabley\dontindex#1 \endtabley}} \def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} {\obeylines\obeyspaces% \gdef\ftablex #1^^M{% \tabley\fnitemindex#1 \endtabley \def\Eftable{\endgraf\endgroup\afterenvbreak}% \let\Etable=\relax}} \def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} {\obeylines\obeyspaces% \gdef\vtablex #1^^M{% \tabley\vritemindex#1 \endtabley \def\Evtable{\endgraf\endgroup\afterenvbreak}% \let\Etable=\relax}} \def\dontindex #1{} \def\fnitemindex #1{\doind {fn}{\code{#1}}}% \def\vritemindex #1{\doind {vr}{\code{#1}}}% {\obeyspaces % \gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% \tablez{#1}{#2}{#3}{#4}{#5}{#6}}} \def\tablez #1#2#3#4#5#6{% \aboveenvbreak % \begingroup % \def\Edescription{\Etable}% Neccessary kludge. \let\itemindex=#1% \ifnum 0#3>0 \advance \leftskip by #3\mil \fi % \ifnum 0#4>0 \tableindent=#4\mil \fi % \ifnum 0#5>0 \advance \rightskip by #5\mil \fi % \def\itemfont{#2}% \itemmax=\tableindent % \advance \itemmax by -\itemmargin % \advance \leftskip by \tableindent % \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi% \def\Etable{\endgraf\endgroup\afterenvbreak}% \let\item = \internalBitem % \let\itemx = \internalBitemx % \let\kitem = \internalBkitem % \let\kitemx = \internalBkitemx % \let\xitem = \internalBxitem % \let\xitemx = \internalBxitemx % } % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \def\itemize{\parsearg\itemizezzz} \def\itemizezzz #1{% \begingroup % ended by the @end itemsize \itemizey {#1}{\Eitemize} } \def\itemizey #1#2{% \aboveenvbreak % \itemmax=\itemindent % \advance \itemmax by -\itemmargin % \advance \leftskip by \itemindent % \exdentamount=\itemindent \parindent = 0pt % \parskip = \smallskipamount % \ifdim \parskip=0pt \parskip=2pt \fi% \def#2{\endgraf\endgroup\afterenvbreak}% \def\itemcontents{#1}% \let\item=\itemizeitem} \def\bullet{$\ptexbullet$} \def\minus{$-$} % Set sfcode to normal for the chars that usually have another value. % These are `.?!:;,' \def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \def\enumerate{\parsearg\enumeratezzz} \def\enumeratezzz #1{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% \begingroup % ended by the @end enumerate % % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call itemizey, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \itemizey{#1.}\Eenumerate\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % Definition of @item while inside @itemize. \def\itemizeitem{% \advance\itemno by 1 {\let\par=\endgraf \smallbreak}% \ifhmode \errmessage{\in hmode at itemizeitem}\fi {\parskip=0in \hskip 0pt \hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% \vadjust{\penalty 1200}}% \flushcr} \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within \newindex. {\catcode`\@=11 \gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. \def\newindex #1{ \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\doindex {#1}} } % @defindex foo == \newindex{foo} \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. \def\newcodeindex #1{ \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\docodeindex {#1}} } \def\defcodeindex{\parsearg\newcodeindex} % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. \def\synindex #1 #2 {% \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname \expandafter\let\csname#1indfile\endcsname=\synindexfoo \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\doindex {#2}}% } % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. \def\syncodeindex #1 #2 {% \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname \expandafter\let\csname#1indfile\endcsname=\synindexfoo \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\docodeindex {#2}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} \def\indexdummies{% \def\_{{\realbackslash _}}% \def\w{\realbackslash w }% \def\bf{\realbackslash bf }% \def\rm{\realbackslash rm }% \def\sl{\realbackslash sl }% \def\sf{\realbackslash sf}% \def\tt{\realbackslash tt}% \def\gtr{\realbackslash gtr}% \def\less{\realbackslash less}% \def\hat{\realbackslash hat}% \def\char{\realbackslash char}% \def\TeX{\realbackslash TeX}% \def\dots{\realbackslash dots }% \def\copyright{\realbackslash copyright }% \def\tclose##1{\realbackslash tclose {##1}}% \def\code##1{\realbackslash code {##1}}% \def\samp##1{\realbackslash samp {##1}}% \def\t##1{\realbackslash r {##1}}% \def\r##1{\realbackslash r {##1}}% \def\i##1{\realbackslash i {##1}}% \def\b##1{\realbackslash b {##1}}% \def\cite##1{\realbackslash cite {##1}}% \def\key##1{\realbackslash key {##1}}% \def\file##1{\realbackslash file {##1}}% \def\var##1{\realbackslash var {##1}}% \def\kbd##1{\realbackslash kbd {##1}}% } % \indexnofonts no-ops all font-change commands. % This is used when outputting the strings to sort the index by. \def\indexdummyfont#1{#1} \def\indexdummytex{TeX} \def\indexdummydots{...} \def\indexnofonts{% \let\w=\indexdummyfont \let\t=\indexdummyfont \let\r=\indexdummyfont \let\i=\indexdummyfont \let\b=\indexdummyfont \let\emph=\indexdummyfont \let\strong=\indexdummyfont \let\cite=\indexdummyfont \let\sc=\indexdummyfont %Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |... %\let\tt=\indexdummyfont \let\tclose=\indexdummyfont \let\code=\indexdummyfont \let\file=\indexdummyfont \let\samp=\indexdummyfont \let\kbd=\indexdummyfont \let\key=\indexdummyfont \let\var=\indexdummyfont \let\TeX=\indexdummytex \let\dots=\indexdummydots } % To define \realbackslash, we must make \ not be an escape. % We must first make another character (@) an escape % so we do not become unable to do a definition. {\catcode`\@=0 \catcode`\\=\other @gdef@realbackslash{\}} \let\indexbackslash=0 %overridden during \printindex. \def\doind #1#2{% {\count10=\lastpenalty % {\indexdummies % Must do this here, since \bf, etc expand at this stage \escapechar=`\\% {\let\folio=0% Expand all macros now EXCEPT \folio \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash in the indx. % % Now process the index-string once, with all font commands turned off, % to get the string to sort the index by. {\indexnofonts \xdef\temp1{#2}% }% % Now produce the complete index entry. We process the index-string again, % this time with font commands expanded, to get what to print in the index. \edef\temp{% \write \csname#1indfile\endcsname{% \realbackslash entry {\temp1}{\folio}{#2}}}% \temp }% }\penalty\count10}} \def\dosubind #1#2#3{% {\count10=\lastpenalty % {\indexdummies % Must do this here, since \bf, etc expand at this stage \escapechar=`\\% {\let\folio=0% \def\rawbackslashxx{\indexbackslash}% % % Now process the index-string once, with all font commands turned off, % to get the string to sort the index by. {\indexnofonts \xdef\temp1{#2 #3}% }% % Now produce the complete index entry. We process the index-string again, % this time with font commands expanded, to get what to print in the index. \edef\temp{% \write \csname#1indfile\endcsname{% \realbackslash entry {\temp1}{\folio}{#2}{#3}}}% \temp }% }\penalty\count10}} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % This is what you call to cause a particular index to get printed. % Write % @unnumbered Function Index % @printindex fn \def\printindex{\parsearg\doprintindex} \def\doprintindex#1{% \tex \dobreak \chapheadingskip {10000} \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other \catcode`\$=\other\catcode`\_=\other \catcode`\~=\other % % The following don't help, since the chars were translated % when the raw index was written, and their fonts were discarded % due to \indexnofonts. %\catcode`\"=\active %\catcode`\^=\active %\catcode`\_=\active %\catcode`\|=\active %\catcode`\<=\active %\catcode`\>=\active % % \def\indexbackslash{\rawbackslashxx} \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt \begindoublecolumns % % See if the index file exists and is nonempty. \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. (Index is nonexistent) \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 (Index is empty) \else \input \jobname.#1s \fi \fi \closein 1 \enddoublecolumns \Etex } % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. % Same as \bigskipamount except no shrink. % \balancecolumns gets confused if there is any shrink. \newskip\initialskipamount \initialskipamount 12pt plus4pt \def\initial #1{% {\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt \ifdim\lastskip<\initialskipamount \removelastskip \penalty-200 \vskip \initialskipamount\fi \line{\secbf#1\hfill}\kern 2pt\penalty10000}} \def\entry #1#2{\begingroup \parfillskip=0in \parskip=0in \parindent=0in % % \hangindent is only relevant when the page number and the entry text % don't fit on one line. In that case, bob suggests starting the dots % pretty far over on the line. % \hangafter is reset to 1 at the start of each paragraph. \hangindent=.75\hsize \noindent % % Don't break the text of the index entry. \hbox{#1}% % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without, a spurious underfull \hbox ensues. \ #2% The page number ends the paragraph. \par \endgroup} % Like \dotfill except takes at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu . \mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary #1#2{ {\parfillskip=0in \parskip=0in \hangindent =1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par }} %% Define two-column mode, which is used in indexes. %% Adapted from the TeXBook, page 416 \catcode `\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \doublecolumnhsize = 3.11in \newdimen\doublecolumnvsize \doublecolumnvsize = 19.1in \newdimen\availdimen@ \def\begindoublecolumns{\begingroup \output={\global\setbox\partialpage= \vbox{\unvbox255\kern -\topskip \kern \baselineskip}}\eject \output={\doublecolumnout}% \hsize=\doublecolumnhsize \vsize=\doublecolumnvsize} \def\enddoublecolumns{\output={\balancecolumns}\eject \endgroup \pagegoal=\vsize} \def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty} \def\pagesofar{\unvbox\partialpage % \hsize=\doublecolumnhsize % have to restore this since output routine % changes it to set cropmarks (P. A. MacKay, 12 Nov. 1986) \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}} \def\balancecolumns{% % Unset the glue. \setbox255=\vbox{\unvbox255} \dimen@=\ht255 \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by2 \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpage % If the remaining data is too big for one page, % output one page normally, then work with what remains. \ifdim \dimen@>\availdimen@ { \splittopskip=\topskip \splitmaxdepth=\maxdepth \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar } % Recompute size of what remains, in case we just output some of it. \dimen@=\ht255 \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by2 \fi \setbox0=\vbox{\unvbox255} \splittopskip=\topskip {\vbadness=10000 \loop \global\setbox3=\copy0 \global\setbox1=\vsplit3 to\dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat} \setbox0=\vbox to\dimen@{\unvbox1} \setbox2=\vbox to\dimen@{\unvbox3} \pagesofar} \catcode `\@=\other \message{sectioning,} % Define chapters, sections, etc. \newcount \chapno \newcount \secno \secno=0 \newcount \subsecno \subsecno=0 \newcount \subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount \appendixno \appendixno = `\@ \def\appendixletter{\char\the\appendixno} \newwrite \contentsfile % This is called from \setfilename. \def\opencontents{\openout \contentsfile = \jobname.toc} % Each @chapter defines this as the name of the chapter. % page headings and footings can use it. @section does likewise \def\thischapter{} \def\thissection{} \def\seccheck#1{\if \pageno<0 % \errmessage{@#1 not allowed after generating table of contents}\fi % } \def\chapternofonts{% \let\rawbackslash=\relax% \let\frenchspacing=\relax% \def\result{\realbackslash result} \def\equiv{\realbackslash equiv} \def\expansion{\realbackslash expansion} \def\print{\realbackslash print} \def\TeX{\realbackslash TeX} \def\dots{\realbackslash dots} \def\copyright{\realbackslash copyright} \def\tt{\realbackslash tt} \def\bf{\realbackslash bf } \def\w{\realbackslash w} \def\less{\realbackslash less} \def\gtr{\realbackslash gtr} \def\hat{\realbackslash hat} \def\char{\realbackslash char} \def\tclose##1{\realbackslash tclose {##1}} \def\code##1{\realbackslash code {##1}} \def\samp##1{\realbackslash samp {##1}} \def\r##1{\realbackslash r {##1}} \def\b##1{\realbackslash b {##1}} \def\key##1{\realbackslash key {##1}} \def\file##1{\realbackslash file {##1}} \def\kbd##1{\realbackslash kbd {##1}} % These are redefined because @smartitalic wouldn't work inside xdef. \def\i##1{\realbackslash i {##1}} \def\cite##1{\realbackslash cite {##1}} \def\var##1{\realbackslash var {##1}} \def\emph##1{\realbackslash emph {##1}} \def\dfn##1{\realbackslash dfn {##1}} } \def\thischaptername{No Chapter Title} \outer\def\chapter{\parsearg\chapterzzz} \def\chapterzzz #1{\seccheck{chapter}% \secno=0 \subsecno=0 \subsubsecno=0 \global\advance \chapno by 1 \message{Chapter \the\chapno}% \chapmacro {#1}{\the\chapno}% \gdef\thissection{#1}% \gdef\thischaptername{#1}% % We don't substitute the actual chapter name into \thischapter % because we don't want its macros evaluated now. \xdef\thischapter{Chapter \the\chapno: \noexpand\thischaptername}% {\chapternofonts% \edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec }} \outer\def\appendix{\parsearg\appendixzzz} \def\appendixzzz #1{\seccheck{appendix}% \secno=0 \subsecno=0 \subsubsecno=0 \global\advance \appendixno by 1 \message{Appendix \appendixletter}% \chapmacro {#1}{Appendix \appendixletter}% \gdef\thissection{#1}% \gdef\thischaptername{#1}% \xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}% {\chapternofonts% \edef\temp{{\realbackslash chapentry {#1}{Appendix \appendixletter}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec }} \outer\def\top{\parsearg\unnumberedzzz} \outer\def\unnumbered{\parsearg\unnumberedzzz} \def\unnumberedzzz #1{\seccheck{unnumbered}% \secno=0 \subsecno=0 \subsubsecno=0 \message{(#1)} \unnumbchapmacro {#1}% \gdef\thischapter{#1}\gdef\thissection{#1}% {\chapternofonts% \edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec }} \outer\def\numberedsec{\parsearg\seczzz} \def\seczzz #1{\seccheck{section}% \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% {\chapternofonts% \edef\temp{{\realbackslash secentry % {#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % \penalty 10000 % }} \outer\def\appendixsection{\parsearg\appendixsectionzzz} \outer\def\appendixsec{\parsearg\appendixsectionzzz} \def\appendixsectionzzz #1{\seccheck{appendixsection}% \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% {\chapternofonts% \edef\temp{{\realbackslash secentry % {#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \penalty 10000 % }} \outer\def\unnumberedsec{\parsearg\unnumberedseczzz} \def\unnumberedseczzz #1{\seccheck{unnumberedsec}% \plainsecheading {#1}\gdef\thissection{#1}% {\chapternofonts% \edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \penalty 10000 % }} \outer\def\numberedsubsec{\parsearg\numberedsubseczzz} \def\numberedsubseczzz #1{\seccheck{subsection}% \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% {\chapternofonts% \edef\temp{{\realbackslash subsecentry % {#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % \penalty 10000 % }} \outer\def\appendixsubsec{\parsearg\appendixsubseczzz} \def\appendixsubseczzz #1{\seccheck{appendixsubsec}% \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% {\chapternofonts% \edef\temp{{\realbackslash subsecentry % {#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \penalty 10000 % }} \outer\def\unnumberedsubsec{\parsearg\unnumberedsubseczzz} \def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% \plainsecheading {#1}\gdef\thissection{#1}% {\chapternofonts% \edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \penalty 10000 % }} \outer\def\numberedsubsubsec{\parsearg\numberedsubsubseczzz} \def\numberedsubsubseczzz #1{\seccheck{subsubsection}% \gdef\thissection{#1}\global\advance \subsubsecno by 1 % \subsubsecheading {#1} {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% {\chapternofonts% \edef\temp{{\realbackslash subsubsecentry % {#1} {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno} {\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % \penalty 10000 % }} \outer\def\appendixsubsubsec{\parsearg\appendixsubsubseczzz} \def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}% \gdef\thissection{#1}\global\advance \subsubsecno by 1 % \subsubsecheading {#1} {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% {\chapternofonts% \edef\temp{{\realbackslash subsubsecentry{#1}% {\appendixletter} {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \penalty 10000 % }} \outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} \def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% \plainsecheading {#1}\gdef\thissection{#1}% {\chapternofonts% \edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \penalty 10000 % }} % These are variants which are not "outer", so they can appear in @ifinfo. % Actually, they should now be obsolete; ordinary section commands should work. \def\infotop{\parsearg\unnumberedzzz} \def\infounnumbered{\parsearg\unnumberedzzz} \def\infounnumberedsec{\parsearg\unnumberedseczzz} \def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} \def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} \def\infoappendix{\parsearg\appendixzzz} \def\infoappendixsec{\parsearg\appendixseczzz} \def\infoappendixsubsec{\parsearg\appendixsubseczzz} \def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} \def\infochapter{\parsearg\chapterzzz} \def\infosection{\parsearg\sectionzzz} \def\infosubsection{\parsearg\subsectionzzz} \def\infosubsubsection{\parsearg\subsubsectionzzz} % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading % NOTE on use of \vbox for chapter headings, section headings, and % such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{\parsearg\majorheadingzzz} \def\majorheadingzzz #1{% {\advance\chapheadingskip by 10pt \chapbreak }% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\penalty 200} \def\chapheading{\parsearg\chapheadingzzz} \def\chapheadingzzz #1{\chapbreak % {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\penalty 200} \def\heading{\parsearg\secheadingi} \def\subheading{\parsearg\subsecheadingi} \def\subsubheading{\parsearg\subsubsecheadingi} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. %%% Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} %%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) \newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} \def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{ \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{ \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{ \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon \def\CHAPFplain{ \global\let\chapmacro=\chfplain \global\let\unnumbchapmacro=\unnchfplain} \def\chfplain #1#2{% \pchapsepmacro {% \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #2\enspace #1}% }% \bigskip \penalty5000 } \def\unnchfplain #1{% \pchapsepmacro % {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\penalty 10000 % } \CHAPFplain % The default \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\penalty 10000 % } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\CHAPFopen{ \global\let\chapmacro=\chfopen \global\let\unnumbchapmacro=\unnchfopen} % Parameter controlling skip before section headings. \newskip \subsecheadingskip \subsecheadingskip = 17pt plus 8pt minus 4pt \def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} \newskip \secheadingskip \secheadingskip = 21pt plus 8pt minus 4pt \def\secheadingbreak{\dobreak \secheadingskip {-1000}} % @paragraphindent is defined for the Info formatting commands only. \let\paragraphindent=\comment % Section fonts are the base font at magstep2, which produces % a size a bit more than 14 points in the default situation. \def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}} \def\plainsecheading #1{\secheadingi {#1}} \def\secheadingi #1{{\advance \secheadingskip by \parskip % \secheadingbreak}% {\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}% \ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } % Subsection fonts are the base font at magstep1, % which produces a size of 12 points. \def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}} \def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip % \subsecheadingbreak}% {\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}% \ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } \def\subsubsecfonts{\subsecfonts} % Maybe this should change: % Perhaps make sssec fonts scaled % magstep half \def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}} \def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip % \subsecheadingbreak}% {\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}% \ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000} \message{toc printing,} % Finish up the main text and prepare to read what we've written % to \contentsfile. \newskip\contentsrightmargin \contentsrightmargin=1in \def\startcontents#1{% \pagealignmacro \immediate\closeout \contentsfile \ifnum \pageno>0 \pageno = -1 % Request roman numbered pages. \fi % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \unnumbchapmacro{#1}\def\thischapter{}% \begingroup % Set up to handle contents files properly. \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. } % Normal (long) toc. \outer\def\contents{% \startcontents{Table of Contents}% \input \jobname.toc \endgroup \vfill \eject } % And just the chapters. \outer\def\summarycontents{% \startcontents{Short Contents}% % \let\chapentry = \shortchapentry \let\unnumbchapentry = \shortunnumberedentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \rm \advance\baselineskip by 1pt % Open it up a little. \def\secentry ##1##2##3##4{} \def\unnumbsecentry ##1##2{} \def\subsecentry ##1##2##3##4##5{} \def\unnumbsubsecentry ##1##2{} \def\subsubsecentry ##1##2##3##4##5##6{} \def\unnumbsubsubsecentry ##1##2{} \input \jobname.toc \endgroup \vfill \eject } \let\shortcontents = \summarycontents % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Chapter-level things, for both the long and short contents. \def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} % See comments in \dochapentry re vbox and related settings \def\shortchapentry#1#2#3{% \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\strut\raggedright {#2\labelspace #1}\dotfill\doshortpageno{#3}}% } \def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} \def\shortunnumberedentry#1#2{% \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\strut\raggedright #1\dotfill\doshortpageno{#2}}% } % Sections. \def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} \def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} % Subsections. \def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} \def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}} % And subsubsections. \def\subsubsecentry#1#2#3#4#5#6{% \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} \def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}} % This parameter controls the indentation of the various levels. \newdimen\tocindent \tocindent = 3pc % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we would want to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip\baselineskip % This \vbox (and similar ones in dosecentry etc.) used to be a % \line; changed to permit linebreaks for long headings. See % comments above \majorheading. Here we also use \strut to % keep the top end of the vbox from jamming up against the previous % entry in the table of contents. \vbox{\chapentryfonts \hyphenpenalty=10000\tolerance=5000 % this line and next introduced \parindent=0pt\strut\raggedright % with \line -> \vbox change #1\dotfill \dopageno{#2}}% \nobreak\vskip .25\baselineskip } \def\dosecentry#1#2{% \vbox{\secentryfonts \leftskip=\tocindent \hyphenpenalty=10000\tolerance=5000 \parindent=0pt\strut\raggedright #1\dotfill \dopageno{#2}}% } \def\dosubsecentry#1#2{% \vbox{\subsecentryfonts \leftskip=2\tocindent \hyphenpenalty=10000\tolerance=5000 \parindent=0pt\strut\raggedright #1\dotfill \dopageno{#2}}% } \def\dosubsubsecentry#1#2{% \vbox{\subsubsecentryfonts \leftskip=3\tocindent \hyphenpenalty=10000\tolerance=5000 \parindent=0pt\strut\raggedright #1\dotfill \dopageno{#2}}% } % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \let\subsecentryfonts = \textfonts \let\subsubsecentryfonts = \textfonts \message{environments,} % Since these characters are used in examples, it should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % Furthermore, these definitions must come after we define our fonts. \newbox\dblarrowbox \newbox\longdblarrowbox \newbox\pushcharbox \newbox\bullbox \newbox\equivbox \newbox\errorbox \let\ptexequiv = \equiv %{\tentt %\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil} %\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil} %\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil} %\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil} % Adapted from the manmac format (p.420 of TeXbook) %\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex % depth .1ex\hfil} %} \def\point{$\star$} \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} % Adapted from the TeXbook's \boxit. {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} \global\setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{ \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % The @error{} command. \def\error{\leavevmode\lower.7ex\copy\errorbox} % @tex ... @end tex escapes into raw Tex temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain tex @ character. \def\tex{\begingroup \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie \catcode `\%=14 \catcode 43=12 \catcode`\"=12 \catcode`\==12 \catcode`\|=12 \catcode`\<=12 \catcode`\>=12 \escapechar=`\\ % \let\{=\ptexlbrace \let\}=\ptexrbrace \let\.=\ptexdot \let\*=\ptexstar \let\dots=\ptexdots \def\@{@}% \let\bullet=\ptexbullet \let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl \let\L=\ptexL % \let\Etex=\endgroup} % Define @lisp ... @endlisp. % @lisp does a \begingroup so it can rebind things, % including the definition of @endlisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^M gets inside @lisp % phr: changed space to \null, to avoid overfull hbox problems. {\obeyspaces% \gdef\lisppar{\null\endgraf}} % Cause \obeyspaces to make each Space cause a word-separation % rather than the default which is that it acts punctuation. % This is because space in tt font looks funny. {\obeyspaces % \gdef\sepspaces{\def {\ }}} \newskip\aboveenvskipamount \aboveenvskipamount= 0pt \def\aboveenvbreak{{\advance\aboveenvskipamount by \parskip \endgraf \ifdim\lastskip<\aboveenvskipamount \removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}} \def\afterenvbreak{\endgraf \ifdim\lastskip<\aboveenvskipamount \removelastskip \penalty-50 \vskip\aboveenvskipamount \fi} % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. \let\nonarrowing=\relax %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \cartouche: draw rectangle w/rounded corners around argument \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \long\def\cartouche{% \begingroup \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt %we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing=\comment \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \hsize=\cartinner \kern3pt \begingroup \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \def\Ecartouche{% \endgroup \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \endgroup }} \def\lisp{\aboveenvbreak \begingroup\inENV % This group ends at the end of the @lisp body \hfuzz=12truept % Don't be fussy % Make spaces be word-separators rather than space tokens. \sepspaces % % Single space lines \singlespace % % The following causes blank lines not to be ignored % by adding a space to the end of each line. \let\par=\lisppar \def\Elisp{\endgroup\afterenvbreak}% \parskip=0pt % @cartouche defines \nonarrowing to inhibit narrowing % at next level down. \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \let\exdent=\nofillexdent \let\nonarrowing=\relax \fi \parindent=0pt \obeyspaces \obeylines \tt \rawbackslash \def\next##1{}\next} \let\example=\lisp \def\Eexample{\Elisp} \let\smallexample=\lisp \def\Esmallexample{\Elisp} % Macro for 9 pt. examples, necessary to print with 5" lines. % From Pavel@xerox. This is not really used unless the % @smallbook command is given. \def\smalllispx{\aboveenvbreak\begingroup\inENV % This group ends at the end of the @lisp body \hfuzz=12truept % Don't be fussy % Make spaces be word-separators rather than space tokens. \sepspaces % % Single space lines \singlespace % % The following causes blank lines not to be ignored % by adding a space to the end of each line. \let\par=\lisppar \def\Esmalllisp{\endgroup\afterenvbreak}% %%%% Smaller baseline skip for small examples. \baselineskip 10pt \parskip=0pt % @cartouche defines \nonarrowing to inhibit narrowing % at next level down. \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \let\exdent=\nofillexdent \let\nonarrowing=\relax \fi \parindent=0pt \obeyspaces \obeylines \ninett \indexfonts \rawbackslash \def\next##1{}\next} % This is @display; same as @lisp except use roman font. \def\display{\begingroup\inENV %This group ends at the end of the @display body \aboveenvbreak % Make spaces be word-separators rather than space tokens. \sepspaces % % Single space lines \singlespace % % The following causes blank lines not to be ignored % by adding a space to the end of each line. \let\par=\lisppar \def\Edisplay{\endgroup\afterenvbreak}% \parskip=0pt % @cartouche defines \nonarrowing to inhibit narrowing % at next level down. \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \let\exdent=\nofillexdent \let\nonarrowing=\relax \fi \parindent=0pt \obeyspaces \obeylines \def\next##1{}\next} % This is @format; same as @lisp except use roman font and don't narrow margins \def\format{\begingroup\inENV %This group ends at the end of the @format body \aboveenvbreak % Make spaces be word-separators rather than space tokens. \sepspaces % \singlespace % % The following causes blank lines not to be ignored % by adding a space to the end of each line. \let\par=\lisppar \def\Eformat{\endgroup\afterenvbreak} \parskip=0pt \parindent=0pt \obeyspaces \obeylines \def\next##1{}\next} % @flushleft and @flushright \def\flushleft{% \begingroup\inENV %This group ends at the end of the @format body \aboveenvbreak % Make spaces be word-separators rather than space tokens. \sepspaces % % The following causes blank lines not to be ignored % by adding a space to the end of each line. % This also causes @ to work when the directive name % is terminated by end of line. \let\par=\lisppar \def\Eflushleft{\endgroup\afterenvbreak}% \parskip=0pt \parindent=0pt \obeyspaces \obeylines \def\next##1{}\next} \def\flushright{% \begingroup\inENV %This group ends at the end of the @format body \aboveenvbreak % Make spaces be word-separators rather than space tokens. \sepspaces % % The following causes blank lines not to be ignored % by adding a space to the end of each line. % This also causes @ to work when the directive name % is terminated by end of line. \let\par=\lisppar \def\Eflushright{\endgroup\afterenvbreak}% \parskip=0pt \parindent=0pt \advance \leftskip by 0pt plus 1fill \obeyspaces \obeylines \def\next##1{}\next} % @quotation - narrow the margins. \def\quotation{% \begingroup\inENV %This group ends at the end of the @quotation body {\parskip=0pt % because we will skip by \parskip too, later \aboveenvbreak}% \singlespace \parindent=0pt \def\Equotation{\par\endgroup\afterenvbreak}% % @cartouche defines \nonarrowing to inhibit narrowing % at next level down. \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \advance \rightskip by \lispnarrowing \exdentamount=\lispnarrowing \let\nonarrowing=\relax \fi} \message{defuns,} % Define formatter for defuns % First, allow user to change definition object font (\df) internally \def\setdeffont #1 {\csname DEF#1\endcsname} \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deftypemargin \deftypemargin=12pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\parencount % define \functionparens, which makes ( and ) and & do special things. % \functionparens affects the group it is contained in. \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\&=\active \catcode`\[=\active \catcode`\]=\active} {\activeparens % Now, smart parens don't turn on until &foo (see \amprm) \gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} % Definitions of (, ) and & used in args for functions. % This is the definition of ( outside of all parentheses. \gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested % \global\advance\parencount by 1 } % % This is the definition of ( when already inside a level of parens. \gdef\opnested{\char`\(\global\advance\parencount by 1 } % \gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. % also in that case restore the outer-level definition of (. \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi \global\advance \parencount by -1 } % If we encounter &foo, then turn on ()-hacking afterwards \gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } % \gdef\normalparens{\boldbrax\let&=\ampnr} } % End of definition inside \activeparens %% These parens (in \boldbrax) actually are a little bolder than the %% contained text. This is especially needed for [ and ] \def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&} \def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}} % First, defname, which formats the header line itself. % #1 should be the function name. % #2 should be the type of definition, such as "Function". \def\defname #1#2{% % Get the values of \leftskip and \rightskip as they were % outside the @def... \dimen2=\leftskip \advance\dimen2 by -\defbodyindent \dimen3=\rightskip \advance\dimen3 by -\defbodyindent \noindent % \setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}% \dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line \dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations \parshape 2 0in \dimen0 \defargsindent \dimen1 % % Now output arg 2 ("Function" or some such) % ending at \deftypemargin from the right margin, % but stuck inside a box of width 0 so it does not interfere with linebreaking {% Adjust \hsize to exclude the ambient margins, % so that \rightline will obey them. \advance \hsize by -\dimen2 \advance \hsize by -\dimen3 \rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}% % Make all lines underfull and no complaints: \tolerance=10000 \hbadness=10000 \advance\leftskip by -\defbodyindent \exdentamount=\defbodyindent {\df #1}\enskip % Generate function name } % Actually process the body of a definition % #1 should be the terminating control sequence, such as \Edefun. % #2 should be the "another name" control sequence, such as \defunx. % #3 should be the control sequence that actually processes the header, % such as \defunheader. \def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2{\begingroup\obeylines\activeparens\spacesplit#3}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup % \catcode 61=\active % \obeylines\activeparens\spacesplit#3} \def\defmethparsebody #1#2#3#4 {\begingroup\inENV % \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup\obeylines\activeparens\spacesplit{#3{#4}}} \def\defopparsebody #1#2#3#4#5 {\begingroup\inENV % \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2##1 ##2 {\def#4{##1}% \begingroup\obeylines\activeparens\spacesplit{#3{##2}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup\obeylines\activeparens\spacesplit{#3{#5}}} % These parsing functions are similar to the preceding ones % except that they do not make parens into active characters. % These are used for "variables" since they have no arguments. \def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2{\begingroup\obeylines\spacesplit#3}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup % \catcode 61=\active % \obeylines\spacesplit#3} \def\defvrparsebody #1#2#3#4 {\begingroup\inENV % \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup\obeylines\spacesplit{#3{#4}}} \def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV % \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2##1 ##2 {\def#4{##1}% \begingroup\obeylines\spacesplit{#3{##2}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup\obeylines\spacesplit{#3{#5}}} % Split up #2 at the first space token. % call #1 with two arguments: % the first is all of #2 before the space token, % the second is all of #2 after that space token. % If #2 contains no space token, all of it is passed as the first arg % and the second is passed as empty. {\obeylines \gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}% \long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{% \ifx\relax #3% #1{#2}{}\else #1{#2}{#3#4}\fi}} % So much for the things common to all kinds of definitions. % Define @defun. % First, define the processing that is wanted for arguments of \defun % Use this to expand the args and terminate the paragraph they make up \def\defunargs #1{\functionparens \sl % Expand, preventing hyphenation at `-' chars. % Note that groups don't affect changes in \hyphenchar. \hyphenchar\tensl=0 #1% \hyphenchar\tensl=45 \ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi% \interlinepenalty=10000 \advance\rightskip by 0pt plus 1fil \endgraf\penalty 10000\vskip -\parskip\penalty 10000% } \def\deftypefunargs #1{% % Expand, preventing hyphenation at `-' chars. % Note that groups don't affect changes in \hyphenchar. \functionparens \code{#1}% \interlinepenalty=10000 \advance\rightskip by 0pt plus 1fil \endgraf\penalty 10000\vskip -\parskip\penalty 10000% } % Do complete processing of one @defun or @defunx line already parsed. % @deffn Command forward-char nchars \def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} \def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% \begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @defun == @deffn Function \def\defun{\defparsebody\Edefun\defunx\defunheader} \def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index \begingroup\defname {#1}{Function}% \defunargs {#2}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @deftypefun int foobar (int @var{foo}, float @var{bar}) \def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} % #1 is the data type. #2 is the name and args. \def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} % #1 is the data type, #2 the name, #3 the args. \def\deftypefunheaderx #1#2 #3\relax{% \doind {fn}{\code{#2}}% Make entry in function index \begingroup\defname {\code{#1} #2}{Function}% \deftypefunargs {#3}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) \def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} % #1 is the classification. #2 is the data type. #3 is the name and args. \def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} % #1 is the classification, #2 the data type, #3 the name, #4 the args. \def\deftypefnheaderx #1#2#3 #4\relax{% \doind {fn}{\code{#3}}% Make entry in function index \begingroup\defname {\code{#2} #3}{#1}% \deftypefunargs {#4}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @defmac == @deffn Macro \def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} \def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index \begingroup\defname {#1}{Macro}% \defunargs {#2}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @defspec == @deffn Special Form \def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} \def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index \begingroup\defname {#1}{Special Form}% \defunargs {#2}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % This definition is run if you use @defunx % anywhere other than immediately after a @defun or @defunx. \def\deffnx #1 {\errmessage{@deffnx in invalid context}} \def\defunx #1 {\errmessage{@defunx in invalid context}} \def\defmacx #1 {\errmessage{@defmacx in invalid context}} \def\defspecx #1 {\errmessage{@defspecx in invalid context}} \def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}} \def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}} % @defmethod, and so on % @defop {Funny Method} foo-class frobnicate argument \def\defop #1 {\def\defoptype{#1}% \defopparsebody\Edefop\defopx\defopheader\defoptype} \def\defopheader #1#2#3{% \dosubind {fn}{\code{#2}}{on #1}% Make entry in function index \begingroup\defname {#2}{\defoptype{} on #1}% \defunargs {#3}\endgroup % } % @defmethod == @defop Method \def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} \def\defmethodheader #1#2#3{% \dosubind {fn}{\code{#2}}{on #1}% entry in function index \begingroup\defname {#2}{Method on #1}% \defunargs {#3}\endgroup % } % @defcv {Class Option} foo-class foo-flag \def\defcv #1 {\def\defcvtype{#1}% \defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} \def\defcvarheader #1#2#3{% \dosubind {vr}{\code{#2}}{of #1}% Make entry in var index \begingroup\defname {#2}{\defcvtype{} of #1}% \defvarargs {#3}\endgroup % } % @defivar == @defcv {Instance Variable} \def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} \def\defivarheader #1#2#3{% \dosubind {vr}{\code{#2}}{of #1}% Make entry in var index \begingroup\defname {#2}{Instance Variable of #1}% \defvarargs {#3}\endgroup % } % These definitions are run if you use @defmethodx, etc., % anywhere other than immediately after a @defmethod, etc. \def\defopx #1 {\errmessage{@defopx in invalid context}} \def\defmethodx #1 {\errmessage{@defmethodx in invalid context}} \def\defcvx #1 {\errmessage{@defcvx in invalid context}} \def\defivarx #1 {\errmessage{@defivarx in invalid context}} % Now @defvar % First, define the processing that is wanted for arguments of @defvar. % This is actually simple: just print them in roman. % This must expand the args and terminate the paragraph they make up \def\defvarargs #1{\normalparens #1% \interlinepenalty=10000 \endgraf\penalty 10000\vskip -\parskip\penalty 10000} % @defvr Counter foo-count \def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} \def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% \begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} % @defvar == @defvr Variable \def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} \def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index \begingroup\defname {#1}{Variable}% \defvarargs {#2}\endgroup % } % @defopt == @defvr {User Option} \def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} \def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index \begingroup\defname {#1}{User Option}% \defvarargs {#2}\endgroup % } % @deftypevar int foobar \def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} % #1 is the data type. #2 is the name. \def\deftypevarheader #1#2{% \doind {vr}{\code{#2}}% Make entry in variables index \begingroup\defname {\code{#1} #2}{Variable}% \interlinepenalty=10000 \endgraf\penalty 10000\vskip -\parskip\penalty 10000 \endgroup} % @deftypevr {Global Flag} int enable \def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} \def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}% \begingroup\defname {\code{#2} #3}{#1} \interlinepenalty=10000 \endgraf\penalty 10000\vskip -\parskip\penalty 10000 \endgroup} % This definition is run if you use @defvarx % anywhere other than immediately after a @defvar or @defvarx. \def\defvrx #1 {\errmessage{@defvrx in invalid context}} \def\defvarx #1 {\errmessage{@defvarx in invalid context}} \def\defoptx #1 {\errmessage{@defoptx in invalid context}} \def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}} \def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}} % Now define @deftp % Args are printed in bold, a slight difference from @defvar. \def\deftpargs #1{\bf \defvarargs{#1}} % @deftp Class window height width ... \def\deftp{\defvrparsebody\Edeftp\deftpx\deftpheader} \def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% \begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} % This definition is run if you use @deftpx, etc % anywhere other than immediately after a @deftp, etc. \def\deftpx #1 {\errmessage{@deftpx in invalid context}} \message{cross reference,} % Define cross-reference macros \newwrite \auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % \setref{foo} defines a cross-reference point named foo. \def\setref#1{% %\dosetq{#1-title}{Ytitle}% \dosetq{#1-pg}{Ypagenumber}% \dosetq{#1-snt}{Ysectionnumberandtype}} \def\unnumbsetref#1{% %\dosetq{#1-title}{Ytitle}% \dosetq{#1-pg}{Ypagenumber}% \dosetq{#1-snt}{Ynothing}} \def\appendixsetref#1{% %\dosetq{#1-title}{Ytitle}% \dosetq{#1-pg}{Ypagenumber}% \dosetq{#1-snt}{Yappendixletterandtype}} % \xref, \pxref, and \ref generate cross-references to specified points. % For \xrefX, #1 is the node name, #2 the name of the Info % cross-reference, #3 the printed node name, #4 the name of the Info % file, #5 the name of the printed manual. All but the node name can be % omitted. % \def\pxref#1{see \xrefX[#1,,,,,,,]} \def\xref#1{See \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup% \def\printedmanual{\ignorespaces #5}% \def\printednodename{\ignorespaces #3}% % \setbox1=\hbox{\printedmanual}% \setbox0=\hbox{\printednodename}% \ifdim \wd0=0pt% \def\printednodename{\ignorespaces #1}% %%% Uncommment the following line to make the actual chapter or section title %%% appear inside the square brackets. %\def\printednodename{#1-title}% \fi% % % % If we use \unhbox0 and \unhbox1 to print the node names, TeX does % not insert empty discretionaries after hyphens, which means that it % will not find a line break at a hyphen in a node names. Since some % manuals are best written with fairly long node names, containing % hyphens, this is a loss. Therefore, we simply give the text of % the node name again, so it is as if TeX is seeing it for the first % time. \ifdim \wd1>0pt section ``\printednodename'' in \cite{\printedmanual}% \else% \turnoffactive% \refx{#1-snt}{} [\printednodename], page\tie\refx{#1-pg}{}% \fi \endgroup} % \dosetq is the interface for calls from other macros % Use \turnoffactive so that punctuation chars such as underscore % work in node names. \def\dosetq #1#2{{\let\folio=0 \turnoffactive% \edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% \next}} % \internalsetq {foo}{page} expands into % CHARACTERS 'xrdef {foo}{...expansion of \Ypage...} % When the aux file is read, ' is the escape character \def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}} % Things to be expanded by \internalsetq \def\Ypagenumber{\folio} \def\Ytitle{\thischapter} \def\Ynothing{} \def\Ysectionnumberandtype{% \ifnum\secno=0 Chapter\xreftie\the\chapno % \else \ifnum \subsecno=0 Section\xreftie\the\chapno.\the\secno % \else \ifnum \subsubsecno=0 % Section\xreftie\the\chapno.\the\secno.\the\subsecno % \else % Section\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % \fi \fi \fi } \def\Yappendixletterandtype{% \ifnum\secno=0 Appendix\xreftie'char\the\appendixno{}% \else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno % \else \ifnum \subsubsecno=0 % Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno % \else % Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % \fi \fi \fi } \gdef\xreftie{'tie} % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Non-3.0. \else \def\linenumber{\the\inputlineno:\space} \fi % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. \def\refx#1#2{% \expandafter\ifx\csname X#1\endcsname\relax % If not defined, say something at least. $\langle$un\-de\-fined$\rangle$% \ifhavexrefs \message{\linenumber Undefined cross reference `#1'.}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \else % It's defined, so just use it. \csname X#1\endcsname \fi #2% Output the suffix in any case. } % Read the last existing aux file, if any. No error if none exists. % This is the macro invoked by entries in the aux file. \def\xrdef #1#2{ {\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}} \def\readauxfile{% \begingroup \catcode `\^^@=\other \catcode `\=\other \catcode `\=\other \catcode `\^^C=\other \catcode `\^^D=\other \catcode `\^^E=\other \catcode `\^^F=\other \catcode `\^^G=\other \catcode `\^^H=\other \catcode `\ =\other \catcode `\^^L=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode 26=\other \catcode `\^^[=\other \catcode `\^^\=\other \catcode `\^^]=\other \catcode `\^^^=\other \catcode `\^^_=\other \catcode `\@=\other \catcode `\^=\other \catcode `\~=\other \catcode `\[=\other \catcode `\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode `\$=\other \catcode `\#=\other \catcode `\&=\other % the aux file uses ' as the escape. % Turn off \ as an escape so we do not lose on % entries which were dumped with control sequences in their names. % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ % Reference to such entries still does not work the way one would wish, % but at least they do not bomb out when the aux file is read in. \catcode `\{=1 \catcode `\}=2 \catcode `\%=\other \catcode `\'=0 \catcode `\\=\other \openin 1 \jobname.aux \ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue \fi % Open the new aux file. Tex will close it automatically at exit. \openout \auxfile=\jobname.aux \endgroup} % Footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for info output only.. \let\footnotestyle=\comment \let\ptexfootnote=\footnote {\catcode `\@=11 \long\gdef\footnote #1{\global\advance \footnoteno by \@ne \unskip \edef\thisfootno{$^{\the\footnoteno}$}% \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi \thisfootno\@sf \footnotezzz{#1}} % \parsearg\footnotezzz} \long\gdef\footnotezzz #1{\insert\footins{ \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \footstrut\parindent=\defaultparindent\hang\textindent{\thisfootno}#1\strut}} }%end \catcode `\@=11 % End of control word definitions. \message{and turning on texinfo input format.} \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % Set some numeric style parameters, for 8.5 x 11 format. %\hsize = 6.5in \newdimen\defaultparindent \defaultparindent = 15pt \parindent = \defaultparindent \parskip 18pt plus 1pt \baselineskip 15pt \advance\topskip by 1.2cm % Prevent underfull vbox error messages. \vbadness=10000 % Following George Bush, just get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. This makes it come to about 9pt for the 8.5x11 format. % \ifx\emergencystretch\thisisundefined \else \emergencystretch = \hsize \divide\emergencystretch by 45 \fi % Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) \def\smallbook{ \global\lispnarrowing = 0.3in \global\baselineskip 12pt \advance\topskip by -1cm \global\parskip 3pt plus 1pt \global\hsize = 5in \global\doublecolumnhsize=2.4in \global\doublecolumnvsize=15.0in \global\vsize=7.5in \global\tolerance=700 \global\hfuzz=1pt \global\contentsrightmargin=0pt \global\pagewidth=\hsize \global\pageheight=\vsize \global\let\smalllisp=\smalllispx \global\let\smallexample=\smalllispx \global\def\Esmallexample{\Esmalllisp} } % Use @afourpaper to print on European A4 paper. \def\afourpaper{ \global\tolerance=700 \global\hfuzz=1pt \global\baselineskip=12pt \global\parskip 15pt plus 1pt \global\vsize= 53\baselineskip \advance\vsize by \topskip %\global\hsize= 5.85in % A4 wide 10pt \global\hsize= 6.5in \global\outerhsize=\hsize \global\advance\outerhsize by 0.5in \global\outervsize=\vsize \global\advance\outervsize by 0.6in \global\doublecolumnhsize=\hsize \global\divide\doublecolumnhsize by 2 \global\advance\doublecolumnhsize by -0.1in \global\doublecolumnvsize=\vsize \global\multiply\doublecolumnvsize by 2 \global\advance\doublecolumnvsize by 0.1in \global\pagewidth=\hsize \global\pageheight=\vsize } %% For a final copy, take out the rectangles %% that mark overfull boxes (in case you have decided %% that the text looks ok even though it passes the margin). \def\finalout{\overfullrule=0pt} % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \catcode`\~=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\+=\other \def\normaldoublequote{"} \def\normaltilde{~} \def\normalcaret{^} \def\normalunderscore{_} \def\normalverticalbar{|} \def\normalless{<} \def\normalgreater{>} \def\normalplus{+} % This macro is used to make a character print one way in ttfont % where it can probably just be output, and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt \char '042}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt \char '176}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} % Subroutine for the previous macro. \def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}} % \lvvmode is equivalent in function to \leavevmode. % Using \leavevmode runs into trouble when written out to % an index file due to the expansion of \leavevmode into ``\unhbox % \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our % magic tricks with @. \def\lvvmode{\vbox to 0pt{}} \catcode`\|=\active \def|{{\tt \char '174}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} %\catcode 27=\active %\def^^[{$\diamondsuit$} % Used sometimes to turn off (effectively) the active characters % even after parsing them. \def\turnoffactive{\let"=\normaldoublequote \let~=\normaltilde \let^=\normalcaret \let_=\normalunderscore \let|=\normalverticalbar \let<=\normalless \let>=\normalgreater \let+=\normalplus} % Set up an active definition for =, but don't enable it most of the time. {\catcode`\==\active \global\def={{\tt \char 61}}} \catcode`\@=0 % \rawbackslashxx output one backslash character in current font \global\chardef\rawbackslashxx=`\\ %{\catcode`\\=\other %@gdef@rawbackslashxx{\}} % \rawbackslash redefines \ as input to do \rawbackslashxx. {\catcode`\\=\active @gdef@rawbackslash{@let\=@rawbackslashxx }} % \normalbackslash outputs one backslash in fixed width font. \def\normalbackslash{{\tt\rawbackslashxx}} % Say @foo, not \foo, in error messages. \escapechar=`\@ % \catcode 17=0 % Define control-q \catcode`\\=\active % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\{ in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % @gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi} %% These look ok in all fonts, so just make them not special. The @rm below %% makes sure that the current font starts out as the newly loaded cmr10 @catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other @textfonts @rm @c Local variables: @c page-delimiter: "^\\\\message" @c End: 07070100008a9e000041ed00000000000000010000000235609ade00000000000000660000000300000000000000000000000b00000004reloc/info07070100008a9f000081a40000000200000002000000013560703c00008b03000000660000000300000000000000000000001500000004reloc/info/gzip.infoInfo file gzip.info, produced by Makeinfo, -*- Text -*- from input file gzip.texi. This file documents the the GNU `gzip' command for compressing files. Copyright (C) 1992-1993 Jean-loup Gailly Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation.  File: gzip.info, Node: Top, Up: (dir) This file documents the `gzip' command to compress files. * Menu: * Copying:: How you can copy and share `gzip'. * Overview:: Preliminary information. * Sample:: Sample output from `gzip'. * Invoking gzip:: How to run `gzip'. * Advanced usage:: Concatenated files. * Environment:: The `GZIP' environment variable * Tapes:: Using `gzip' on tapes. * Problems:: Reporting bugs. * Concept Index:: Index of concepts.  File: gzip.info, Node: Copying, Next: Overview, Up: Top GNU GENERAL PUBLIC LICENSE ************************** Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble ======== The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 1. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 2. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 3. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: 1. You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. 2. You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. 3. If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 4. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: 1. Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, 2. Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, 3. Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 5. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 6. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 7. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 8. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 9. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 10. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 11. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 12. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 13. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs ============================================= If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ONE LINE TO GIVE THE PROGRAM'S NAME AND AN IDEA OF WHAT IT DOES. Copyright (C) 19YY NAME OF AUTHOR This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. SIGNATURE OF TY COON, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.  File: gzip.info, Node: Overview, Next: Sample, Prev: Copying, Up: Top Overview ******** `gzip' reduces the size of the named files using Lempel-Ziv coding (LZ77). Whenever possible, each file is replaced by one with the extension `.gz', while keeping the same ownership modes, access and modification times. (The default extension is `-gz' for VMS, `z' for MSDOS, OS/2 FAT and Atari.) If no files are specified or if a file name is "-", the standard input is compressed to the standard output. `gzip' will only attempt to compress regular files. In particular, it will ignore symbolic links. If the new file name is too long for its file system, `gzip' truncates it. `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. By default, `gzip' keeps the original file name and timestamp in the compressed file. These are used when decompressing the file with the `-N' option. This is useful when the compressed file name was truncated or when the time stamp was not preserved after a file transfer. Compressed files can be restored to their original form using `gzip -d' or `gunzip' or `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. `gunzip' takes a list of files on its command line and replaces each file whose name ends with `.gz', `.z', `.Z', `-gz', `-z' or `_z' and which begins with the correct magic number with an uncompressed file without the original extension. `gunzip' also recognizes the special extensions `.tgz' and `.taz' as shorthands for `.tar.gz' and `.tar.Z' respectively. When compressing, `gzip' uses the `.tgz' extension if necessary instead of truncating a file with a `.tar' extension. `gunzip' can currently decompress files created by `gzip', `zip', `compress' or `pack'. The detection of the input format is automatic. When using the first two formats, `gunzip' checks a 32 bit CRC (cyclic redundancy check). For `pack', `gunzip' checks the uncompressed length. The `compress' format was not designed to allow consistency checks. However `gunzip' is sometimes able to detect a bad `.Z' file. If you get an error when uncompressing a `.Z' file, do not assume that the `.Z' file is correct simply because the standard `uncompress' does not complain. This generally means that the standard `uncompress' 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. Files created by `zip' can be uncompressed by `gzip' only if they have a single member compressed with the 'deflation' method. This feature is only intended to help conversion of `tar.zip' files to the `tar.gz' format. To extract `zip' files with several members, use `unzip' instead of `gunzip'. `zcat' is identical to `gunzip -c'. `zcat' uncompresses either a list of files on the command line or its standard input and writes the uncompressed data on standard output. `zcat' will uncompress files that have the correct magic number whether they have a `.gz' suffix or not. `gzip' uses the Lempel-Ziv algorithm used in `zip' and PKZIP. The amount of compression obtained depends on the size of the input and the distribution of common substrings. Typically, text such as source code or English is reduced by 60-70%. Compression is generally much better than that achieved by LZW (as used in `compress'), Huffman coding (as used in `pack'), or adaptive Huffman coding (`compact'). Compression is always performed, even if the compressed file is slightly larger than the original. The worst case expansion is a few bytes for the `gzip' file header, plus 5 bytes every 32K block, or an expansion ratio of 0.015% for large files. Note that the actual number of used disk blocks almost never increases. `gzip' preserves the mode, ownership and timestamps of files when compressing or decompressing.  File: gzip.info, Node: Sample, Next: Invoking gzip, Prev: Overview, Up: Top Sample Output ************* Here are some realistic examples of running `gzip'. This is the output of the command `gzip -h': gzip 1.2.4 (18 Aug 93) usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...] -c --stdout write on standard output, keep original files unchanged -d --decompress decompress -f --force force overwrite of output file and compress links -h --help give this help -l --list list compressed file contents -L --license display software license -n --no-name do not save or restore the original name and time stamp -N --name save or restore the original name and time stamp -q --quiet suppress all warnings -r --recursive operate recursively on directories -S .suf --suffix .suf use suffix .suf on compressed files -t --test test compressed file integrity -v --verbose verbose mode -V --version display version number -1 --fast compress faster -9 --best compress better file... files to (de)compress. If none given, use standard input. This is the output of the command `gzip -v texinfo.tex': texinfo.tex: 71.6% -- replaced with texinfo.tex.gz The following command will find all `gzip' files in the current directory and subdirectories, and extract them in place without destroying the original: find . -name '*.gz' -print | sed 's/^\(.*\)[.]gz$/gunzip < "&" > "\1"/' | sh  File: gzip.info, Node: Invoking gzip, Next: Advanced usage, Prev: Sample, Up: Top Invoking `gzip' *************** The format for running the `gzip' program is: gzip OPTION ... `gzip' supports the following options: `--stdout' `--to-stdout' `-c' Write output on standard output; keep original files unchanged. If there are several input files, the output consists of a sequence of independently compressed members. To obtain better compression, concatenate all input files before compressing them. `--decompress' `--uncompress' `-d' Decompress. `--force' `-f' Force compression or decompression even if the file has multiple links or the corresponding file already exists, or if the compressed data is read from or written to a terminal. If the input data is not in a format recognized by `gzip', and if the option --stdout is also given, copy the input data without change to the standard ouput: let `zcat' behave as `cat'. If `-f' is not given, and when not running in the background, `gzip' prompts to verify whether an existing file should be overwritten. `--help' `-h' Print an informative help message describing the options then quit. `--list' `-l' 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 (deflate,compress,lzh,pack) crc: the 32-bit CRC of the uncompressed data date & time: time stamp for the uncompressed file 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. `--license' `-L' Display the `gzip' license then quit. `--no-name' `-n' When compressing, do not save the original file name and time stamp 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 `gzip' suffix from the compressed file name) and do not restore the original time stamp if present (copy it from the compressed file). This option is the default when decompressing. `--name' `-N' When compressing, always save the original file name and time stamp; this is the default. When decompressing, restore the original file name and time stamp if present. This option is useful on systems which have a limit on file name length or when the time stamp has been lost after a file transfer. `--quiet' `-q' Suppress all warning messages. `--recursive' `-r' Travel the directory structure recursively. If any of the file names specified on the command line are directories, `gzip' will descend into the directory and compress all the files it finds there (or decompress them in the case of `gunzip'). `--suffix SUF' `-S SUF' 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 are transferred to other systems. 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 `pack'. `--test' `-t' Test. Check the compressed file integrity. `--verbose' `-v' Verbose. Display the name and percentage reduction for each file compressed. `--version' `-V' Version. Display the version number and compilation options, then quit. `--fast' `--best' `-N' Regulate the speed of compression using the specified digit N, where `-1' or `--fast' indicates the fastest compression method (less compression) and `--best' or `-9' indicates the slowest compression method (optimal compression). The default compression level is `-6' (that is, biased towards high compression at expense of speed).  File: gzip.info, Node: Advanced usage, Next: Environment, Prev: Invoking gzip, Up: Top Advanced usage ************** Multiple compressed files can be concatenated. In this case, `gunzip' will extract all members at once. If one member is damaged, other members might still be recovered after removal of the damaged member. Better compression can be usually obtained if all members are decompressed and then recompressed in a single step. This is an example of concatenating `gzip' files: gzip -c file1 > foo.gz gzip -c file2 >> foo.gz Then gunzip -c foo is equivalent to cat file1 file2 In case of damage to one member of a `.gz' file, other members can still be recovered (if the damaged member is removed). However, you can get better compression by compressing all members at once: cat file1 file2 | gzip > foo.gz compresses better than gzip -c file1 file2 > foo.gz If you want to recompress concatenated files to get better compression, do: zcat old.gz | gzip > new.gz If a compressed file consists of several members, the uncompressed size and CRC reported by the `--list' option applies to the last member only. If you need the uncompressed size for all members, you can use: zcat file.gz | wc -c If you wish to create a single archive file with multiple members so that members can later be extracted independently, use an archiver such as `tar' or `zip'. GNU `tar' supports the `-z' option to invoke `gzip' transparently. `gzip' is designed as a complement to `tar', not as a replacement.  File: gzip.info, Node: Environment, Next: Tapes, Prev: Advanced usage, Up: Top Environment *********** The environment variable `GZIP' can hold a set of default options for `gzip'. These options are interpreted first and can be overwritten by explicit command line parameters. For example: for sh: GZIP="-8v --name"; export GZIP for csh: setenv GZIP "-8v --name" for MSDOS: set GZIP=-8v --name On Vax/VMS, the name of the environment variable is `GZIP_OPT', to avoid a conflict with the symbol set for invocation of the program.  File: gzip.info, Node: Tapes, Next: Problems, Prev: Environment, Up: Top Using `gzip' on tapes ********************* When writing compressed data to a tape, it is generally necessary to pad the output with zeroes up to a block boundary. When the data is read and the whole block is passed to `gunzip' for decompression, `gunzip' detects that there is extra trailing garbage after the compressed data and emits a warning by default. You have to use the `--quiet' option to suppress the warning. This option can be set in the `GZIP' environment variable, as in: for sh: GZIP="-q" tar -xfz --block-compress /dev/rst0 for csh: (setenv GZIP "-q"; tar -xfz --block-compress /dev/rst0) 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 `tar') is used for reading and writing compressed data on tapes. (This example assumes you are using the GNU version of `tar'.)  File: gzip.info, Node: Problems, Next: Concept Index, Prev: Tapes, Up: Top Reporting Bugs ************** If you find a bug in `gzip', please send electronic mail to `jloup@chorus.fr' or, if this fails, to `bug-gnu-utils@prep.ai.mit.edu'. Include the version number, which you can find by running `gzip -V'. Also include in your message the hardware and operating system, the compiler used to compile `gzip', a description of the bug behavior, and the input to `gzip' that triggered the bug.  File: gzip.info, Node: Concept Index, Prev: Problems, Up: Top Concept Index ************* * Menu: * Environment: Environment. * bugs: Problems. * concatenated files: Advanced usage. * invoking: Invoking gzip. * options: Invoking gzip. * overview: Overview. * sample: Sample. * tapes: Tapes.  Tag Table: Node: Top864 Node: Copying1344 Node: Overview20602 Node: Sample24911 Node: Invoking gzip26528 Node: Advanced usage31183 Node: Environment32772 Node: Tapes33340 Node: Problems34317 Node: Concept Index34822  End Tag Table 0707010000cefc000041ed00000000000000010000000335609ade00000000000000660000000300000000000000000000000a00000004reloc/man0707010000cefd000041ed00000000000000010000000235609ade00000000000000660000000300000000000000000000000f00000004reloc/man/man10707010000cefe000081a40000000200000002000000013560703c00000510000000660000000300000000000000000000001700000004reloc/man/man1/gzexe.1.TH GZEXE 1 .SH NAME gzexe \- compress executable files in place .SH SYNOPSIS .B gzexe [ name ... ] .SH DESCRIPTION The .I gzexe utility allows you to compress executables in place and have them automatically uncompress and execute when you run them (at a penalty in performance). For example if you execute ``gzexe /bin/cat'' it will create the following two files: .nf .br -r-xr-xr-x 1 root bin 9644 Feb 11 11:16 /bin/cat -r-xr-xr-x 1 bin bin 24576 Nov 23 13:21 /bin/cat~ .fi /bin/cat~ is the original file and /bin/cat is the self-uncompressing executable file. You can remove /bin/cat~ once you are sure that /bin/cat works properly. .PP This utility is most useful on systems with very small disks. .SH OPTIONS .TP .B \-d Decompress the given executables instead of compressing them. .SH "SEE ALSO" 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" .I gzexe attempts to retain the original file attributes on the compressed executable, but you may have to fix them manually in some cases, using .I chmod or .I chown. 0707010000ceff000081a40000000200000002000000013560703c00003663000000660000000300000000000000000000001600000004reloc/man/man1/gzip.1.PU .TH GZIP 1 local .SH NAME gzip, gunzip, zcat \- compress or expand files .SH SYNOPSIS .ll +8 .B gzip .RB [ " \-acdfhlLnNrtvV19 " ] .RB [ \-S\ suffix ] [ .I "name \&..." ] .ll -8 .br .B gunzip .RB [ " \-acfhlLnNrtvV " ] .RB [ \-S\ suffix ] [ .I "name \&..." ] .br .B zcat .RB [ " \-fhLV " ] [ .I "name \&..." ] .SH DESCRIPTION .I Gzip reduces the size of the named files using Lempel-Ziv coding (LZ77). Whenever possible, each file is replaced by one with the extension .B "\&.gz," while keeping the same ownership modes, access and modification times. (The default extension is .B "\-gz" for VMS, .B "z" for MSDOS, OS/2 FAT, Windows NT FAT and Atari.) If no files are specified, or if a file name is "-", the standard input is compressed to the standard output. .I Gzip will only attempt to compress regular files. In particular, it will ignore symbolic links. .PP If the compressed file name is too long for its file system, .I gzip truncates it. .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 By default, .I gzip keeps the original file name and timestamp in the compressed file. These are used when decompressing the file with the .B \-N option. This is useful when the compressed file name was truncated or when the time stamp was not preserved after a file transfer. .PP Compressed files can be restored to their original form using .I gzip -d or .I gunzip or .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 .I gunzip takes a list of files on its command line and replaces each file whose name ends with .gz, -gz, .z, -z, _z or .Z and which begins with the correct magic number with an uncompressed file without the original extension. .I gunzip also recognizes the special extensions .B "\&.tgz" and .B "\&.taz" as shorthands for .B "\&.tar.gz" and .B "\&.tar.Z" respectively. When compressing, .I gzip uses the .B "\&.tgz" extension if necessary instead of truncating a file with a .B "\&.tar" extension. .PP .I gunzip can currently decompress files created by .I gzip, zip, compress, compress -H or .I pack. The detection of the input format is automatic. When using the first two formats, .I gunzip checks a 32 bit CRC. For .I pack, gunzip checks the uncompressed length. The standard .I compress format was not designed to allow consistency checks. However .I gunzip is sometimes able to detect a bad .Z file. If you get an error when uncompressing a .Z file, do not assume that the .Z file is correct simply because the standard .I uncompress does not complain. This generally means that the standard .I uncompress 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 Files created by .I zip can be uncompressed by gzip only if they have a single member compressed with the 'deflation' method. This feature is only intended to help conversion of tar.zip files to the tar.gz format. To extract zip files with several members, use .I unzip instead of .I gunzip. .PP .I zcat is identical to .I gunzip .B \-c. (On some systems, .I zcat may be installed as .I gzcat to preserve the original link to .I compress.) .I zcat uncompresses either a list of files on the command line or its standard input and writes the uncompressed data on standard output. .I zcat will uncompress files that have the correct magic number whether they have a .B "\&.gz" suffix or not. .PP .I Gzip uses the Lempel-Ziv algorithm used in .I zip and PKZIP. The amount of compression obtained depends on the size of the input and the distribution of common substrings. Typically, text such as source code or English is reduced by 60\-70%. Compression is generally much better than that achieved by LZW (as used in .IR compress ), Huffman coding (as used in .IR pack ), or adaptive Huffman coding .RI ( compact ). .PP Compression is always performed, even if the compressed file is slightly larger than the original. The worst case expansion is a few bytes for the gzip file header, plus 5 bytes every 32K block, or an expansion ratio of 0.015% for large files. Note that the actual number of used disk blocks almost never increases. .I gzip preserves the mode, ownership and timestamps of files when compressing or decompressing. .SH OPTIONS .TP .B \-a --ascii 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 to LF when compressing, and LF is converted to CR LF when decompressing. .TP .B \-c --stdout --to-stdout Write output on standard output; keep original files unchanged. If there are several input files, the output consists of a sequence of independently compressed members. To obtain better compression, concatenate all input files before compressing them. .TP .B \-d --decompress --uncompress Decompress. .TP .B \-f --force Force compression or decompression even if the file has multiple links or the corresponding file already exists, or if the compressed data 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 is not given, and when not running in the background, .I gzip prompts to verify whether an existing file should be overwritten. .TP .B \-h --help Display a help screen and quit. .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 --name, the uncompressed name, date and time are those stored within the compress file if present. 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 Display the .I gzip license and quit. .TP .B \-n --no-name When compressing, do not save the original file name and time stamp 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) and do not restore the original time stamp if present (copy it from the compressed file). This option is the default when decompressing. .TP .B \-N --name When compressing, always save the original file name and time stamp; this is the default. When decompressing, restore the original file name and time stamp if present. This option is useful on systems which have a limit on file name length or when the time stamp has been lost after a file transfer. .TP .B \-q --quiet Suppress all warnings. .TP .B \-r --recursive Travel the directory structure recursively. If any of the file names specified on the command line are directories, .I gzip will descend into the directory and compress all the files it finds there (or decompress them in the case of .I gunzip ). .TP .B \-S .suf --suffix .suf 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 are transferred to other systems. 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 .IR pack "(1)". .TP .B \-t --test Test. Check the compressed file integrity. .TP .B \-v --verbose Verbose. Display the name and percentage reduction for each file compressed or decompressed. .TP .B \-V --version Version. Display the version number and compilation options then quit. .TP .B \-# --fast --best Regulate the speed of compression using the specified digit .IR # , where .B \-1 or .B \-\-fast indicates the fastest compression method (less compression) and .B \-9 or .B \-\-best indicates the slowest compression method (best compression). The default compression level is .BR \-6 (that is, biased towards high compression at expense of speed). .SH "ADVANCED USAGE" Multiple compressed files can be concatenated. In this case, .I gunzip will extract all members at once. For example: gzip -c file1 > foo.gz gzip -c file2 >> foo.gz Then gunzip -c foo is equivalent to cat file1 file2 In case of damage to one member of a .gz file, other members can still be recovered (if the damaged member is removed). However, you can get better compression by compressing all members at once: cat file1 file2 | gzip > foo.gz compresses better than gzip -c file1 file2 > foo.gz If you want to recompress concatenated files to get better compression, do: gzip -cd old.gz | gzip > new.gz If a compressed file consists of several members, the uncompressed size and CRC reported by the --list option applies to the last member only. If you need the uncompressed size for all members, you can use: gzip -cd file.gz | wc -c If you wish to create a single archive file with multiple members so that members can later be extracted independently, use an archiver such as tar or zip. GNU tar supports the -z option to invoke gzip transparently. gzip is designed as a complement to tar, not as a replacement. .SH "ENVIRONMENT" The environment variable .B GZIP can hold a set of default options for .I gzip. These options are interpreted first and can be overwritten by explicit command line parameters. For example: for sh: GZIP="-8v --name"; export GZIP for csh: setenv GZIP "-8v --name" for MSDOS: set GZIP=-8v --name On Vax/VMS, the name of the environment variable is GZIP_OPT, to avoid a conflict with the symbol set for invocation of the program. .SH "SEE ALSO" znew(1), zcmp(1), zmore(1), zforce(1), gzexe(1), zip(1), unzip(1), compress(1), pack(1), compact(1) .SH "DIAGNOSTICS" Exit status is normally 0; if an error occurs, exit status is 1. If a warning occurs, exit status is 2. .PP Usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...] .in +8 Invalid options were specified on the command line. .in -8 .IR file : not in gzip format .in +8 The file specified to .I gunzip has not been compressed. .in -8 .IR file: Corrupt input. Use zcat to recover some data. .in +8 The compressed file has been damaged. The data up to the point of failure can be recovered using .in +8 zcat file > recover .in -16 .IR file : compressed with .I xx bits, can only handle .I yy bits .in +8 .I File was compressed (using LZW) by a program that could deal with more .I bits than the decompress code on this machine. Recompress the file with gzip, which compresses better and uses less memory. .in -8 .IR file : already has .gz suffix -- no change .in +8 The file is assumed to be already compressed. Rename the file and try again. .in -8 .I file already exists; do you wish to overwrite (y or n)? .in +8 Respond "y" if you want the output file to be replaced; "n" if not. .in -8 gunzip: corrupt input .in +8 A SIGSEGV violation was detected which usually means that the input file has been corrupted. .in -8 .I "xx.x%" .in +8 Percentage of the input saved by compression. (Relevant only for .BR \-v and .BR \-l \.) .in -8 -- not a regular file or directory: ignored .in +8 When the input file is not a regular file or directory, (e.g. a symbolic link, socket, FIFO, device file), it is left unaltered. .in -8 -- has .I xx other links: unchanged .in +8 The input file has links; it is left unchanged. See .IR ln "(1)" for more information. Use the .B \-f flag to force compression of multiply-linked files. .in -8 .SH CAVEATS When writing compressed data to a tape, it is generally necessary to pad the output with zeroes up to a block boundary. When the data is read and the whole block is passed to .I gunzip for decompression, .I gunzip detects that there is extra trailing garbage after the compressed data and emits a warning by default. You have to use the --quiet option to suppress the warning. This option can be set in the .B GZIP environment variable as in: for sh: GZIP="-q" tar -xfz --block-compress /dev/rst0 for csh: (setenv GZIP -q; tar -xfz --block-compr /dev/rst0 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 tar) is used for reading and writing compressed data on tapes. (This example assumes you are using the GNU version of tar.) .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. In some rare cases, the --best option gives worse compression than the default compression level (-6). On some highly redundant files, .I compress compresses better than .I gzip. 0707010000cf00000081a40000000200000002000000013560703c00000322000000660000000300000000000000000000001700000004reloc/man/man1/zdiff.1.TH ZDIFF 1 .SH NAME zcmp, zdiff \- compare compressed files .SH SYNOPSIS .B zcmp [ cmp_options ] file1 [ file2 ] .br .B zdiff [ diff_options ] file1 [ file2 ] .SH DESCRIPTION .I Zcmp and .I zdiff are used to invoke the .I cmp or the .I diff program on compressed files. All options specified are passed directly to .I cmp or .IR diff "." If only 1 file is specified, then the files compared are .I file1 and an uncompressed .IR file1 ".gz." If two files are specified, then they are uncompressed if necessary and fed to .I cmp or .IR diff "." The exit status from .I cmp or .I diff is preserved. .SH "SEE ALSO" cmp(1), diff(1), zmore(1), zgrep(1), znew(1), zforce(1), gzip(1), gzexe(1) .SH BUGS Messages from the .I cmp or .I diff programs refer to temporary filenames instead of those specified. 0707010000cf01000081a40000000200000002000000013560703c0000024f000000660000000300000000000000000000001800000004reloc/man/man1/zforce.1.TH ZFORCE 1 .SH NAME zforce \- force a '.gz' extension on all gzip files .SH SYNOPSIS .B zforce [ name ... ] .SH DESCRIPTION .I zforce forces a .gz extension on all .I gzip files so that .I gzip will not compress them twice. This can be useful for files with names truncated after a file transfer. On systems with a 14 char limitation on file names, the original name is truncated to make room for the .gz suffix. For example, 12345678901234 is renamed to 12345678901.gz. A file name such as foo.tgz is left intact. .SH "SEE ALSO" gzip(1), znew(1), zmore(1), zgrep(1), zdiff(1), gzexe(1) 0707010000cf02000081a40000000200000002000000013560703c000003be000000660000000300000000000000000000001700000004reloc/man/man1/zgrep.1.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) 0707010000cf03000081a40000000200000002000000013560703c00001082000000660000000300000000000000000000001700000004reloc/man/man1/zmore.1.TH ZMORE 1 .SH NAME zmore \- file perusal filter for crt viewing of compressed text .SH SYNOPSIS .B zmore [ name ... ] .SH DESCRIPTION .I Zmore is a filter which allows examination of compressed or plain text files one screenful at a time on a soft-copy terminal. .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. If the user then types a carriage return, one more line is displayed. If the user hits a space, another screenful is displayed. Other possibilities are enumerated later. .PP .I Zmore looks in the file .I /etc/termcap to determine terminal characteristics, and to determine the default window size. On a terminal capable of displaying 24 lines, the default window size is 22 lines. To use a pager other than the default .I more, set environment variable PAGER to the name of the desired program, such as .I less. .PP Other sequences which may be typed when .I zmore pauses, and their effects, are as follows (\fIi\fP is an optional integer argument, defaulting to 1) : .PP .IP \fIi\|\fP display .I i more lines, (or another screenful if no argument is given) .PP .IP ^D display 11 more lines (a ``scroll''). If .I i is given, then the scroll size is set to \fIi\|\fP. .PP .IP d same as ^D (control-D) .PP .IP \fIi\|\fPz same as typing a space except that \fIi\|\fP, if present, becomes the new window size. Note that the window size reverts back to the default at the end of the current file. .PP .IP \fIi\|\fPs skip \fIi\|\fP lines and print a screenful of lines .PP .IP \fIi\|\fPf skip \fIi\fP screenfuls and print a screenful of lines .PP .IP "q or Q" quit reading the current file; go on to the next (if any) .PP .IP "e or q" When the prompt --More--(Next file: .IR file ) is printed, this command causes zmore to exit. .PP .IP s When the prompt --More--(Next file: .IR file ) is printed, this command causes zmore to skip the next file and continue. .PP .IP = Display the current line number. .PP .IP \fIi\|\fP/expr search for the \fIi\|\fP-th occurrence of the regular expression \fIexpr.\fP If the pattern is not found, .I zmore goes on to the next file (if any). Otherwise, a screenful is displayed, starting two lines before the place where the expression was found. The user's erase and kill characters may be used to edit the regular expression. Erasing back past the first column cancels the search command. .PP .IP \fIi\|\fPn search for the \fIi\|\fP-th occurrence of the last regular expression entered. .PP .IP !command invoke a shell with \fIcommand\|\fP. The character `!' in "command" are replaced with the previous shell command. The sequence "\\!" is replaced by "!". .PP .IP ":q or :Q" quit reading the current file; go on to the next (if any) (same as q or Q). .PP .IP . (dot) repeat the previous command. .PP The commands take effect immediately, i.e., it is not necessary to type a carriage return. Up to the time when the command character itself is given, the user may hit the line kill character to cancel the numerical argument being formed. In addition, the user may hit the erase character to redisplay the --More-- message. .PP At any time when output is being sent to the terminal, the user can hit the quit key (normally control\-\\). .I Zmore will stop sending output, and will display the usual --More-- prompt. The user may then enter one of the above commands in the normal manner. Unfortunately, some output is lost when this is done, due to the fact that any characters waiting in the terminal's output queue are flushed when the quit signal occurs. .PP The terminal is set to .I noecho mode by this program so that the output can be continuous. What you type will thus not show on your terminal, except for the / and ! commands. .PP If the standard output is not a teletype, then .I zmore acts just like .I zcat, except that a header is printed before each file. .SH FILES .DT /etc/termcap Terminal data base .SH "SEE ALSO" more(1), gzip(1), zdiff(1), zgrep(1), znew(1), zforce(1), gzexe(1) 0707010000cf04000081a40000000200000002000000013560703c000003e7000000660000000300000000000000000000001600000004reloc/man/man1/znew.1.TH ZNEW 1 .SH NAME znew \- recompress .Z files to .gz files .SH SYNOPSIS .B znew [ -ftv9PK] [ name.Z ... ] .SH DESCRIPTION .I Znew recompresses files from .Z (compress) format to .gz (gzip) format. If you want to recompress a file already in gzip format, rename the file to force a .Z extension then apply znew. .SH OPTIONS .TP .B \-f Force recompression from .Z to .gz format even if a .gz file already exists. .TP .B \-t Tests the new files before deleting originals. .TP .B \-v Verbose. Display the name and percentage reduction for each file compressed. .TP .B \-9 Use the slowest compression method (optimal compression). .TP .B \-P Use pipes for the conversion to reduce disk space usage. .TP .B \-K Keep a .Z file when it is smaller than the .gz file .SH "SEE ALSO" gzip(1), zmore(1), zdiff(1), zgrep(1), zforce(1), gzexe(1), compress(1) .SH BUGS .I Znew does not maintain the time stamp with the -P option if .I cpmod(1) is not available and .I touch(1) does not support the -r option. 07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000b00000000TRAILER!!!