[comp.sources.misc] v08i070: cz text to PostScript system, part 06 of 14

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