allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (10/01/89)
Posting-number: Volume 8, Issue 70 Submitted-by: howard@dahlbeck.ericsson.se (Howard Gayle) Archive-name: cz/part06 #! /bin/sh # This is a shell archive. Remove anything before this line, then feed it # into a shell via "sh file" or similar. To overwrite existing files, # type "sh file -c". # The tool that generated this appeared in the comp.sources.unix newsgroup; # send mail to comp-sources-unix@uunet.uu.net if you want that tool. # If this archive is complete, you will see the following message at the end: # "End of archive 6 (of 14)." # Contents: cz0.1 cz0.h es.rc fr.rc get-fonts.ps # Wrapped by howard@dahlbeck on Mon Sep 25 07:15:18 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'cz0.1' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'cz0.1'\" else echo shar: Extracting \"'cz0.1'\" \(25996 characters\) sed "s/^X//" >'cz0.1' <<'END_OF_FILE' X.\" $Header: cz0.1,v 2.13 89/08/30 10:27:19 howard Exp $ X.TH CZ0 1 "$Revision: 2.13 $" X.SH NAME Xcz0 \- convert text files to PostScript X.SH SYNOPSIS X.B cz0 X[ X.B \-o X.I stream X] X.I command \&.\|.\|. X.SH COPYRIGHT XCopyright \(co 1989 Howard Lee Gayle X.SH DESCRIPTION X.I Cz0 Xconverts one or more files into PostScript. XIt is table-driven, and can be set up to handle files in any Xcontext-free octet-based character set, X.I i.e. Xany character set where each character is represented by a Xsequence of one or more octets (8-bit bytes). XDifferent characters may be represented by different numbers of Xoctets. XThe meaning of the sequence of octets corresponding to one Xcharacter may depend only on those octets, and not on any other Xoctets in the file. XThis excludes character sets that use locking shift operations, X.I e.g. XISO 2022. X.PP X.I Cz0 Xcan use, but does not need, the composite font extensions to PostScript. X.PP X.I Cz0 Xwrites its output to X.IR stream , Xwhich is either a file or the standard input of a command. XCommands are marked by an initial pipe character (\||\|). XThe default X.I stream Xis standard output. X.PP XOutput conforms to Adobe document structuring conventions Xversion 2.1. X.SH "A NOTE ON COLUMNS" X.I Cz Xdeals with three different kinds of columns. XInput columns are column positions (after horizontal tab expansion) in Xinput lines. XOutput columns are column positions in output lines. XOne input line may be folded into more than one output line. XPage columns are columns of output lines on an output page. X.SH COMMANDS XEvery command has exactly one argument. XCommands can be given to X.I cz0 Xin one of three ways: Xcommand X.RI ( .rc ) Xfiles, environment variables, and command line arguments. X.PP XIn command files, comments start with a semicolon (;) and Xcontinue to the end of the line. XOnce comments, blank lines, lines containing only comments, and Xleading and trailing white space have been stripped, each line Xof a command file should consist of one command followed by Xwhite space followed by the argument. X.PP X.I Cz0 Xsearches for command file X.I x.rc Xon the command file search path, a colon-separated list of Xdirectories. XIt executes the commands in all X.I x.rc Xfiles that it finds along the search path. XIt does not stop with the first file, but continues Xto search the entire search path. XAt the same time, if X.I cz0 Xencounters any X.I x.ps Xfiles along the search path, then it copies their contents to X.IR stream . XThe default search path can be overridden by the CZ_PATH Xenvironment variable. X.PP XWhen X.I cz0 Xstarts, it first searches for command files named X.IR header.rc . XIt then writes an %%EndComments comment to X.IR stream . XHeader comments can thus be placed in X.IR header.ps . X.PP XNext, X.I cz0 Xsearches for command files named X.IR prolog-beg.rc . XIt then executes any commands encoded as environment variables. XThe environment variable X.RI CZ_ c Xencodes command X.IR c ; Xthe value of the environment variable is taken as the argument Xof the command. XIt then Xexecutes commands passed as command-line arguments, preceded by Xhypens (\-). XIt then searches for command files named X.IR prolog-end.rc . XIt then writes an %%EndProlog comment to X.IR stream . XFinally, X.I cz0 Xprocesses all files. X.PP X.I Cz0 Xrecognizes the commands listed below. XCase (upper or lower) is significant. XUnless otherwise indicated, a command applies until overridden. X.PP XThe metavariable X.I b Xindicates a Boolean value: either false or true. XThe metavariable X.I c Xindicates an input column number: Xeither an Ada integer literal or Inf for the maximum possible Xinput column. XThe metavariable X.I d Xindicates a dimension in one of the units listed below. XDimensions follow the syntax for Ada real literals, followed by Xone of the two-letter unit abbreviations listed below. XThe metavariable X.I i Xindicates an integer. XIntegers follow the syntax for Ada integer literals. X.nr xx (\w'BottomMarginLandscape d'u+2n)/1n X.TP \n(xx X.BI AutoColumn n " c" XIf a page with X.I n Xcolumns would contain an input line with more than X.I c Xinput columns, try instead a page with one less page column. XThe default for all legal values of X.I n Xis Inf. X.TP X.BI AutoFile " b" XIf true, apply AutoColumn and AutoLandscape on a per-file Xbasis. XIf false (the default), apply them on a per-page basis. X.TP X.BI AutoLandscape " c" XIf a page in portrait mode would contain an input line with more than X.I c Xinput columns, print the page in landscape mode instead. X(Thus, the way to force landscape mode for all pages is to give Xan argument of 0.) X.TP X.BI BodySize " d" XUse X.I d Xfor the body font size. XDefault 11.0bp. X.TP X.BI BottomMarginLandscape " d" XUse X.I d Xfor the distance from the footer baseline to the bottom of the Xpage in landscape mode. XDefault 15.0mm. X.TP X.BI BottomMarginPortrait " d" XUse X.I d Xfor the distance from the footer baseline to the bottom of the Xpage in portrait mode. XDefault 15.0mm. X.TP X.BI BottomSkip " d" XUse X.I d Xfor the distance from the baseline of the last body line to the Xtop of the footer line. XDefault 10.0mm. X.TP X.BI CommandFile " f" XSearch the command file search path for all files named X.I f.rc Xand execute the commands in them. XAlso, search for all files named X.I f.ps Xand copy their contents to X.IR stream . XThe X.B CommandFile Xcommand can appear in command files. XIf X.I f Xis X.B \- Xthen commands are read from the standard input, and no X.I .ps Xfile is searched for. X.TP X.BI Columns " i" XTry to use X.I i Xfor the number of page columns on each page. XThe actual number of page columns on a page may be reduced by Xthe AutoColumn command. XDefault 1. X.TP X.BI ColumnSeparation " d" XUse X.I d Xfor the distance between page columns. XDefault 5.0mm. X.TP X.BI Debug " i" XSet the debugging message verbosity to X.IR i , Xwhere 0 indicates no debugging messages (default) and 9 Xindicates maximum verbosity. X.TP X.BI EndControlD " b" XIf true, write a control-D character at the very end of X.IR stream . XDefault false. X.TP X.BI FixedWidthBodyFont " f" XUse X.I f Xas the body font for fixed-width mode. XDefault Courier. X.TP X.BI File " f" XConvert text file X.I f Xto PostScript. XFile and Header commands are stored together in a vector. XThen, after all commands have been executed, X.I cz0 Xsteps through the vector and converts each file. XFile X.B \- Xindicates the standard input. X.TP X.BI FixedWidth " b" XIf true, use fixed-width mode. XIf false (default), use variable-width mode. X.TP X.BI FoldFirst " c" XIf an output line would exceed X.I c Xcolumns, fold it. XDefault Inf. XAll but the last output line produced from a folded input line Xare marked by a symbol (default double down arrow) Xat the ends of the lines. XAll but the first output line produced from a folded input line Xare indented. XThese indented lines are known as continuation lines, XAutoColumn and AutoLandscape checking is done before Xline folding. X.TP X.BI FoldIndent " d" XIndent folded continuation lines by this amount. XDefault 15.0mm. X.TP X.BI FoldRest " c" XIf a continuation line would exceed X.I c Xoutput columns, fold it. XDefault Inf. X.TP X.BI FooterFont " f" XUse X.I f Xas the footer font. XDefault Times-Roman. X.TP X.BI FooterHeight " d" XUse X.I d Xfor the height of the footer. XDefault 11.0bp. X.TP X.BI Header " h" XUse string X.I h Xas the header for the next X.B File Xcommand. XIf no header is specified, the name of the file is used. X.TP X.BI HeaderFont " f" XUse X.I f Xas the header font. XDefault Helvetica-Bold. X.TP X.BI HeaderHeight " d" XUse X.I d Xfor the height of the header. XDefault 12.0bp. X.TP X.BI LandscapeRotation " i" XRotate a landscape-mode page by X.I i Xdegrees. XThe value must be either 90 (default) or -90. XPositive rotation of a page with holes puts the holes at the Xtop of the page; negative rotation puts them at the bottom. X.TP X.BI LeftMarginLandscape " d" XUse X.I d Xas the distance from the left edge of the paper to the left Xedge of the leftmost column of body text, in Xlandscape mode. XDefault 10.0mm. X.TP X.BI LeftMarginPortrait " d" XUse X.I d Xas the distance from the left edge of the paper to the left Xedge of the leftmost column of body text, in Xportrait mode. XDefault 10.0mm. X.TP X.BI LineNumberFont " f" XUse X.I f Xas the line number font. XDefault Times-Roman. X.TP X.BI LineNumberHeight " d" XUse X.I d Xfor the height of the line numbers. XDefault 5.0bp. X.TP X.BI LineNumberMultiple " i" XPrint line numbers that are a multiple of X.IR i . XDefault 5. XZero suppresses printing of line numbers. XIf line numbers are being printed, then a line number is always Xprinted for the last line in the file, even if it is not a Xmultiple of X.IR i . X.TP X.BI LineNumberWidth " d" XUse X.I d Xas the width of the line numbers. XDefault 5.0mm. XTurning off line number printing does not change this value. X.TP X.BI Octet "s.o p" XIn state X.I s Xif octet X.I o Xappears in the input, emit output pattern X.IR p . XThe interpretation of output patterns is discussed below. X.I s Xand X.I o Xare Ada-syntax integer literals. XBy default, state 0 is set up for ISO 8859/1, and no other Xstates are defined. X.TP X.BI PageHeight " d" XUse X.I d Xas the height of the paper in portrait mode. XDefault 297.0mm (European A4 size). X.TP X.BI PageWidth " d" XUse X.I d Xas the width of the paper in portrait mode. XDefault 210.0mm (European A4 size). X.TP X.BI PostScript " p" XCopy (PostScript) string X.I p Xto X.I stream. X.TP X.BI Reverse " b" XIf false, Xprocess the vector of files and headers from first to last. XIf true (default), Xprocess the vector in reverse order, and reverse the Xoutput pages of each file. XThis command applies to the entire job. X.TP X.BI RightMarginLandscape " d" XUse X.I d Xas the distance from the right edge of the rightmost column of Xbody text to the right edge of the paper, in landscape mode. XDefault 11.0mm. X.TP X.BI RightMarginPortrait " d" XUse X.I d Xas the distance from the right edge of the rightmost column of Xbody text to the right edge of the paper, in portrait mode. XDefault 11.0mm. X.TP X.BI Spacing " s" XUse Ada real literal X.I s Xas the body font spacing factor. XThe leading (distance from one baseline to the next) is thus X.I s Xtimes the body font size. XDefault 1.0. X.TP X.BI SymbolFont " f" XUse X.I f Xas the symbol font. XDefault Symbol. X.TP X.BI TabWidth " i" XUse X.I i Xfor the number of spaces between horizontal tab characters. XDefault 8. X.TP X.BI TextVertical " b" XIf true, text is written from the top of the page downward. XIf false (the default), text is written either from left to Xright or from right to left. X.TP X.BI TopMarginLandscape " d" XUse X.I d Xas the distance from the top of the paper to the top of the Xheader, in landscape mode. XDefault 15.0mm. X.TP X.BI TopMarginPortrait " d" XUse X.I d Xas the distance from the top of the paper to the top of the Xheader, in portrait mode. XDefault 15.0mm. X.TP X.BI TopSkip " d" XUse X.I d Xas the distance from the header baseline to the top of the Xtopmost line of body text. XDefault 10.0mm. X.TP X.BI Undefine "s o" XIn state X.I s Xif octet X.I o Xhas a corresponding output pattern, delete it. XIf X.I o Xis X.B All Xthen the entire state is deleted. X.I s Xand X.I o Xare Ada-syntax integer literals. X.TP X.BI VariableWidthBodyFont " f" XUse X.I f Xas the body font for variable-width mode. XDefault Times-Roman. X.TP X.BI VerticalText " b" XIf false (default), Xassume text runs either left-to-right or right-to-left. XIf true, Xassume text runs from top to bottom. X.TP X.BI XAdjust " d" XTranslate the output a distance X.I d Xalong the X.I x Xaxis. X.TP X.BI YAdjust " d" XTranslate the output a distance X.I d Xalong the X.I y Xaxis. X.SH "TYPOGRAPHICAL UNITS" X.I cz0 Xuses the same units as TeX: X.nr xx (\w'mm'u+2n)/1n X.TP \n(xx X.B bp XBig point. X72.0bp = 1.0in. XThese are the default units used by PostScript. X.TP X.B cc XCicero. X1.0cc = 12.0dd. X.TP X.B cm XCentimeter. X.TP X.B dd XDidot point. X1157.0dd = 1238.0pt. X.TP X.B in XInch. X.TP X.B mm XMillimeter. X.TP X.B pc XPica. X1.0pc = 12.0pt. X.TP X.B pt XPoint. X72.27pt = 1.0in. X.SH "OUTPUT PATTERNS" XAn output pattern is just a string, with perhaps some embedded Xtwo-character escapes. XThe following escapes are supported: X.nr xx (\w'+si'u+2n)/1n X.TP \n(xx X.B +( XIf a PostScript string is not currently being emitted, start one. XOtherwise, do nothing. X.TP X.B +) XIf a PostScript string is currently being emitted, end it and Xemit a PostScript "S" (show) command. XOtherwise, do nothing. X.TP X.B +c XEmit a semicolon (;), the command file comment character. X.TP X.B +e XEmit a plus sign (+), the output pattern escape character. X.TP X.B +f XEnd the current column. XThe form-feed control character is normally associated with this. X.TP X.B +l XEnd the current line. XThe newline control character is normally associated with this. X.TP X.B +p XEnd the current page. XThe form-feed control character can be associated with this if Xa form-feed should end the whole page, even for multi-column output. X.TP X.BI +s i XChange to state X.IR i , Xwhere X.I i Xis an Ada-syntax integer literal. XIf this escape sequence appears in an output pattern, it must Xappear last. XThe default is to return to state 0. X.TP X.B +t XEmit the number of spaces corresponding to a horizontal tab in Xthe current column. X.SH "LINE FOLDING AND TABS" XFor the purpose of line folding, a horizontal tab is treated as Xa single character. XIt either expands entirely before the line break, or it expands Xentirely on the continuation line. XFor this reason, the FoldFirst and FoldRest commands should Xhave arguments that are one greater than the TabWidth, X.I e.g. XTabWidth 8 FoldFirst 81 FoldRest 73. XIf you want tabs to be treated just like the corresponding Xnumber of spaces, run the input file through X.IR expand (1) Xfirst. X.SH "GNU EMACS INTERFACE" XThe GNU Emacs elisp code in X.I cz.el[c] Xdefines the functions cz-buffer and cz-region, analogous to Xlpr-buffer and lpr-region. XOutput from the X.I cz0 Xcommand is placed in a buffer named *cz*; Xlook there for error messages. XThe following elisp variables are defined: X.nr xx (\w'cz-AutoLandscape 'u+2n)/1n X.TP \n(xx X.B cz-AutoLandscape XIf not-nil, this should be a string. XIt will be passed to X.IR cz0 . XFor example, to force landscape mode set it to "0". X.TP X.B cz-CommandFile XIf not-nil, this should be a string. XIt will be passed to X.IR cz0 . XFor example, to print a SWASCII buffer set it to "se". X.TP X.B cz-FixedWidth XIf not-nil, this should be a string. XIt will be passed to X.IR cz0 . XFor example, to force fixed-width output set it to "true". X.TP X.B cz-output XIf not-nil, this should be a string. XIt will be passed to X.I cz0 Xafter the X.B \-o Xoption. XFor example, if the print spooling command on your system is Xnamed lp, set cz-output to "|\|lp". X.SH "GNEWS INTERFACE" XThe GNU Emacs elisp code in X.I cz-Gnews.el[c] Xdefines the function Gnews-cz, and binds it to "L" (for Laser) in Gnews Xarticle and group modes. XThis function runs X.I cz0 Xon the current article. X.SH "RMAIL INTERFACE" XThe GNU Emacs elisp code in X.I cz-rmail.el[c] Xdefines the function cz-rmail, and binds it to "L" in rmail mode. XThis function runs X.I cz0 Xon the current message. X.SH CUSTOMIZATION XCustomization involves setting up X.I .rc Xand X.I .ps Xfiles. XTypically, there will be shared files for each host. XIn addition, individual users may want their own. XThese files must be in directories on the command file search path. XFor individuals, the easiest way to arrange this is to set up Xthe CZ_PATH environment variable on login. XFor example, if I use X.IR csh (1), Xand the default search path is X/usr/local/free/cz/0/lib, Xand I also want the directory Xcz searched, where cz is a subdirectory of my login directory, Xthen I can put the line X.nf X setenv CZ_PATH "/usr/local/free/cz/0/lib:$home/cz" X.fi Xin my X.I .login Xfile. XI search my own cz directory X.I after Xsearching the default directory, so that I can override Xsettings from the default files. X.SH EXAMPLES XIn this section I change from the usual UNIX manual format to a Xquestion-and-answer format. X.PP XNone of this wimpy 11 point body font garbage for me. XI want a macho 9 point default body font. XHow? XAnswer: Xin your private X.I header.rc Xfile, add: X.nf X BodySize 9.0bp X.fi XI use bp units for font sizes. XOf course, PostScript can handle non-integral units, but "round" XPostScript internal units are probably more efficient on most Xoutput devices. X.PP XWe use 8.5 by 11 inch paper, not that furrun A4 stuff. XWhat do we do? XAnswer: Xin the X.I header.rc Xfile on the default search path, add: X.nf X PageHeight 11.0in X PageWidth 8.5in X.fi X.PP XHow can I run X.IR cz (1) Xon one file, but with the lines double-spaced? XAnswer: Xset the environment variable CZ_Spacing to 2.0 while you run X.IR cz : X.nf X env CZ_Spacing=2.0 cz foo X.fi X.PP XWe have an old laser named lemon with bad alignment. XEven after using the PostScript setmargins command, the X.I y Xaxis is still 10.0mm to the right of the left edge of the paper. XWhat to do? XAnswer: Xcreate a file named X.I cz-Plemon.rc Xon the default search path. XIn it, put: X.nf X XAdjust -10.0mm X.fi XAll the Margin commands should be set assuming the Xorigin is at the bottom left corner of the paper; only XXAdjust and Yadjust should be used to deal with misaligned printers. X.PP XHow can I get line numbers every 10 lines, instead of the Xdefault 5? XAnswer: Xadd the following to your private X.I header.rc Xfile: X.nf X LineNumberMultiple 10 X.fi X.PP XNew Century Schoolbook is X.I so Xmuch prettier than Times Roman. XHow can I get it for the variable-width body font for ISO X8859/1 documents? XAnswer: Xin your private X.I 8859-1.rc Xfile, add: X.nf X VariableWidthBodyFont NewCenturySchlbk-Roman X.fi X.PP XI want a great big sign that says NO BOZOS. XAnswer: X.I cz0 Xis not really intended for making signs, but try this. XFirst, put the text in file X.IR boz , Xone word per line. XThen run X.nf X % cz0 \-o '\||\|lpr' \-BodySize 3.0in \-CommandFile 8859\-1 \-FooterHeight 1.0bp \e X \-HeaderHeight 1.0bp \-AutoLandscape 0 \-TopSkip 0.0bp \-Header ' ' \-File boz X.fi X.PP XI have a file named foo that I want to print with X.IR cz (1). XMost of the lines in the file are shorter than 40 columns, but Xthere are a few very long lines. XI want to print the file in two-column portrait mode, but if a Xpage would have a line about 40-80 input columns long, then Xthat page should be in single-column mode. XIf a line is even longer, about 80-120 input columns, the page Xshould be single-column landscape mode. XLines longer than that should be folded. XAnswer: X.nf X env CZ_AutoColumn2=40 CZ_AutoLandscape=80 CZ_FoldFirst=121 CZ_FoldRest=113 cz \-2 foo X.fi X.SH FILES X(All paths starting with ./ are relative to the directory in which X.I cz Xis installed.) X.DT X.nf X*.rc \- command files X*.ps \- PostScript files X/tmp/cz* \- temporary files X\&./el/cz.elc \- GNU Emacs interface X\&./el/cz-rmail.elc \- for RMAIL L command X\&./el/cz-Gnews.elc \- for Gnews L command X\&./test/8859-1.t \- description of ISO 8859/1 X\&./test/8859-1-fox.t \- test text for ISO 8859/1 X\&./test/T-61.t \- description of CCITT T.61 X\&./test/char8-oct.t \- an 8-bit character set in octal X\&./test/char8-dec.t \- an 8-bit character set in decimal X\&./test/char8-hex.t \- an 8-bit character set in hexadecimal X\&./test/get-fonts.ps \- tells you what fonts your laser has X\&./test/laser-dr.ps \- tells you about your laser X.fi X.SH "SEE ALSO" X.IR cz (1) X.SH BUGS XReal literals must be decimal; based real literals are not implemented. XThere is no checking for circular command file references. X.SH "IN FUTURE" XI might try to handle context-sensitive character sets like ISO 2022. X.SH ETYMOLOGY XThe Xerox Alto had a command to convert ASCII text files to Xpress files for printing on Dover laser printers. XThis command was called empress. XWhen the Carnegie-Mellon University Computer Science Department Xacquired a Dover, they wrote a similar program for their XVAX/UNIX systems. XThis program was named cz, because a czarina is a kind of Xempress, and the UNIX convention is short command names. X.SH ACKNOWLEDGEMENTS XI thank Dick Ernmark and Robert Penny for help with testing. XSome of the PostScript code is based on code written by Timothy XHayes and Glenn Reid. XJim Sullivan wrote Laser Doctor. XAnders Ulfheden wrote get-fonts.ps. X.SH "HARANGUE, OR WHY I HATE POSTSCRIPT" XThis section is a flame. XThe reader interested only in documentation of the X.I cz Xsystem may safely skip this section. X.PP XI wrote the X.I cz Xsystem to produce PostScript output because PostScript has Xbecome a X.I de facto Xstandard, Xnot because I approve of PostScript. XMy objections to PostScript are that it needlessly complicates Xwhat should be a simple interface between host and printer, and Xthat it discourages making that interface fast. X.PP XPostScript is undeniably complex. XThree books with a total of 789 pages, Xand a total price of X$62.85, Xare still insufficient to learn and completely describe the Xlanguage. XOne must in addition read various supplementary documents on X.I e.g. Xlanguage changes and composite fonts. XBut this is still not enough, because there are also Xstructuring conventions that amount to another entire language Xwith its own manual. X.PP XThis complexity has many drawbacks. XSince most operating systems rightly view printers as batch Xoutput devices, debugging a PostScript program is often a Xtedious process of trial and error, with little or no feedback Xabout where the error lies. XEven if a laser printer can be tied up for exclusive Xinteractive use by one programmer, the debugging interface is Xmuch inferior to X.I e.g. Xgdb. XAnd in the usual case, the debugging interface is a couple of Xblinking lights. X.PP XThe Turing equivalence of PostScript means that it is Ximpossible to determine the running time or number of pages of Xoutput of a PostScript program without actually running it. XA very short program can run for hours, or even enter an Xinfinite loop. XIt is thus impossible to enforce any kind of shortest-first Xqueueing, unless all programs conform to the structuring Xconventions, and do not falsely claim conformance. XEven then, it is impossible to enforce fastest-first queueing: Xa program may only print one page, but may take hours to do so. X.PP XTuring equivalence even makes Trojan horses possible. XI once found that, after printing a cute PostScript program Xfrom the Net, all subsequent output was mirror-reversed. XThis turned out to be because the Net program was written on an Xoperating system that used different coordinate conventions. XThere was no malevolent intent X.I that Xtime, but the possibility clearly exists, especially since the Xpasswords of many printers are left set to a well-known default Xvalue. X.PP XAre there any benefits to the complexity of PostScript? XThe claim is of course that a specialized language makes Xprogramming easier. XAny new application area requires programmers to learn new Xconcepts. XIn the case of laser printing these are concepts like pixels, Xfonts, lines, splines, and halftones. XMastering these new concepts is unavoidable. XBut in addition, PostScript throws at programmers a new syntax Xand potentially unfamiliar concepts such as stacks and dictionaries. XThere are over 275 new operators to learn, and there are Xpotentially things to unlearn. XFor example, PostScript strings work differently from strings Xin many other languages. X.PP XWith modern data abstraction languages like Ada and Modula-2, Xthere is a much better way to handle new application areas: by Xthe definition of new abstract data types. XThe X.I only Xthing programmers have to learn is then the semantics of the Xnew abstract data types; Xthey already know the syntax and semantics of the host language. X.PP XI now turn to my second major objection to PostScript, Xthat it discourages development of a fast interface between Xhosts and printers. XPostScript allows the relatively compact representation of some Xgraphical objects, X.I e.g. Xtext produced by a word processor or vector Xgraphics drawn by a graphics editor. XHowever, text received by a FAX or vector graphics scanned in Xby a scanner take up much more space. XThe space required to represent something thus depends, not on Xwhat is represented, but on where it came from. XInitially, scanners were expensive, and most laser printer Xusers did not have access to them. XThe PostScript they wanted to print was relatively compact, so Xa slow serial interface to the printer was adequate. XThe RS-232-C laser printer interface has thus become yet Xanother unfortunate X.I de facto Xstandard. XBut scanners are now much cheaper, because of the explosive Xgrowth of the FAX industry. XAt the same time, printers are getting higher resolution, gray Xscales, and even color. XWorkstations are more powerful and have more memory. XComputer graphics is getting better and better. XOur scanners, hosts, and printers will soon be able to handle Xhigh resolution gray scale and color photographs, or Xphotographic quality computer graphic output. XThe bottleneck will be a slow host-printer inferface, because Xof PostScript. X.PP XWhat we really need are two things: a page standard and a high Xspeed printer interface standard. XThe page standard simply needs to specify each pixel. XCompressed rasters would be fine, as with FAX. XIn fact, the FAX standard could probably be used with a few changes. XThe high speed printer interface standard needs to specify how Xto get those pixels Xfrom the host to the printer. XHere, high speed means megabits per second. X.SH LICENSE XThis program is free software; you can redistribute it and/or modify Xit under the terms of the GNU General Public License version 1, Xas published by the Free Software Foundation. X.PP XThis program is distributed in the hope that it will be useful, Xbut WITHOUT ANY WARRANTY; without even the implied warranty of XMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the XGNU General Public License for more details. X.PP XYou should have received a copy of the GNU General Public License Xalong with this program; if not, write to the Free Software XFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. X.SH AUTHOR XHoward Gayle, XTN/ETX/T/BG, XEricsson Telecom AB, XS-126 25 Stockholm, XSweden, Xhoward@ericsson.se, Xuunet!ericsson.se!howard, XPhone: +46 8 719 5565, XFAX: +46 8 719 9598, XTelex: 14910 ERIC S X.SH TRADEMARKS XPostScript is a trademark of Adobe Systems, Incorporated. XTimes is a trademark of Allied Corporation. END_OF_FILE if test 25996 -ne `wc -c <'cz0.1'`; then echo shar: \"'cz0.1'\" unpacked with wrong size! fi # end of 'cz0.1' fi if test -f 'cz0.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'cz0.h'\" else echo shar: Extracting \"'cz0.h'\" \(12835 characters\) sed "s/^X//" >'cz0.h' <<'END_OF_FILE' X/* X * cz0.h - Global definitions for cz0. X * X * Copyright 1989 Howard Lee Gayle X * X * $Header: cz0.h,v 1.1 89/08/17 15:09:56 howard Exp $ X * X * This program is free software; you can redistribute it and/or modify X * it under the terms of the GNU General Public License version 1, X * as published by the Free Software Foundation. X * X * This program is distributed in the hope that it will be useful, X * but WITHOUT ANY WARRANTY; without even the implied warranty of X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the X * GNU General Public License for more details. X * X * You should have received a copy of the GNU General Public License X * along with this program; if not, write to the Free Software X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. X */ X XPRIVATE int Debug = /* Debugging verbosity level.*/ X#ifdef DEBUG X 9; X#else X 0; X#endif X#define DB(x) (Debug >= (x)) /* Test for printing debugging information.*/ X X#define CZSUF ".rc" /* Suffix for file of commands.*/ X#define ENVPRE "CZ_" /* Prefix for environment variables.*/ X#define MFILES 1000 /* Max number of file arguments.*/ X#define MFONTS 70 /* Max different fonts.*/ X#define MOCOL 9999 /* Max input column.*/ X#define MLINE 256 /* Max command file line length.*/ X#define MMULOCT 4 /* Max octets in multi-octet character.*/ X#define MOUTBUF 2048 /* Output buffer size.*/ X#define MPAGCOL 10 /* Max columns of text on a page.*/ X#define MPAGES 1000 /* Maximum number of pages per file.*/ X#define MPSLINE 255 /* Max PostScript line length.*/ X#define MPSSTR 30 /* Max PostScript string for 1 state-octet pair.*/ X#define MSTATE 31 /* Max state number.*/ X#define MTOPBUF 2048 /* Header buffer size.*/ X#define PIPECHR '|' /* Indicates output to pipeline.*/ X#define PSSUF ".ps" /* Suffix for PostScript file.*/ X#define SOSEP '.' /* Separates state from octet.*/ X X/* Unit conversion factors to big points (PostScript internal units): */ X#define CF_CC ((1238.0 * 864.0) / (1157.0 * 72.27)) X#define CF_CM (72.0 / 2.54) X#define CF_DD ((1238.0 * 72.0) / (1157.0 * 72.27)) X#define CF_IN (72.0) X#define CF_MM (72.0 / 25.4) X#define CF_PC (864.0 / 72.27) X#define CF_PT (72.0 / 72.27) X#define MM(x) ((x) * CF_MM) /* Convert millimeters to bp.*/ X X/* Debugging levels: */ X#define D_JOB 1 /* Per job.*/ X#define D_CMD 2 /* Per command. */ X#define D_FILE 3 /* Per file.*/ X#define D_PAGE 4 /* Per page.*/ X#define D_PAGEA 5 /* Per page attempt.*/ X#define D_COL 6 /* Per page column.*/ X#define D_LINE 7 /* Per output line.*/ X#define D_OCT 8 /* Per input octet.*/ X#define D_PSC 9 /* Per PostScript character.*/ X X/* Escape characters in PostScript strings: */ X#define E_ESC '+' /* Start escape sequence.*/ X#define E_STRB '(' /* Force string.*/ X#define E_STRE ')' /* Force end of string.*/ X#define E_COM 'c' /* Escaped comment character.*/ X#define E_EESC 'e' /* Escaped escape character.*/ X#define E_COLE 'f' /* End of column.*/ X#define E_LINEE 'l' /* End of line.*/ X#define E_PAGEE 'p' /* End of page.*/ X#define E_NEXTS 's' /* Next state.*/ X#define E_TAB 't' /* Horizontal tab.*/ X X/* Corresponding escape types. The first group are visible outside nextc(): */ X#define T_END 0 /* End of results for one character.*/ X#define T_UNDEF 1 /* Undefined state-octet pair.*/ X#define T_STRB 2 /* Force start of string.*/ X#define T_STRE 3 /* Force end of string.*/ X#define T_TAB 4 /* Horizontal tab.*/ X#define T_COLE 5 /* End of column.*/ X#define T_LINEE 6 /* End of line.*/ X#define T_PAGEE 7 /* End of page.*/ X#define T_EOF 8 /* End of file.*/ X X/* These stay inside nextc().*/ X#define T_RES 9 /* Reserved.*/ X#define T_COM 10 /* Escaped comment character.*/ X#define T_EESC 11 /* Escaped escape character.*/ X X/* Return codes from cv* functions: */ X#define R_EOFB 1 /* End of file at beginning of object.*/ X#define R_EOFM 2 /* End of file in middle of object.*/ X#define R_COLE 3 /* End of column.*/ X#define R_PAGEE 4 /* End of page.*/ X#define R_OVFL 5 /* Line too long.*/ X#define R_CONT 6 /* Next line will be a continuation line.*/ X X/* Convert from Ada-syntax numeric literals to int and unsigned short: */ X#define ADA_INT(s,f,l,h) mra2i (s, NULBSTR, FALSE, f, l, h, (bStrT *) NULL) X#define ADA_US(s,f,l,h) ((ushrtT)mra2u(s,NULBSTR,FALSE,f,l,h,(bStrT *)NULL)) X X/* Append one character to the line output buffer. This is a macro so X * that later it can do more than just call a fuction. For efficiency X * it can be made to work like putc. */ X#define PSPUTC(c) psputc((rcharT)(c)) X Xtypedef struct /* Printing parameters. One per file.*/ X { X ushrtT AutoCol[1 + MPAGCOL]; /* Max line width for # of columns.*/ X boolT AutoFil; /* AutoColumn & AutoLandscape on a whole-file basis.*/ X ushrtT AutoLnd; /* Max line width for portrait.*/ X float BMargL; /* Height of footer above bottom of page (landscape).*/ X float BMargP; /* Height of footer above bottom of page (portrait).*/ X float BodySiz; /* Size of body font.*/ X float BSkip; /* Distance between last line and footer.*/ X ushrtT Columns; /* Number of page columns.*/ X float ColSep; /* Space between page columns.*/ X bStrT FWFont; /* Fixed width body font.*/ X boolT FixWid; /* Flag set for fixed width body font.*/ X ushrtT FoldFst; /* Fold lines with more output columns than this.*/ X float FoldInd; /* Indent continuation lines this much.*/ X ushrtT FoldRst; /* Fold continuation lines longer than this.*/ X bStrT FootFnt; /* Footer font.*/ X float FootHt; /* Height of footer.*/ X bStrT HeadFnt; /* Header font.*/ X float HeadHt; /* Height of header.*/ X short LandRot; /* Rotation angle for landscapes.*/ X float LMargL; /* Left margin (landscape).*/ X float LMargP; /* Left margin (portrait).*/ X bStrT LNFnt; /* Line number font.*/ X float LNHt; /* Height of line numbers.*/ X unsigned LNMult; /* Print line numbers that are multiples of this.*/ X float LNWid; /* Width of line number column.*/ X float PageHt; /* Page height.*/ X float PageWid; /* Page width.*/ X float RMargL; /* Right margin (landscape).*/ X float RMargP; /* Right margin (portrait).*/ X float Spacing; /* Line spacing factor.*/ X bStrT SymbFnt; /* Symbol font.*/ X ushrtT TabWid; /* Spaces between each tab position.*/ X float TMargL; /* Distance from top of page to header (landscape).*/ X float TMargP; /* Distance from top of page to header (portrait).*/ X float TSkip; /* Distance from header to body.*/ X flagT TxtVert; /* Text written from top to bottom.*/ X bStrT VWFont; /* Variable width font.*/ X float XAdjust; /* X adjustment for unaligned printers.*/ X float YAdjust; /* Y adjustment for unaligned printers.*/ X } XparamT; X Xtypedef struct /* Info on each file to process.*/ X { X bStrT filHdr; /* Header.*/ X bStrT filName; /* File name.*/ X paramT filPara; /* Parameters.*/ X flagT filTmp; /* Temporary file---unlink when finished.*/ X } XfilT; X Xtypedef struct /* Description of one font.*/ X { X bStrT fntName; /* Name of font.*/ X flagT fntSymb; /* A symbol font.*/ X } XfontT; X Xtypedef struct /* State of nextc() */ X { X filT *ncFP; /* Points to current input file.*/ X unsigned ncICol; /* Input column number, leftmost 0.*/ X streamT ncIStrm; /* Current input stream.*/ X int ncN; /* Number of octets in ncOb[].*/ X byteT ncOb[MMULOCT]; /* Stores current character.*/ X ushrtT ncRb[MMULOCT * MPSSTR + 1]; /* Returned by nextc().*/ X bStrT ncStr; /* Steps through input string.*/ X boolT ncUn; /* Saved output waiting.*/ X } XncStatT; X Xtypedef struct /* One output page.*/ X { X long pgPos; /* Position of start of page in psts.*/ X ushrtT pgCols; /* Number of page columns.*/ X flagT pgPor; /* Portrait mode.*/ X } XpageT; X X/* Store file info here before reversing. The extra 2 slots are X * for sentinels at the beginning and end.*/ XPRIVATE filT fil[MFILES + 2]; XPRIVATE filT *filp = &fil[1]; /* Next free slot.*/ X Xtypedef struct /* State-octet pair. Order depends on state0.i.*/ X { X ushrtT so_nxt; /* Next state.*/ X bStrT so_ps; /* Points to PostScript string to output.*/ X } XsoT; X Xtypedef soT stateT[256]; /* One state.*/ X XPRIVATE boolT EndCtlD; /* Write a control-D at very end.*/ XPRIVATE bStrT Out = S("Standard Output");/* Output file name or pipeline.*/ XPRIVATE boolT Reverse; /* Reverse output pages.*/ XPRIVATE fontT fonts[MFONTS + 1]; /* List of fonts in use.*/ XPRIVATE fontT *fontP = fonts; /* Next free position in fonts[].*/ XPRIVATE unsigned lines; /* Lines in current file.*/ XPRIVATE boolT linCont; /* Previous output line was a continuation line.*/ XPRIVATE unsigned linNum; /* Input line number.*/ XPRIVATE ncStatT nc; /* Current state of nextc().*/ XPRIVATE ncStatT nc0; /* Initial nc.*/ XPRIVATE byteT ncMap[256]; /* Map escape character to T_* type.*/ XPRIVATE unsigned oCol; /* Current output column.*/ XPRIVATE byteT outBuf[MOUTBUF + 80]; /* Line output buffer.*/ XPRIVATE bStrT outBufE; /* End of outBuf[] or topBuf[].*/ XPRIVATE bStrT outBufP; /* Steps through outBuf[] & topBuf[].*/ XPRIVATE paramT param0; /* Initial printing parameters.*/ XPRIVATE unsigned psLinL; /* Length of current PostScript output line.*/ XPRIVATE streamT psos = stdout; /* Output stream.*/ XPRIVATE cStrT pstfn; /* PostScript output (temporary) file name.*/ XPRIVATE streamT psts; /* PostScript temporary output stream.*/ XPRIVATE unsigned totPag; /* Total pages output.*/ XPRIVATE byteT topBuf[MTOPBUF + 80]; /* Header buffer.*/ X X/* Error messages are collected here to make it easier to translate them.*/ XPRIVATE char eBigPS [] = "PostScript for %s longer than %d characters: %s"; XPRIVATE char eBigHd [] = "TopMargin + HeadHeight (%fbp) >= page height (%fbp)"; XPRIVATE char eClose [] = "%s: Can not close"; XPRIVATE char eCmd [] = "%s %u: Unknown command: %s %s"; XPRIVATE char eColWid[] = "Column width would be nonpositive (%fbp)."; XPRIVATE char eEmpty [] = "%s: empty file"; XPRIVATE char eEOF [] = "%s: %u: End of file in middle of line"; XPRIVATE char eEOFSt [] = "%s: State %u at end of file"; XPRIVATE char eEOSSt [] = "State %u at end of string %s"; XPRIVATE char eEsc [] = "Reserved escape %c%c (%s %s)"; XPRIVATE char eHdrEnd[] = "End of %s in header for file %s (%s)"; XPRIVATE char eIntern[] = "Internal error in %s line %d"; XPRIVATE char eMap [] = "Unknown escape %c%c 8#%o# state %u byte %c 8#%o#"; XPRIVATE char eMFiles[] = "More than %d files"; XPRIVATE char eMFonts[] = "More than %d different fonts"; XPRIVATE char eMLine [] = "Environment variable %s longer than %d characters"; XPRIVATE char eMPages[] = "%s: more than %d pages"; XPRIVATE char eMPath [] = "Path length out of range [1, %d]: %s"; XPRIVATE char eNoArg [] = "%s: No argument"; XPRIVATE char eNoArgL[] = "%s %u: No argument: %s"; XPRIVATE char eNoBod [] = X "Body height (%fbp) would be less than leading (%fbp)"; XPRIVATE char eNoFile[] = "No files"; XPRIVATE char eNoPipe[] = "No command after %c"; XPRIVATE char eOpen [] = "%s: Can not open"; XPRIVATE char ePSPutC[] = "Overflow of %s[%d]"; XPRIVATE char eRead [] = "%s: Read error"; XPRIVATE char eReadL [] = "%s: %u: Read error"; XPRIVATE char eRot [] = "LandscapeRotation must be -90 or +90"; XPRIVATE char eSOSep [] = "No separator (%c) in state-octet pair: %s %s"; XPRIVATE char eSymFnt[] = "Font %s used as both symbol and non-symbol font"; XPRIVATE char eUEOF [] = "%s: Unexpected EOF"; XPRIVATE char eUndef [] = X "%s: %u: No PostScript defined for character"; XPRIVATE char eUnits [] = X "%s [%s]: Unknown units [%s]. Known units: bp cc cm dd in mm pc pt."; XPRIVATE char eUnlink[] = "%s: Can not unlink"; X X/* Miscellaneous strings.*/ XPRIVATE byteT sCLine [] = "Command Line"; XPRIVATE byteT sStdin [] = "Standard Input"; X Xextern cStrT mktemp(); /* (3).*/ X XPRIVATE ushrtT a2ocol(); XPRIVATE void addFnt(); XPRIVATE void addso(); XPRIVATE void cmd(); XPRIVATE void cpStdin(); XPRIVATE int cvcol(); XPRIVATE void cvfile(); XPRIVATE int cvline(); XPRIVATE int cvpage(); XPRIVATE void docFnts(); XPRIVATE boolT doTop(); XPRIVATE void init(); XPRIVATE void mpsputc(); XPRIVATE double mra2bp(); XPRIVATE boolT ms2bool(); XPRIVATE ushrtT *nextc(); XPRIVATE void preScan(); XPRIVATE void psputc(); XPRIVATE void putDim(); XPRIVATE void putDimO(); XPRIVATE void putFnts(); XPRIVATE void putPage(); XPRIVATE void readenv(); XPRIVATE void readpth(); XPRIVATE void readrc (); XPRIVATE void undef(); END_OF_FILE if test 12835 -ne `wc -c <'cz0.h'`; then echo shar: \"'cz0.h'\" unpacked with wrong size! fi # end of 'cz0.h' fi if test -f 'es.rc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'es.rc'\" else echo shar: Extracting \"'es.rc'\" \(1286 characters\) sed "s/^X//" >'es.rc' <<'END_OF_FILE' X; es.rc - Character remappings for Spanish ISO 646 X; X; Copyright 1989 Howard Lee Gayle X; This file is written in the ISO 8859/1 character set. X; X; $Header: es.rc,v 1.1 89/08/04 17:11:42 howard Exp $ X; X; This program is free software; you can redistribute it and/or modify X; it under the terms of the GNU General Public License version 1, X; as published by the Free Software Foundation. X; X; This program is distributed in the hope that it will be useful, X; but WITHOUT ANY WARRANTY; without even the implied warranty of X; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the X; GNU General Public License for more details. X; X; You should have received a copy of the GNU General Public License X; along with this program; if not, write to the Free Software X; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. X; X; $ is not converted because it almost always means US X; dollars, not general currency sign. X X;Octet0.8#044# +(\244 ; $ -> general currency sign X Octet0.8#133# +(\355 ; [ -> small i with acute accent X Octet0.8#134# +(\321 ; \ -> capital N with tilde X Octet0.8#135# +(\277 ; ] -> inverted question mark X Octet0.8#173# +(\260 ; { -> degree sign X Octet0.8#174# +(\361 ; | -> small n with tilde X Octet0.8#175# +(\347 ; } -> small c with cedilla XCommandFile 8859-1 END_OF_FILE if test 1286 -ne `wc -c <'es.rc'`; then echo shar: \"'es.rc'\" unpacked with wrong size! fi # end of 'es.rc' fi if test -f 'fr.rc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'fr.rc'\" else echo shar: Extracting \"'fr.rc'\" \(1270 characters\) sed "s/^X//" >'fr.rc' <<'END_OF_FILE' X; fr.rc - Character remappings for French ISO 646 X; X; Copyright 1989 Howard Lee Gayle X; This file is written in the ISO 8859/1 character set. X; X; $Header: fr.rc,v 1.1 89/08/04 17:11:44 howard Exp $ X; X; This program is free software; you can redistribute it and/or modify X; it under the terms of the GNU General Public License version 1, X; as published by the Free Software Foundation. X; X; This program is distributed in the hope that it will be useful, X; but WITHOUT ANY WARRANTY; without even the implied warranty of X; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the X; GNU General Public License for more details. X; X; You should have received a copy of the GNU General Public License X; along with this program; if not, write to the Free Software X; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. X; X; $ is not converted because it almost always means US X; dollars, not general currency sign. X X;Octet0.8#044# +(\244 ; $ -> general currency sign X Octet0.8#133# +(\260 ; [ -> degree sign X Octet0.8#134# +(\347 ; \ -> small c with cedilla X Octet0.8#135# +(\247 ; ] -> section sign X Octet0.8#173# +(\351 ; { -> small e with acute accent X Octet0.8#174# +(\371 ; | -> small u with grave accent X Octet0.8#176# +(\230 ; ~ -> dieresis XCommandFile 8859-1 END_OF_FILE if test 1270 -ne `wc -c <'fr.rc'`; then echo shar: \"'fr.rc'\" unpacked with wrong size! fi # end of 'fr.rc' fi if test -f 'get-fonts.ps' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'get-fonts.ps'\" else echo shar: Extracting \"'get-fonts.ps'\" \(1777 characters\) sed "s/^X//" >'get-fonts.ps' <<'END_OF_FILE' X%! X% $Header: get-fonts.ps,v 1.1 89/06/29 10:48:43 howard Exp $ X/MaxNrOfFonts 50 def % Maximum numbers of fonts... X/Xpos 136 def X/Ypos 690 def X/num 0 def % local counter X/incr { X /num num 1 add def X} def X X/s40 { 40 string } def % Proper length of the fontname X X/showline { % Show and newlines X show X newline X} def X X/newline { % Spacing between lines X /Ypos Ypos 12 sub def X Xpos Ypos moveto X} def X X/CountFonts { % Count the fonts and put the names into array X FontDirectory X { X pop X s40 X cvs X incr X } X forall X /FontArray num array def X FontArray astore X pop X} def X X/ListFonts { % Sort the fonts and show them on paper X Bubbelsort X FontArray X { X showline X } X forall X} def X X/Bubbelsort { % Here is the sorting routine X 1 1 num 1 sub X { X /localcount exch def X num 1 sub -1 localcount X { X /innercount exch def X /firststring FontArray innercount 1 sub get def X /secondstring FontArray innercount get def X firststring secondstring gt X { X FontArray innercount 1 sub secondstring put X FontArray innercount firststring put X } if X } for X } for X} def X X/prettyline X{ /YPOSition exch def X newpath X Xpos Ypos YPOSition add moveto X Xpos 100 add Ypos YPOSition add lineto X stroke X} def X X/Times-Roman findfont 12 scalefont setfont X14 prettyline X XXpos Ypos 18 add moveto XCountFonts X(Number of fonts: ) show Xnum s40 cvs show X X30 prettyline XXpos Ypos moveto XListFonts Xnewline X X/Times-Bold findfont 12 scalefont setfont X(Total memory: ) show Xvmstatus s40 cvs show newline X(Memory used: ) show Xs40 cvs show newline Xpop X(Free memory: ) show Xvmstatus exch sub s40 cvs show newline newline Xpop X/Times-Roman findfont 12 scalefont setfont X(From ulfis@nada.kth.se, 88-10-05) show Xshowpage END_OF_FILE if test 1777 -ne `wc -c <'get-fonts.ps'`; then echo shar: \"'get-fonts.ps'\" unpacked with wrong size! fi # end of 'get-fonts.ps' fi echo shar: End of archive 6 \(of 14\). cp /dev/null ark6isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 14 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0