#
# Shell library - for building devutf tables.
#

RESOLUTION=720
UNITWIDTH=10

OCTALESCAPES=${OCTALESCAPES:-160}       # <= code means add \0ddd names
DOWNLOADVECTOR=FALSE                    # TRUE can mean incomplete tables

#
# BuiltinTables returns command lines that generate PostScript programs
# for building a typesetter description file and font width tables for
# a relatively standard collection of fonts. Use awk to select a command
# line or modify an existing command to build a width table for a new
# font.
#

BuiltinTables() {
       cat <<-'//End of BuiltinTables'
               Proportional    R       Times-Roman
               Proportional    I       Times-Italic
               Proportional    B       Times-Bold
               Proportional    BI      Times-BoldItalic
               Proportional    AB      AvantGarde-Demi
               Proportional    AI      AvantGarde-BookOblique
               Proportional    AR      AvantGarde-Book
               Proportional    AX      AvantGarde-DemiOblique
               Proportional    H       Helvetica
               Proportional    HB      Helvetica-Bold
               Proportional    HI      Helvetica-Oblique
               Proportional    HX      Helvetica-BoldOblique
               Proportional    Hb      Helvetica-Narrow-Bold
               Proportional    Hi      Helvetica-Narrow-Oblique
               Proportional    Hr      Helvetica-Narrow
               Proportional    Hx      Helvetica-Narrow-BoldOblique
               Proportional    KB      Bookman-Demi
               Proportional    KI      Bookman-LightItalic
               Proportional    KR      Bookman-Light
               Proportional    KX      Bookman-DemiItalic
               Proportional    NB      NewCenturySchlbk-Bold
               Proportional    NI      NewCenturySchlbk-Italic
               Proportional    NR      NewCenturySchlbk-Roman
               Proportional    NX      NewCenturySchlbk-BoldItalic
               Proportional    PA      Palatino-Roman
               Proportional    PB      Palatino-Bold
               Proportional    PI      Palatino-Italic
               Proportional    PX      Palatino-BoldItalic
               Proportional    ZI      ZapfChancery-MediumItalic
               FixedWidth      C       Courier
               FixedWidth      CB      Courier-Bold
               FixedWidth      CI      Courier-Oblique
               FixedWidth      CO      Courier
               FixedWidth      CW      Courier
               FixedWidth      CX      Courier-BoldOblique
               Dingbats        ZD      ZapfDingbats
               Greek           GR      Symbol
               Symbol          S       Symbol
               Special         S1      Times-Roman
               Description     DESC    ---
       //End of BuiltinTables
}

#
# AllTables prints the complete list of builtin font names.
#

AllTables() {
       BuiltinTables | awk '{print $2}'
}

#
# Charset functions generate keyword/value pairs (as PostScript objects)
# that describe the character set available in a font. The keyword is a
# PostScript string that represents troff's name for the character. The
# value is usually the literal name (i.e. begins with a /) assigned to
# the character in the PostScript font. The value can also be an integer
# or a PostScript string. An integer value is used as an index in the
# current font's Encoding array. A string value is returned to the host
# unchanged when the entry for the character is constructed. Entries that
# have (") as their value are synonyms for the preceeding character.
#
# The 18 characters missing from ROM resident fonts on older printers are
# flagged with the PostScript comment "% missing".
#

