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