1*34000Sedward#	@(#)afmdit.awk	1.3 (Berkeley) 04/15/88
233771Skarels# lib/ditroff.font/afmdit.awk
333771Skarels#
433771Skarels# Copyright (c) 1984, 1985 Adobe Systems Incorporated. All Rights Reserved.
533771Skarels#
633771Skarels# RCSID: $Header: afmdit.awk,v 2.1 85/11/24 12:25:05 shore Rel $
733771Skarels#
833771Skarels# This awk(1) program helps build ditroff font description
933771Skarels# files (for input to makedev/devconfig).  It parses
1033771Skarels# Adobe's AFM PostScript font metrics files.
1133771Skarels#
1233771Skarels#
1333771Skarels# The awk program presented here is rather hairy, but documented
1433771Skarels# throughout.  It started out as a simple idea but got a little
1533771Skarels# out of hand, a redesign is in order, but this version works
1633771Skarels# just fine so far.
1733771Skarels#
1833771Skarels# It works on canonical AFM files, home brew ones are not guarenteed,
1933771Skarels# as there is little hope for error detection and recovery.
2033771Skarels#
2133771Skarels# Lots of the extra character definitions (2 letter codes) come from
2233771Skarels#	"Adventures with Typesetter-Independent Troff"
2333771Skarels#	by Mark Kahrs and Lee Moore, Department of Computer Science
2433771Skarels#	Technical Report TR 159, June 1985
2533771Skarels#	University of Rochester, Rochester NY  14627
2633771Skarels# I thank them for their efforts.
2733771Skarels#
2833771Skarels# PostScript is a trademark of Adobe Systems Incorporated.
2933771Skarels#
3033771Skarels# last edit: Fri Nov 15 10:44:34 1985
3133771Skarels#
3233771Skarels# RCSLOG:
3333771Skarels# $Log:	afmdit.awk,v $
3433771Skarels# Revision 2.1  85/11/24  12:25:05  shore
3533771Skarels# Product Release 2.0
3633771Skarels#
3733771Skarels#
3833771Skarels
3933771SkarelsBEGIN {
4033793Skarels	MetricsVersion = 2.0	# afm format version to match
4133771Skarels	SCALE = 5.0		# font width scale factor to
4233771Skarels				# achieve proper dynamic range
4333771Skarels				# (ditroff widths are <= 256)
4433771Skarels	fudge = 10		# ascender/descender fudge factor
4533771Skarels				# a character is judged to be an
4633771Skarels				# ascender (descender) if its bounding
4733771Skarels				# box is within fudge of the published
4833771Skarels				# ascender (descender) numbers for this
4933771Skarels				# font
5033771Skarels
5133771Skarels	# file names for pieces. These are cat'ed together in a shell script.
5233771Skarels	header = "temp.header"	# comments and ligature list
5333771Skarels	spaces = "temp.spaces"	# space widths and "charset" header
5433771Skarels	trailer = "temp.trailer"# actual character data
5533771Skarels	aux = "temp.aux" 	# PS width aux file for psdit
5633771Skarels
5733771Skarels	isspecial = 0		# font is the FIRST special font (S)
5833771Skarels	isfixedpitch = 0	# font is a typewriter font
5933771Skarels	istext = 1		# font is a text font (not special)
6033771Skarels
6133771Skarels# ditmap is a mapping from non-ascii PostScript character names
6233771Skarels#	(plus a few special ones) to DITROFF \( special codes.
6333771Skarels#	Note that some chars have more than one code (separated by spaces).
6433771Skarels#	If we ever determine some extra mappings, or actually digitize
6533771Skarels#	some full ditroff fonts, this will have to change.
6633771Skarels#	Play with it if you like, but the results may be gruesome.
6733771Skarels
6833771Skarels	ditmap[".ditspace"] = "\\^ \\| \\&"
6933771Skarels	ditmap["AE"] = "AE"
7033771Skarels	ditmap["Alpha"] = "*A"
7133771Skarels	ditmap["Beta"] = "*B"
7233771Skarels	ditmap["Chi"] = "*X"
7333771Skarels	ditmap["Delta"] = "*D"
7433771Skarels	ditmap["Epsilon"] = "*E"
7533771Skarels	ditmap["Eta"] = "*Y"
7633771Skarels	ditmap["Gamma"] = "*G"
7733771Skarels	ditmap["Iota"] = "*I"
7833771Skarels	ditmap["Kappa"] = "*K"
7933771Skarels	ditmap["Lambda"] = "*L"
8033771Skarels	ditmap["Lslash"] = "PL"
8133771Skarels	ditmap["Mu"] = "*M"
8233771Skarels	ditmap["Nu"] = "*N"
8333771Skarels	ditmap["OE"] = "OE"
8433771Skarels	ditmap["Omega"] = "*W"
8533771Skarels	ditmap["Omicron"] = "*O"
8633771Skarels	ditmap["Oslash"] = "O/"
8733771Skarels	ditmap["Phi"] = "*F"
8833771Skarels	ditmap["Pi"] = "*P"
8933771Skarels	ditmap["Psi"] = "*Q"
9033771Skarels	ditmap["Rho"] = "*R"
9133771Skarels	ditmap["Sigma"] = "*S"
9233771Skarels	ditmap["Tau"] = "*T"
9333771Skarels	ditmap["Theta"] = "*H"
9433771Skarels	ditmap["Upsilon"] = "*U"
9533771Skarels	ditmap["Xi"] = "*C"
9633771Skarels	ditmap["Zeta"] = "*Z"
9733771Skarels	ditmap["acute"] = "aa \\'"
9833771Skarels	ditmap["ae"] = "ae"
9933771Skarels	ditmap["aleph"] = "al"
10033771Skarels	ditmap["alpha"] = "*a"
10133771Skarels	ditmap["angleleft"] = "l<"
10233771Skarels	ditmap["angleright"] = "r>"
10333771Skarels	ditmap["approxequal"] = "~="
10433771Skarels	ditmap["arrowboth"] = "<>"
10533771Skarels	ditmap["arrowdblboth"] = "io"
10633771Skarels	ditmap["arrowdblleft"] = "<: lh"	# left double arrow (& hand)
10733771Skarels	ditmap["arrowdblright"] = ":> im rh"	# right double arrow (& hand)
10833771Skarels	ditmap["arrowdown"] = "da"
10933771Skarels#	ditmap["arrowleft"] = "<-"	# see procs
11033771Skarels#	ditmap["arrowright"] = "->"	# see procs
11133771Skarels	ditmap["arrowup"] = "ua"
11233771Skarels	ditmap["asteriskmath"] = "**"
11333771Skarels	ditmap["bar"] = "or"
11433771Skarels	ditmap["beta"] = "*b"
11533771Skarels	ditmap["breve"] = "be"
11633771Skarels	ditmap["caron"] = "hc"
11733771Skarels	ditmap["carriagereturn"] = "cr"
11833771Skarels	ditmap["cedilla"] = "cd"
11933771Skarels	ditmap["cent"] = "ct"
12033771Skarels	ditmap["chi"] = "*x"
12133771Skarels	ditmap["circlemultiply"] = "ax"
12233771Skarels	ditmap["circleplus"] = "a+"
12333771Skarels	ditmap["circumflex"] = "^"	# see ascii
12433771Skarels	ditmap["copyrightserif"] = "co"
12533771Skarels	ditmap["dagger"] = "dg"
12633771Skarels	ditmap["daggerdbl"] = "dd"
12733771Skarels	ditmap["degree"] = "de"
12833771Skarels	ditmap["delta"] = "*d"
12933771Skarels	ditmap["diamond"] = "dm"
13033771Skarels	ditmap["dieresis"] = "um .."	# umlaut
13133771Skarels	ditmap["divide"] = "di"
13233771Skarels	ditmap["dotaccent"] = "dt"
13333771Skarels	ditmap["dotlessi"] = "ui"
13433771Skarels	ditmap["dotmath"] = "m."
13533771Skarels	ditmap["element"] = "mo cm"
13633771Skarels	ditmap["emdash"] = "em"
13733771Skarels	ditmap["emptyset"] = "es"
13833771Skarels	ditmap["endash"] = "en"
13933771Skarels	ditmap["epsilon"] = "*e"
14033771Skarels	ditmap["equal"] = "eq"	;	mathonly["eq"] = "equal"
14133771Skarels#	ditmap["equivalence"] = "=="	# see procs
14233771Skarels	ditmap["eta"] = "*y"
14333771Skarels	ditmap["exclamdown"] = "!! I!"
14433771Skarels	ditmap["existential"] = "te"
14533771Skarels	ditmap["ff"] = "ff"
14633771Skarels	ditmap["ffi"] = "Fi"
14733771Skarels	ditmap["ffl"] = "Fl"
14833771Skarels	ditmap["fi"] = "fi"
14933771Skarels	ditmap["fl"] = "fl"
15033771Skarels	ditmap["florin"] = "$D"
15133771Skarels	ditmap["gamma"] = "*g"
15233771Skarels	ditmap["germandbls"] = "ss"
15333771Skarels	ditmap["gradient"] = "gr"
15433771Skarels	ditmap["grave"] = "ga \\`"
15533771Skarels	ditmap["greaterequal"] = ">="
15633771Skarels	ditmap["guillemotleft"] = "d<"
15733771Skarels	ditmap["guillemotright"] = "d>"
15833771Skarels	ditmap["heart"] = "bs"		# bell system logo
15933771Skarels	ditmap["hyphen"] = "hy"
16033771Skarels	ditmap["infinity"] = "if"
16133771Skarels#	ditmap["integral"] = "is"	# see procs
16233771Skarels	ditmap["intersection"] = "ca"
16333771Skarels	ditmap["iota"] = "*i"
16433771Skarels	ditmap["kappa"] = "*k"
16533771Skarels	ditmap["lambda"] = "*l"
16633771Skarels	ditmap["lessequal"] = "<="
16733771Skarels	ditmap["logicaland"] = "an la"
16833771Skarels	ditmap["logicalnot"] = "no"
16933771Skarels	ditmap["logicalor"] = "lo"
17033771Skarels	ditmap["lslash"] = "Pl"
17133771Skarels	ditmap["macron"] = "mc ma"
17233771Skarels	ditmap["minus"] = "\\- mi"
17333771Skarels	ditmap["minute"] = "fm mt"
17433771Skarels	ditmap["mu"] = "*m"
17533771Skarels	ditmap["multiply"] = "mu"
17633771Skarels	ditmap["notelement"] = "!m"
17733771Skarels	ditmap["notequal"] = "!="
17833771Skarels	ditmap["notsubset"] = "!s"
17933771Skarels	ditmap["nu"] = "*n"
18033771Skarels	ditmap["oe"] = "oe"
18133771Skarels	ditmap["ogonek"] = "og"
18233771Skarels	ditmap["omega"] = "*w"
18333771Skarels	ditmap["omicron"] = "*o"
18433771Skarels	ditmap["oslash"] = "o/"
18533771Skarels	ditmap["paragraph"] = "pp"
18633771Skarels	ditmap["partialdiff"] = "pd"
18733771Skarels	ditmap["perpendicular"] = "bt"
18833771Skarels	ditmap["perthousand"] = "pm"
18933771Skarels	ditmap["phi"] = "*f"
19033771Skarels	ditmap["pi"] = "*p"
19133771Skarels	ditmap["plus"] = "pl"	;	mathonly["pl"] = "plus"
19233771Skarels	ditmap["plusminus"] = "+-"
19333771Skarels	ditmap["propersubset"] = "sb"
19433771Skarels	ditmap["propersuperset"] = "sp"
19533771Skarels	ditmap["proportional"] = "pt"
19633771Skarels	ditmap["psi"] = "*q"
19733771Skarels	ditmap["questiondown"] = "?? I?"
19833771Skarels	ditmap["quotedblleft"] = "lq"
19933771Skarels	ditmap["quotedblright"] = "rq"
20033771Skarels	ditmap["quotesingle"] = "n'"
20133771Skarels#	ditmap["radical"] = "sr"	# see procs
20233771Skarels	ditmap["reflexsubset"] = "ib"
20333771Skarels	ditmap["reflexsuperset"] = "ip"
20433771Skarels	ditmap["registerserif"] = "rg"
20533771Skarels	ditmap["rho"] = "*r"
20633771Skarels	ditmap["ring"] = "ri"
20733771Skarels	ditmap["second"] = "sd"
20833771Skarels	ditmap["section"] = "sc"
20933771Skarels	ditmap["sigma"] = "*s"
21033771Skarels	ditmap["sigma1"] = "ts"
21133771Skarels	ditmap["similar"] = "ap"
21233771Skarels	ditmap["slash"] = "sl"
21333771Skarels	ditmap["sterling"] = "ps po"
21433771Skarels	ditmap["tau"] = "*t"
21533771Skarels	ditmap["therefore"] = "tf"
21633771Skarels	ditmap["theta"] = "*h"
21733771Skarels	ditmap["tilde"] = "~"		# see ascii
21833771Skarels	ditmap["trademarkserif"] = "tm"
21933771Skarels	ditmap["underscore"] = "\\_"
22033771Skarels	ditmap["union"] = "cu"
22133771Skarels	ditmap["universal"] = "fa"
22233771Skarels	ditmap["upsilon"] = "*u"
22333771Skarels	ditmap["xi"] = "*c"
22433771Skarels	ditmap["yen"] = "yi yn $J"
22533771Skarels	ditmap["zeta"] = "*z"
22633771Skarels
22733771Skarels# hack font, chars have their troff names
22833771Skarels
22933771Skarels	ditmap["br"] = "br"	# box rule
23033771Skarels	ditmap["bu"] = "bu"	# bullet
23133771Skarels	ditmap["bv"] = "bv"	# bold vertical
23233771Skarels	ditmap["bx"] = "bx"	# box
23333771Skarels	ditmap["ci"] = "ci"	# circle
23433771Skarels	ditmap["lb"] = "lb"	# left bot curly
23533771Skarels	ditmap["lc"] = "lc"	# left ceil
23633771Skarels	ditmap["lf"] = "lf"	# left floor
23733771Skarels	ditmap["lk"] = "lk"	# left center curly
23833771Skarels	ditmap["lt"] = "lt"	# left top curly
23933771Skarels	ditmap["ob"] = "ob"	# outline bullet
24033771Skarels	ditmap["rb"] = "rb"	# right bot curly
24133771Skarels	ditmap["rc"] = "rc"	# right ceil
24233771Skarels	ditmap["rf"] = "rf"	# right floor
24333771Skarels	ditmap["rk"] = "rk"	# right center curly
24433771Skarels	ditmap["rn"] = "rn"	# root extender
24533771Skarels	ditmap["rt"] = "rt"	# rith top curly
24633771Skarels	ditmap["ru"] = "ru"	# rule
24733771Skarels	ditmap["sq"] = "sq"	# square
24833771Skarels	ditmap["ul"] = "ul"	# under rule
24933771Skarels	ditmap["vr"] = "vr"	# vertical rule
25033771Skarels
25133771Skarels
25233771Skarels
25333771Skarels# >>>>> IMPORTANT NOTE! <<<<<
25433771Skarels# if you edit these, make sure you supply char codes and widths
25533771Skarels# below (in proc[]) and make sure you define the proc in the
25633771Skarels# PostScript prolog
25733771Skarels
25833771Skarels	ditmap[".proctext"] = "14 12 34 18 38 58 78 13 23"
259*34000Sedward	ditmap[".procspecial"] = "is sr -> <- == uc"
26033771Skarels
26133771Skarels	# character-code and width info for synthetic characters
26233771Skarels
26333771Skarels	cc = 129	# manufacture unique character codes
26433771Skarels	proc["14"] = cc++ " 0 833"	# 1/4
26533771Skarels	proc["12"] = cc++ " 0 833"	# 1/2
26633771Skarels	proc["34"] = cc++ " 0 833"	# 3/4
26733771Skarels	proc["18"] = cc++ " 0 833"	# 1/8
26833771Skarels	proc["38"] = cc++ " 0 833"	# 3/8
26933771Skarels	proc["58"] = cc++ " 0 833"	# 5/8
27033771Skarels	proc["78"] = cc++ " 0 833"	# 7/8
27133771Skarels	proc["13"] = cc++ " 0 833"	# 1/3
27233771Skarels	proc["23"] = cc++ " 0 833"	# 2/3
273*34000Sedward	proc["uc"] = cc++ " 0 0"	# uc seal
27433771Skarels
27533771Skarels#	proc["mi"] = cc++ " 0 549"	# minus
27633771Skarels
27733771Skarels	proc["sr"] = "214 0 549"	# square root
27833771Skarels	proc["is"] = "242 3 274"	# integral
27933771Skarels	proc["->"] = "174 0 987"        # arrow right
28033771Skarels	proc["<-"] = "172 0 987"        # arrow left
28133771Skarels	proc["=="] = "186 0 549"        # equivalence
28233771Skarels
28333771Skarels# L. and l. are used for line drawing on systems without graphics
28433771Skarels
28533771Skarels# ascii is a mapping which contains the PostScript character names
28633771Skarels#	for the (printable) ascii characters.  The values are the ascii
28733771Skarels#	character codes (not used in this program).  We just test to
28833771Skarels#	see if a name is in the table.
28933771Skarels#	ditroff (unlike Adobe) thinks that the ascii ^ and ~ are the accents
29033771Skarels#	hence we must leave out asciicircum and asciitilde
29133771Skarels
29233771Skarels	ascii["space"] = 32
29333771Skarels	ascii["exclam"] = 33
29433771Skarels	ascii["quotedbl"] = 34
29533771Skarels	ascii["numbersign"] = 35
29633771Skarels	ascii["dollar"] = 36
29733771Skarels	ascii["percent"] = 37
29833771Skarels	ascii["ampersand"] = 38
29933771Skarels	ascii["quoteright"] = 39
30033771Skarels	ascii["parenleft"] = 40
30133771Skarels	ascii["parenright"] = 41
30233771Skarels	ascii["asterisk"] = 42
30333771Skarels	ascii["plus"] = 43
30433771Skarels	ascii["comma"] = 44
30533771Skarels	ascii["hyphen"] = 45
30633771Skarels	ascii["period"] = 46
30733771Skarels	ascii["slash"] = 47
30833771Skarels	ascii["zero"] = 48
30933771Skarels	ascii["one"] = 49
31033771Skarels	ascii["two"] = 50
31133771Skarels	ascii["three"] = 51
31233771Skarels	ascii["four"] = 52
31333771Skarels	ascii["five"] = 53
31433771Skarels	ascii["six"] = 54
31533771Skarels	ascii["seven"] = 55
31633771Skarels	ascii["eight"] = 56
31733771Skarels	ascii["nine"] = 57
31833771Skarels	ascii["colon"] = 58
31933771Skarels	ascii["semicolon"] = 59
32033771Skarels	ascii["less"] = 60
32133771Skarels	ascii["equal"] = 61
32233771Skarels	ascii["greater"] = 62
32333771Skarels	ascii["question"] = 63
32433771Skarels	ascii["at"] = 64
32533771Skarels	ascii["A"] = 65
32633771Skarels	ascii["B"] = 66
32733771Skarels	ascii["C"] = 67
32833771Skarels	ascii["D"] = 68
32933771Skarels	ascii["E"] = 69
33033771Skarels	ascii["F"] = 70
33133771Skarels	ascii["G"] = 71
33233771Skarels	ascii["H"] = 72
33333771Skarels	ascii["I"] = 73
33433771Skarels	ascii["J"] = 74
33533771Skarels	ascii["K"] = 75
33633771Skarels	ascii["L"] = 76
33733771Skarels	ascii["M"] = 77
33833771Skarels	ascii["N"] = 78
33933771Skarels	ascii["O"] = 79
34033771Skarels	ascii["P"] = 80
34133771Skarels	ascii["Q"] = 81
34233771Skarels	ascii["R"] = 82
34333771Skarels	ascii["S"] = 83
34433771Skarels	ascii["T"] = 84
34533771Skarels	ascii["U"] = 85
34633771Skarels	ascii["V"] = 86
34733771Skarels	ascii["W"] = 87
34833771Skarels	ascii["X"] = 88
34933771Skarels	ascii["Y"] = 89
35033771Skarels	ascii["Z"] = 90
35133771Skarels	ascii["bracketleft"] = 91
35233771Skarels	ascii["backslash"] = 92
35333771Skarels	ascii["bracketright"] = 93
35433771Skarels#	ascii["asciicircum"] = 94	# 195 see ditmap, should be ascii!
35533771Skarels	ascii["underscore"] = 95
35633771Skarels	ascii["quoteleft"] = 96
35733771Skarels	ascii["a"] = 97
35833771Skarels	ascii["b"] = 98
35933771Skarels	ascii["c"] = 99
36033771Skarels	ascii["d"] = 100
36133771Skarels	ascii["e"] = 101
36233771Skarels	ascii["f"] = 102
36333771Skarels	ascii["g"] = 103
36433771Skarels	ascii["h"] = 104
36533771Skarels	ascii["i"] = 105
36633771Skarels	ascii["j"] = 106
36733771Skarels	ascii["k"] = 107
36833771Skarels	ascii["l"] = 108
36933771Skarels	ascii["m"] = 109
37033771Skarels	ascii["n"] = 110
37133771Skarels	ascii["o"] = 111
37233771Skarels	ascii["p"] = 112
37333771Skarels	ascii["q"] = 113
37433771Skarels	ascii["r"] = 114
37533771Skarels	ascii["s"] = 115
37633771Skarels	ascii["t"] = 116
37733771Skarels	ascii["u"] = 117
37833771Skarels	ascii["v"] = 118
37933771Skarels	ascii["w"] = 119
38033771Skarels	ascii["x"] = 120
38133771Skarels	ascii["y"] = 121
38233771Skarels	ascii["z"] = 122
38333771Skarels	ascii["braceleft"] = 123
38433771Skarels	ascii["bar"] = 124
38533771Skarels	ascii["braceright"] = 125
38633771Skarels#	ascii["asciitilde"] = 126	# 196 see ditmap, should be ascii !
38733771Skarels	} # BEGIN
38833771Skarels
38933771Skarels# look at .map files to learn about "special" (sigh)
39033771Skarels
39133771SkarelsFILENAME ~ /^S\.map$/ {
39233771Skarels	isspecial = 1
39333771Skarels	istext = 0
39433771Skarels	next
39533771Skarels	}
39633771Skarels
39733771SkarelsFILENAME ~ /^SS\.map$/ {
39833771Skarels	isspecial = 0
39933771Skarels	istext = 0
40033771Skarels	next
40133771Skarels	}
40233771Skarels
40333771SkarelsFILENAME ~ /.*\.map$/ {next}
40433771Skarels
40533771Skarels
40633771Skarels# Now define the actions on the fields in real AFM format
40733771Skarels#	Note that we generate 3 files which are cat'ed together
40833771Skarels#	outside this program.  This is to avoid scanning the
40933771Skarels#	afm file more than once.  Most of the header stuff is ignored.
41033771Skarels
41133771Skarels/^StartFontMetrics /	{if ($2 != MetricsVersion) {
41233771Skarels				print "ERROR! Metrics Version mismatch"
41333771Skarels				exit 2 # does this get passed out ?
41433771Skarels				}
41533771Skarels			next
41633771Skarels			}
41733771Skarels
41833771Skarels/^Comment Copyright/	{print "# " $0 > header
41933771Skarels			next
42033771Skarels			}
42133771Skarels
42233771Skarels/^Comment /	{next}
42333771Skarels
42433771Skarels/^FontName /	{fontname = $2
42533771Skarels		print "# PostScript " fontname " from " FILENAME > header
42633771Skarels		print "# PostScript is a trademark of Adobe Systems Incorporated" > header
42733771Skarels		next
42833771Skarels		}
42933771Skarels
43033771Skarels/^FullName /	{next}
43133771Skarels
43233771Skarels/^FamilyName /	{next}
43333771Skarels
43433771Skarels/^Weight /	{next}
43533771Skarels
43633771Skarels/^ItalicAngle /	{next}
43733771Skarels
43833771Skarels/^IsFixedPitch /{if ($2 == "true") {isfixedpitch = 1}
43933771Skarels		else {isfixedpitch = 0}
44033771Skarels		next
44133771Skarels		}
44233771Skarels
44333771Skarels/^UnderlinePosition /{next}
44433771Skarels
44533771Skarels/^UnderlineThickness /{next}
44633771Skarels
44733771Skarels/^Version /	{next}
44833771Skarels
44933771Skarels/^Notice /	{print "# " $0 >header
45033771Skarels		next
45133771Skarels		}
45233771Skarels
45333771Skarels/^FontBBox /	{next}
45433771Skarels
45533771Skarels/^CapHeight /	{capheight = $2
45633771Skarels		next
45733771Skarels		}
45833771Skarels
45933771Skarels/^XHeight /	{xheight = $2
46033771Skarels		next
46133771Skarels		}
46233771Skarels
46333771Skarels/^Descender /	{descender = $2
46433771Skarels		next
46533771Skarels		}
46633771Skarels
46733771Skarels/^Ascender /	{ascender = $2
46833771Skarels		next
46933771Skarels		}
47033771Skarels
47133771Skarels/^EncodingScheme /{next}
47233771Skarels
47333771Skarels/^StartCharMetrics/	{printf "ligatures " > header
47433771Skarels			if (capheight < ascender) {
47533771Skarels				ascender = capheight
47633771Skarels				}
47733771Skarels			next}
47833771Skarels
47933771Skarels/^C -1 ;/	{next}			# ignore unencoded chars
48033771Skarels
48133771Skarels# now the hard part: the pattern for encoded characters.
48233771Skarels# note the dependence on canonical form
48333771Skarels# a more detailed parse of split($0,,";") might be better
48433771Skarels
48533771Skarels# 1 2	   3 4  5      6 7 8  9 0 11     12     13     14     15   ???
48633771Skarels/^C [0-9]* ; WX [0-9]* ; N .* ; B [-0-9]* [-0-9]* [-0-9]* [-0-9]* ;/ {
48733771Skarels	charcode = $2
48833771Skarels	width = $5
48933771Skarels	charname = $8
49033771Skarels	bblly = $12
49133771Skarels	bbury = $14
49233771Skarels
49333771Skarels#	parse ligatures
49433771Skarels	n = split($0,line,";")
49533771Skarels	for (i = 5; i < n ; i++) {
49633771Skarels		if (line[i] ~ / L .* .* /) {
49733771Skarels			d = split(line[i],ligs," ")
49833771Skarels			printf "%s ", ligs[d] > header
49933771Skarels			}
50033771Skarels		}
50133771Skarels
50233771Skarels#	compute width
50333771Skarels	scaledwidth = int(0.5 + (width / SCALE))
50433771Skarels	if ((scaledwidth < 0) || (scaledwidth > 256)) {
50533793Skarels		printf "ERROR! Width out of range! (character %s)\n", charname
50633793Skarels#		exit 2
50733793Skarels		next
50833771Skarels		}
50933771Skarels
51033771Skarels#	handle space
51133771Skarels	if (charname == "space") {		# special char widths
51233771Skarels		spacewidth = scaledwidth
51333771Skarels		if (isfixedpitch == 0) {
51433771Skarels			em6 =  int (0.5 + (1000.0/6.0) / SCALE)
51533771Skarels			em12 = int (0.5 + (1000.0/12.0) / SCALE)
51633771Skarels		}
51733771Skarels		else {
51833771Skarels			em6 = spacewidth
51933771Skarels			em12 = spacewidth
52033771Skarels		}
52133771Skarels		printf "spacewidth %d\n", spacewidth > spaces
52233771Skarels		print "charset" > spaces
52333771Skarels		printf "\\|\t%d 0 000\t1/6 em space\n", em6 >trailer
52433771Skarels		printf "\\^\t%d 0 000\t1/12 em space\n", em12 > trailer
52533771Skarels		printf "\\&\t00 0 000\tno space\n" > trailer
52633771Skarels		next
52733771Skarels		}
52833771Skarels
52933771Skarels#	figure out ascender/descender flags (hack!?)
53033771Skarels	ad = 0
53133771Skarels	if (bblly - fudge <= descender) ad += 1
53233771Skarels	if (bbury + fudge >= ascender) ad += 2
53333771Skarels
53433771Skarels#	dump the description line
53533771Skarels	if (length(ascii[charname]) > 0) {
53633771Skarels		printf "%c\t%d %d 0%o\t%s\n", charcode, scaledwidth, ad, charcode, charname  > trailer
53733771Skarels		# look for ditmap synonyms
53833771Skarels		if (length(ditmap[charname]) > 0) {
53933771Skarels			n = split(ditmap[charname],others," ")
54033771Skarels			for (i = 1; i <= n; i++) {
54133771Skarels				oth = others[i];
54233771Skarels				if ((length(mathonly[oth]) > 0) && (isspecial != 1)) continue;
54333771Skarels				printf "%s\t\"\n", others[i]  > trailer
54433771Skarels				}
54533771Skarels			}
54633771Skarels		}
54733771Skarels	else if (length(ditmap[charname]) > 0) {
54833771Skarels		# not a printable ascii character
54933771Skarels		n = split(ditmap[charname],others," ")
55033771Skarels		printf "%s\t%d %d 0%o\t%s\n", others[1], scaledwidth, ad, charcode, charname  > trailer
55133771Skarels		for (i = 2; i <= n; i++) {
55233771Skarels			printf "%s\t\"\n", others[i]  > trailer
55333771Skarels			}
55433771Skarels		}
55533771Skarels
55633771Skarels# dump a line for PS specific actual width/hack table
55733771Skarels
55833771Skarels	printf "%d %d %d\n", charcode, width, specialflag > aux
55933771Skarels
56033771Skarels	}
56133771Skarels
56233771Skarels/^EndCharMetrics/{
56333771Skarels	printf "0\n" > header
56433771Skarels
56533771Skarels	# dump the "fudged" characters.
56633771Skarels	for (i in proc) {
56733771Skarels		p = proc[i]
56833771Skarels		split(p,vals," ")
56933771Skarels		scaledwidth = int(0.5 + (vals[3] / SCALE))
57033771Skarels		if (((istext == 1) && (index(ditmap[".proctext"],i) != 0)) || ((isspecial == 1) && (index(ditmap[".procspecial"],i) != 0))) {
57133771Skarels			printf "%s\t%d %d 0%o\tfudgedproc!\n", i, scaledwidth, vals[2], vals[1] > trailer
57233771Skarels
57333771Skarels			printf "%d %d %d\n", vals[1], vals[3], 1 > aux
57433771Skarels			}
57533771Skarels		}
57633771Skarels	next
57733771Skarels	}
57833771Skarels
57933771Skarels/^EndFontMetrics/{next}
58033771Skarels
58133771SkarelsEND	{}
582