StandardCharset() {
       cat <<-'//End of StandardCharset'
               (!)     /exclam
               (")     /quotedbl
               (dq)    (")                     % synonym
               (#)     /numbersign
               ($)     /dollar
               (%)     /percent
               (&)     /ampersand
               (')     /quoteright
               (\()    /parenleft
               (\))    /parenright
               (*)     /asterisk
               (+)     /plus
               (,)     /comma
               (-)     /hyphen                 % changed from minus by request
               (.)     /period
               (/)     /slash
               (0)     /zero
               (1)     /one
               (2)     /two
               (3)     /three
               (4)     /four
               (5)     /five
               (6)     /six
               (7)     /seven
               (8)     /eight
               (9)     /nine
               (:)     /colon
               (;)     /semicolon
               (<)     /less
               (=)     /equal
               (>)     /greater
               (?)     /question
               (@)     /at
               (A)     /A
               (B)     /B
               (C)     /C
               (D)     /D
               (E)     /E
               (F)     /F
               (G)     /G
               (H)     /H
               (I)     /I
               (J)     /J
               (K)     /K
               (L)     /L
               (M)     /M
               (N)     /N
               (O)     /O
               (P)     /P
               (Q)     /Q
               (R)     /R
               (S)     /S
               (T)     /T
               (U)     /U
               (V)     /V
               (W)     /W
               (X)     /X
               (Y)     /Y
               (Z)     /Z
               ([)     /bracketleft
               (\\)    /backslash
               (bs)    (")                     % synonym
               (])     /bracketright
               (^)     /asciicircum
               (_)     /underscore
               (`)     /quoteleft
               (a)     /a
               (b)     /b
               (c)     /c
               (d)     /d
               (e)     /e
               (f)     /f
               (g)     /g
               (h)     /h
               (i)     /i
               (j)     /j
               (k)     /k
               (l)     /l
               (m)     /m
               (n)     /n
               (o)     /o
               (p)     /p
               (q)     /q
               (r)     /r
               (s)     /s
               (t)     /t
               (u)     /u
               (v)     /v
               (w)     /w
               (x)     /x
               (y)     /y
               (z)     /z
               ({)     /braceleft
               (|)     /bar
               (})     /braceright
               (~)     /asciitilde
               (\\`)   /grave                  % devpost character
               (ga)    (")                     % synonym
               (!!)    /exclamdown
               (c|)    /cent
               (ct)    (")                     % devpost synonym
               (L-)    /sterling
               (ps)    (")                     % devpost synonym
               (xo)    /currency
               (cr)    (")                     % devpost synonym
               (Y-)    /yen
               (yn)    (")                     % devpost synonym
               (||)    /brokenbar              % missing
               (so)    /section
               (sc)    (")                     % devpost synonym
               ("")    /dieresis
               (:a)    (")                     % devpost synonym
               (co)    /copyright
               (a_)    /ordfeminine
               (<<)    /guillemotleft
               (-,)    /logicalnot
               (hy)    /hyphen
               (--)    /minus
               (ro)    /registered
               (rg)    (")                     % devpost synonym
               (-^)    /macron
               (-a)    (")                     % devpost synonym
               (0^)    /degree                 % missing
               (+-)    /plusminus              % missing
               (2^)    /twosuperior            % missing
               (3^)    /threesuperior          % missing
               (\\')   /acute
               (aa)    (")                     % devpost synonym
               (/u)    /mu                     % missing
               (P!)    /paragraph
               (pg)    (")                     % devpost synonym
               (.^)    /periodcentered
               (,,)    /cedilla
               (,a)    (")                     % devpost synonym
               (1^)    /onesuperior            % missing
               (o_)    /ordmasculine
               (>>)    /guillemotright
               (14)    /onequarter             % missing
               (12)    /onehalf                % missing
               (34)    /threequarters          % missing
               (??)    /questiondown
               (A`)    /Agrave
               (A')    /Aacute
               (A^)    /Acircumflex
               (A~)    /Atilde
               (A")    /Adieresis
               (A*)    /Aring
               (AE)    /AE
               (C,)    /Ccedilla
               (E`)    /Egrave
               (E')    /Eacute
               (E^)    /Ecircumflex
               (E")    /Edieresis
               (I`)    /Igrave
               (I')    /Iacute
               (I^)    /Icircumflex
               (I")    /Idieresis
               (D-)    /Eth                    % missing
               (N~)    /Ntilde
               (O`)    /Ograve
               (O')    /Oacute
               (O^)    /Ocircumflex
               (O~)    /Otilde
               (O")    /Odieresis
               (xx)    /multiply               % missing
               (O/)    /Oslash
               (U`)    /Ugrave
               (U')    /Uacute
               (U^)    /Ucircumflex
               (U")    /Udieresis
               (Y')    /Yacute                 % missing
               (TH)    /Thorn                  % missing
               (ss)    /germandbls
               (a`)    /agrave
               (a')    /aacute
               (a^)    /acircumflex
               (a~)    /atilde
               (a")    /adieresis
               (a*)    /aring
               (ae)    /ae
               (c,)    /ccedilla
               (e`)    /egrave
               (e')    /eacute
               (e^)    /ecircumflex
               (e")    /edieresis
               (i`)    /igrave
               (i')    /iacute
               (i^)    /icircumflex
               (i")    /idieresis
               (d-)    /eth                    % missing
               (n~)    /ntilde
               (o`)    /ograve
               (o')    /oacute
               (o^)    /ocircumflex
               (o~)    /otilde
               (o")    /odieresis
               (-:)    /divide                 % missing
               (o/)    /oslash
               (u`)    /ugrave
               (u')    /uacute
               (u^)    /ucircumflex
               (u")    /udieresis
               (y')    /yacute                 % missing
               (th)    /thorn                  % missing
               (y")    /ydieresis
               (^a)    /circumflex             % devpost accent
               (~a)    /tilde                  % devpost accent
               (Ua)    /breve                  % devpost accent
               (.a)    /dotaccent              % devpost accent
               (oa)    /ring                   % devpost accent
               ("a)    /hungarumlaut           % devpost accent
               (Ca)    /ogonek                 % devpost accent
               (va)    /caron                  % devpost accent
       //End of StandardCharset
}

#
# DingbatsCharset guarantees changes in StandardCharset don't show up in ZD.
#

DingbatsCharset() {
       cat <<-'//End of DingbatsCharset'
               (!)     /exclam
               (")     /quotedbl
               (#)     /numbersign
               ($)     /dollar
               (%)     /percent
               (&)     /ampersand
               (')     /quoteright
               (\()    /parenleft
               (\))    /parenright
               (*)     /asterisk
               (+)     /plus
               (,)     /comma
               (-)     /minus          % also hyphen in devpost
               (.)     /period
               (/)     /slash
               (0)     /zero
               (1)     /one
               (2)     /two
               (3)     /three
               (4)     /four
               (5)     /five
               (6)     /six
               (7)     /seven
               (8)     /eight
               (9)     /nine
               (:)     /colon
               (;)     /semicolon
               (<)     /less
               (=)     /equal
               (>)     /greater
               (?)     /question
               (@)     /at
               (A)     /A
               (B)     /B
               (C)     /C
               (D)     /D
               (E)     /E
               (F)     /F
               (G)     /G
               (H)     /H
               (I)     /I
               (J)     /J
               (K)     /K
               (L)     /L
               (M)     /M
               (N)     /N
               (O)     /O
               (P)     /P
               (Q)     /Q
               (R)     /R
               (S)     /S
               (T)     /T
               (U)     /U
               (V)     /V
               (W)     /W
               (X)     /X
               (Y)     /Y
               (Z)     /Z
               ([)     /bracketleft
               (\\)    /backslash
               (])     /bracketright
               (^)     /asciicircum
               (_)     /underscore
               (`)     /quoteleft
               (a)     /a
               (b)     /b
               (c)     /c
               (d)     /d
               (e)     /e
               (f)     /f
               (g)     /g
               (h)     /h
               (i)     /i
               (j)     /j
               (k)     /k
               (l)     /l
               (m)     /m
               (n)     /n
               (o)     /o
               (p)     /p
               (q)     /q
               (r)     /r
               (s)     /s
               (t)     /t
               (u)     /u
               (v)     /v
               (w)     /w
               (x)     /x
               (y)     /y
               (z)     /z
               ({)     /braceleft
               (|)     /bar
               (})     /braceright
               (~)     /asciitilde
               (\\`)   /grave                  % devpost character
               (!!)    /exclamdown
               (c|)    /cent
               (L-)    /sterling
               (xo)    /currency
               (Y-)    /yen
               (||)    /brokenbar              % missing
               (so)    /section
               ("")    /dieresis
               (co)    /copyright
               (a_)    /ordfeminine
               (<<)    /guillemotleft
               (-,)    /logicalnot
               (hy)    /hyphen
               (ro)    /registered
               (-^)    /macron
               (0^)    /degree                 % missing
               (+-)    /plusminus              % missing
               (2^)    /twosuperior            % missing
               (3^)    /threesuperior          % missing
               (\\')   /acute
               (/u)    /mu                     % missing
               (P!)    /paragraph
               (.^)    /periodcentered
               (,,)    /cedilla
               (1^)    /onesuperior            % missing
               (o_)    /ordmasculine
               (>>)    /guillemotright
               (14)    /onequarter             % missing
               (12)    /onehalf                % missing
               (34)    /threequarters          % missing
               (??)    /questiondown
               (A`)    /Agrave
               (A')    /Aacute
               (A^)    /Acircumflex
               (A~)    /Atilde
               (A")    /Adieresis
               (A*)    /Aring
               (AE)    /AE
               (C,)    /Ccedilla
               (E`)    /Egrave
               (E')    /Eacute
               (E^)    /Ecircumflex
               (E")    /Edieresis
               (I`)    /Igrave
               (I')    /Iacute
               (I^)    /Icircumflex
               (I")    /Idieresis
               (D-)    /Eth                    % missing
               (N~)    /Ntilde
               (O`)    /Ograve
               (O')    /Oacute
               (O^)    /Ocircumflex
               (O~)    /Otilde
               (O")    /Odieresis
               (xx)    /multiply               % missing
               (O/)    /Oslash
               (U`)    /Ugrave
               (U')    /Uacute
               (U^)    /Ucircumflex
               (U")    /Udieresis
               (Y')    /Yacute                 % missing
               (TH)    /Thorn                  % missing
               (ss)    /germandbls
               (a`)    /agrave
               (a')    /aacute
               (a^)    /acircumflex
               (a~)    /atilde
               (a")    /adieresis
               (a*)    /aring
               (ae)    /ae
               (c,)    /ccedilla
               (e`)    /egrave
               (e')    /eacute
               (e^)    /ecircumflex
               (e")    /edieresis
               (i`)    /igrave
               (i')    /iacute
               (i^)    /icircumflex
               (i")    /idieresis
               (d-)    /eth                    % missing
               (n~)    /ntilde
               (o`)    /ograve
               (o')    /oacute
               (o^)    /ocircumflex
               (o~)    /otilde
               (o")    /odieresis
               (-:)    /divide                 % missing
               (o/)    /oslash
               (u`)    /ugrave
               (u')    /uacute
               (u^)    /ucircumflex
               (u")    /udieresis
               (y')    /yacute                 % missing
               (th)    /thorn                  % missing
               (y")    /ydieresis
       //End of DingbatsCharset
}

SymbolCharset() {
       cat <<-'//End of SymbolCharset'
               (---)           /exclam
               (fa)            /universal
               (---)           /numbersign
               (te)            /existential
               (---)           /percent
               (---)           /ampersand
               (st)            /suchthat
               (---)           /parenleft
               (---)           /parenright
               (**)            /asteriskmath
               (pl)            /plus
               (---)           /comma
               (mi)            /minus
               (---)           /period
               (sl)            /slash
               (---)           /zero
               (---)           /one
               (---)           /two
               (---)           /three
               (---)           /four
               (---)           /five
               (---)           /six
               (---)           /seven
               (---)           /eight
               (---)           /nine
               (---)           /colon
               (---)           /semicolon
               (<)             /less
               (eq)            /equal
               (>)             /greater
               (---)           /question
               (cg)            /congruent
               (*A)            /Alpha
               (\244x)         (")
               (*B)            /Beta
               (\244y)         (")
               (*X)            /Chi
               (\244\257)      (")
               (*D)            /Delta
               (\244{)         (")
               (*E)            /Epsilon
               (\244|)         (")
               (*F)            /Phi
               (\244\256)      (")
               (*G)            /Gamma
               (\244z)         (")
               (*Y)            /Eta
               (\244~)         (")
               (*I)            /Iota
               (\244\241)      (")
               (---)           /theta1
               (\244\331)      (")
               (*K)            /Kappa
               (\244\242)      (")
               (*L)            /Lambda
               (\244\243)      (")
               (*M)            /Mu
               (\244\244)      (")
               (*N)            /Nu
               (\244\245)      (")
               (*O)            /Omicron
               (\244\247)      (")
               (*P)            /Pi
               (\244\250)      (")
               (*H)            /Theta
               (\244\240)      (")
               (*R)            /Rho
               (\244\251)      (")
               (*S)            /Sigma
               (\244\253)      (")
               (*T)            /Tau
               (\244\254)      (")
               (*U)            /Upsilon
               (\244\255)      (")
               (ts)            /sigma1
               (\244\312)      (")
               (*W)            /Omega
               (\244\261)      (")
               (*C)            /Xi
               (\244\246)      (")
               (*Q)            /Psi
               (\244\260)      (")
               (*Z)            /Zeta
               (\244})         (")
               (---)           /bracketleft
               (tf)            /therefore
               (---)           /bracketright
               (pp)            /perpendicular
               (ul)            /underscore
               (_)             (")                     % synonym
               (rn)            /radicalex
               (*a)            /alpha
               (\244\271)      (")
               (*b)            /beta
               (\244\272)      (")
               (*x)            /chi
               (\244\317)      (")
               (*d)            /delta
               (\244\274)      (")
               (*e)            /epsilon
               (\244\275)      (")
               (*f)            /phi
               (\244\316)      (")
               (*g)            /gamma
               (\244\273)      (")
               (*y)            /eta
               (\244\277)      (")
               (*i)            /iota
               (\244\301)      (")
               (---)           /phi1
               (\244\335)      (")
               (*k)            /kappa
               (\244\302)      (")
               (*l)            /lambda
               (\244\303)      (")
               (*m)            /mu
               (\244\304)      (")
               (*n)            /nu
               (\244\305)      (")
               (*o)            /omicron
               (\244\307)      (")
               (*p)            /pi
               (\244\310)      (")
               (*h)            /theta
               (\244\300)      (")
               (*r)            /rho
               (\244\311)      (")
               (*s)            /sigma
               (\244\313)      (")
               (*t)            /tau
               (\244\314)      (")
               (*u)            /upsilon
               (\244\315)      (")
               (---)           /omega1
               (\244\336)      (")
               (*w)            /omega
               (\244\321)      (")
               (*c)            /xi
               (\244\306)      (")
               (*q)            /psi
               (\244\320)      (")
               (*z)            /zeta
               (\244\276)      (")
               (---)           /braceleft
               (or)            /bar
               (---)           /braceright
               (ap)            /similar
               (---)           /Upsilon1
               (fm)            /minute
               (<=)            /lessequal
               (fr)            /fraction               % devpost character
               (if)            /infinity
               (fn)            /florin                 % devpost character
               (---)           /club
               (---)           /diamond
               (---)           /heart
               (---)           /spade
               (ab)            /arrowboth
               (<-)            /arrowleft
               (ua)            /arrowup
               (->)            /arrowright
               (da)            /arrowdown
               (de)            /degree
               (+-)            /plusminus
               (---)           /second
               (>=)            /greaterequal
               (mu)            /multiply
               (pt)            /proportional
               (pd)            /partialdiff
               (bu)            /bullet
               (di)            /divide
               (!=)            /notequal
               (==)            /equivalence
               (~~)            /approxequal
               (el)            /ellipsis
               (av)            /arrowvertex
               (ah)            /arrowhorizex
               (CR)            /carriagereturn
               (af)            /aleph
               (If)            /Ifraktur
               (Rf)            /Rfraktur
               (ws)            /weierstrass
               (Ox)            /circlemultiply
               (O+)            /circleplus
               (es)            /emptyset
               (ca)            /intersection
               (cu)            /union
               (sp)            /propersuperset
               (ip)            /reflexsuperset
               (!b)            /notsubset
               (sb)            /propersubset
               (ib)            /reflexsubset
               (mo)            /element
               (!m)            /notelement
               (an)            /angle
               (gr)            /gradient
               (rg)            /registerserif
               (co)            /copyrightserif
               (tm)            /trademarkserif
               (---)           /product
               (sr)            /radical
               (c.)            /dotmath
               (no)            /logicalnot
               (l&)            /logicaland
               (l|)            /logicalor
               (---)           /arrowdblboth
               (---)           /arrowdblleft
               (---)           /arrowdblup
               (---)           /arrowdblright
               (---)           /arrowdbldown
               (lz)            /lozenge
               (b<)            /angleleft
               (RG)            /registersans
               (CO)            /copyrightsans
               (TM)            /trademarksans
               (---)           /summation
               (LT)            /parenlefttp
               (br)            /parenleftex
               (LX)            (")                     % synonym
               (LB)            /parenleftbt
               (lc)            /bracketlefttp
               (lx)            /bracketleftex
               (lf)            /bracketleftbt
               (lt)            /bracelefttp
               (lk)            /braceleftmid
               (lb)            /braceleftbt
               (bv)            /braceex
               (|)             (")                     % synonym
               (b>)            /angleright
               (is)            /integral
               (---)           /integraltp
               (---)           /integralex
               (---)           /integralbt
               (RT)            /parenrighttp
               (RX)            /parenrightex
               (RB)            /parenrightbt
               (rc)            /bracketrighttp
               (rx)            /bracketrightex
               (rf)            /bracketrightbt
               (rt)            /bracerighttp
               (rk)            /bracerightmid
               (rb)            /bracerightbt
               (~=)            (55     0       1)      % charlib
       //End of SymbolCharset
}

SpecialCharset() {
       cat <<-'//End of SpecialCharset'
               (ru)    /underscore
               ('')    /quotedblright          % devpost character
               (``)    /quotedblleft           % devpost character
               (dg)    /dagger                 % devpost character
               (dd)    /daggerdbl              % devpost character
               (en)    /endash                 % devpost character
               (\\-)   (")                     % synonym
               (em)    /emdash
%               (ff)    (60     2       1)      % charlib
%               (Fi)    (84     2       1)      % charlib
%               (Fl)    (84     2       1)      % charlib
               (14)    (75     2       1)      % charlib
               (12)    (75     2       1)      % charlib
               (34)    (75     2       1)      % charlib
               (bx)    (50     2       1)      % charlib
               (ob)    (38     2       1)      % charlib
               (ci)    (75     0       1)      % charlib
               (sq)    (50     2       1)      % charlib
               (Sl)    (50     2       1)      % charlib
               (L1)    (110    1       1)      % charlib
               (LA)    (110    1       1)      % charlib
               (LV)    (110    3       1)      % charlib
               (LH)    (210    1       1)      % charlib
               (lh)    (100    0       1)      % charlib
               (rh)    (100    0       1)      % charlib
               (lH)    (100    0       1)      % charlib
               (rH)    (100    0       1)      % charlib
               (PC)    (220    2       1)      % charlib
               (DG)    (185    2       1)      % charlib
       //End of SpecialCharset
}

#
# Latin1 ensures a font uses the ISOLatin1Encoding vector, although only
# text fonts should be re-encoded. Downloading the Encoding vector doesn't
# often make sense. No ISOLatin1Encoding array likely means ROM based fonts
# on your printer are incomplete. Type 1 fonts with a full Latin1 character
# set appeared sometime after Version 50.0.
#

Latin1() {
       if [ "$DOWNLOADVECTOR" = TRUE ]; then
               cat <<-'//End of ISOLatin1Encoding'
                       /ISOLatin1Encoding [
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /space
                               /exclam
                               /quotedbl
                               /numbersign
                               /dollar
                               /percent
                               /ampersand
                               /quoteright
                               /parenleft
                               /parenright
                               /asterisk
                               /plus
                               /comma
                               /minus
                               /period
                               /slash
                               /zero
                               /one
                               /two
                               /three
                               /four
                               /five
                               /six
                               /seven
                               /eight
                               /nine
                               /colon
                               /semicolon
                               /less
                               /equal
                               /greater
                               /question
                               /at
                               /A
                               /B
                               /C
                               /D
                               /E
                               /F
                               /G
                               /H
                               /I
                               /J
                               /K
                               /L
                               /M
                               /N
                               /O
                               /P
                               /Q
                               /R
                               /S
                               /T
                               /U
                               /V
                               /W
                               /X
                               /Y
                               /Z
                               /bracketleft
                               /backslash
                               /bracketright
                               /asciicircum
                               /underscore
                               /quoteleft
                               /a
                               /b
                               /c
                               /d
                               /e
                               /f
                               /g
                               /h
                               /i
                               /j
                               /k
                               /l
                               /m
                               /n
                               /o
                               /p
                               /q
                               /r
                               /s
                               /t
                               /u
                               /v
                               /w
                               /x
                               /y
                               /z
                               /braceleft
                               /bar
                               /braceright
                               /asciitilde
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /.notdef
                               /dotlessi
                               /grave
                               /acute
                               /circumflex
                               /tilde
                               /macron
                               /breve
                               /dotaccent
                               /dieresis
                               /.notdef
                               /ring
                               /cedilla
                               /.notdef
                               /hungarumlaut
                               /ogonek
                               /caron
                               /space
                               /exclamdown
                               /cent
                               /sterling
                               /currency
                               /yen
                               /brokenbar
                               /section
                               /dieresis
                               /copyright
                               /ordfeminine
                               /guillemotleft
                               /logicalnot
                               /hyphen
                               /registered
                               /macron
                               /degree
                               /plusminus
                               /twosuperior
                               /threesuperior
                               /acute
                               /mu
                               /paragraph
                               /periodcentered
                               /cedilla
                               /onesuperior
                               /ordmasculine
                               /guillemotright
                               /onequarter
                               /onehalf
                               /threequarters
                               /questiondown
                               /Agrave
                               /Aacute
                               /Acircumflex
                               /Atilde
                               /Adieresis
                               /Aring
                               /AE
                               /Ccedilla
                               /Egrave
                               /Eacute
                               /Ecircumflex
                               /Edieresis
                               /Igrave
                               /Iacute
                               /Icircumflex
                               /Idieresis
                               /Eth
                               /Ntilde
                               /Ograve
                               /Oacute
                               /Ocircumflex
                               /Otilde
                               /Odieresis
                               /multiply
                               /Oslash
                               /Ugrave
                               /Uacute
                               /Ucircumflex
                               /Udieresis
                               /Yacute
                               /Thorn
                               /germandbls
                               /agrave
                               /aacute
                               /acircumflex
                               /atilde
                               /adieresis
                               /aring
                               /ae
                               /ccedilla
                               /egrave
                               /eacute
                               /ecircumflex
                               /edieresis
                               /igrave
                               /iacute
                               /icircumflex
                               /idieresis
                               /eth
                               /ntilde
                               /ograve
                               /oacute
                               /ocircumflex
                               /otilde
                               /odieresis
                               /divide
                               /oslash
                               /ugrave
                               /uacute
                               /ucircumflex
                               /udieresis
                               /yacute
                               /thorn
                               /ydieresis
                       ] def
               //End of ISOLatin1Encoding
       fi

       echo "ISOLatin1Encoding /$1 ReEncode"
}

#
# Generating functions output PostScript programs that build font width
# tables or a typesetter description file. Send the program to a printer
# and the complete table will come back on the serial port. All write on
# stdout and assume the prologue and other required PostScript files are
# all available.
#

Proportional() {
       echo "/unitwidth $UNITWIDTH def"
       echo "/resolution $RESOLUTION def"
       echo "/octalescapes $OCTALESCAPES def"
       echo "/charset ["
               # Get <>_ and | from S. Use accents for ascii ^ and ~.
               StandardCharset | awk '
                       $1 == "(<)" && $2 == "/less" {$1 = "(---)"}
                       $1 == "(>)" && $2 == "/greater" {$1 = "(---)"}
                       $1 == "(_)" && $2 == "/underscore" {$1 = "(---)"}
                       $1 == "(|)" && $2 == "/bar" {$1 = "(---)"}
                       $1 == "(^)" && $2 == "/asciicircum" {
                               printf "(^)\t/circumflex\n"
                               $1 = "(---)"
                       }
                       $1 == "(~)" && $2 == "/asciitilde" {
                               printf "(~)\t/tilde\n"
                               $1 = "(---)"
                       }
                       {printf "%s\t%s\n", $1, $2}
               '
       echo "] def"

       Latin1 $2
       echo "/$2 SelectFont"
       echo "(opO) SetAscender"

       echo "(name $1\\\\n) Print"
       echo "(fontname $2\\\\n) Print"
       echo "/$1 NamedInPrologue"
       echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
       echo "(charset\\\\n) Print"
       echo "BuildFontCharset"
}

FixedWidth() {
       echo "/unitwidth $UNITWIDTH def"
       echo "/resolution $RESOLUTION def"
       echo "/octalescapes $OCTALESCAPES def"
       echo "/charset ["
               StandardCharset
       echo "] def"

       Latin1 $2
       echo "/$2 SelectFont"
       echo "(opO) SetAscender"

       echo "(name $1\\\\n) Print"
       echo "(fontname $2\\\\n) Print"
       echo "/$1 NamedInPrologue"
       echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
       echo "(charset\\\\n) Print"
       echo "BuildFontCharset"
}

Dingbats() {
       echo "/unitwidth $UNITWIDTH def"
       echo "/resolution $RESOLUTION def"
       echo "/octalescapes $OCTALESCAPES def"
       echo "/charset ["
               DingbatsCharset | awk '$1 != "(---)" && $2 ~ /^\/[a-zA-Z]/ {
                       printf "%s\tISOLatin1Encoding %s GetCode\n", $1, $2
               }'
       echo "] def"

       echo "/$2 SelectFont"
       echo "(   ) SetAscender"

       echo "(name $1\\\\n) Print"
       echo "(fontname $2\\\\n) Print"
       echo "/$1 NamedInPrologue"
       echo "(charset\\\\n) Print"
       echo "BuildFontCharset"
}

Greek() {
       echo "/unitwidth $UNITWIDTH def"
       echo "/resolution $RESOLUTION def"
       echo "/charset ["
               SymbolCharset | awk '
                       BEGIN {hit = -1}
                       $1 ~ /\(\*[a-zA-Z]\)/ {print; hit = NR}
                       $2 == "(\")" && hit == NR-1 {print; hit = NR}
               '
       echo "] def"

       echo "/$2 SelectFont"
       echo "(orO) SetAscender"

       echo "(name $1\\\\n) Print"
       echo "(fontname $2\\\\n) Print"
       echo "/$1 NamedInPrologue"
       echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
       echo "(charset\\\\n) Print"
       echo "BuildFontCharset"
}

Symbol() {
       echo "/unitwidth $UNITWIDTH def"
       echo "/resolution $RESOLUTION def"
       echo "/charset ["
               SymbolCharset
       echo "] def"

       echo "ChangeMetrics"
       echo "/S SelectFont"
       echo "(orO) SetAscender"

       echo "(name $1\\\\n) Print"
       echo "(fontname $2\\\\n) Print"
       echo "/$1 NamedInPrologue"
       echo "(special\\\\n) Print"
       echo "(charset\\\\n) Print"
       echo "BuildFontCharset"
}

Special() {
       echo "/unitwidth $UNITWIDTH def"
       echo "/resolution $RESOLUTION def"
       echo "/charset ["
               SpecialCharset
       echo "] def"

       echo "ChangeMetrics"
       echo "/S1 SelectFont"

       echo "(# Times-Roman special font\\\\n) Print"
       echo "(name $1\\\\n) Print"
       echo "(fontname $2\\\\n) Print"
       echo "/$1 NamedInPrologue"
       echo "(special\\\\n) Print"
       echo "(charset\\\\n) Print"
       echo "BuildFontCharset"
}

#
# The DESC file doesn't have to be built on a printer. It's only here for
# consistency.
#

Description() {
       echo "/charset ["       # awk - so the stack doesn't overflow
               StandardCharset | awk '$1 !~ /\(\\[0-9]/ {print $1}'
               SymbolCharset | awk '$1 !~ /\(\\[0-9]/ {print $1}'
               SpecialCharset | awk '$1 !~ /\(\\[0-9]/ {print $1}'
       echo "] def"

       cat <<-//DESC
               (#Device Description - utf character set

               PDL PostScript
               Encoding Latin1

               fonts 10 R I B BI CW H HI HB S1 S
               sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
               23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46
               48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115
               120 125 130 135 140 145 150 155 160 0
               res $RESOLUTION
               hor 1
               vert 1
               unitwidth $UNITWIDTH

               ) Print
       //DESC
       echo "(charset\\\\n) Print"
       echo "BuildDescCharset"
       echo "(\\\\n) Print"
}