#! /bin/awk -f function error(s) { print "dformat error: " s " near input line " NR | "cat 1>&2" } BEGIN { s = "recht 0.3 addrht 0.055 recspread 0.15 " s = s "charwid 0.07 textht 0.167 addrdelta 4 " s = s "bitwid 0.125 linedisp 0.04 addr both " s = s "fill off linethrutext 1" n = split(s, x) for (i = 1; i <= n - 1; i += 2) oparm[x[i]] = parm[x[i]] = x[i+1] } inlang == 0 { if ($0 !~ /^\.begin[ \t]/ || $2 != "dformat") { print } else { inlang = 1 print ".PS" boxacnt = 0 if (firstpic != 1) { firstpic = 1 print "fillval = 0.9" } } next } /^\.end/ { inlang = 0 print ".PE" next } $1 == "style" { if (!($2 in parm)) { error("unrecognized name: " $2) } else if ($3 == "reset") { t = oparm[$2] oparm[$2] = parm[$2] parm[$2] = t } else { oparm[$2] = parm[$2] parm[$2] = $3 } next } $1 == "pic" { $1 = "" print $0 next } /^[^ \t]/ { printf "BoxA: box invis ht %g wid 0", parm["recht"] if (boxacnt++) { printf " with .n at BoxA.s - (0,%g)", parm["recspread"] + maxdy * parm["textht"] } printf "\n" maxdy = sumboxlen = 0 gsub(/[ \t]+$/, "") if ($0 != "noname") { printf " \"%s \" rjust at BoxA.w\n", $0 printf " box invis with .e at BoxA.w ht 0 wid %g\n", parm["charwid"] * (length($0) + 3) } printf " BoxB: box invis ht %g wid 0 at BoxA\n", parm["recht"] next } /./ { boxname = "" if ($1 ~ /:$/) { boxname = substr($1, 1, length($1) - 1) $1 = "" $0 = " " $0 } range = $1 $1 = "" gsub(/^[ \t]+/, "") gsub(/[ \t]+$/, "") text = $0 n = split(range, x, "-") rlo = x[1] rhi = (n >= 2) ? x[2] : rlo cwid = (rhi >= rlo) ? rhi - rlo + 1 : rlo - rhi + 1 rwid = (n >= 3) ? (0 + x[3]) : cwid btype = x[4] if (btype !~ /^(dot|dash|invis)/) { btype = "solid" } textlen = parm["charwid"] * length(text) boxlen = parm["bitwid"] * rwid dy = 0 if (textlen > boxlen) { # set dy, the channel for this text chan[maxdy + 1] = -999 for (dy = 1; chan[dy] + textlen > sumboxlen; dy++); if (dy > maxdy) { maxdy = dy } if (parm["linethrutext"] == 0) { for (k = 1; k <= dy; k++) { chan[k] = sumboxlen+boxlen } } else { chan[dy] = sumboxlen } } sumboxlen += boxlen fill = "" if (parm["fill"] == "on") { fill = " fill " } if (boxname != "") { printf " %s:", boxname } printf " BoxB: box %s %s ht %g wid %g with .w at BoxB.e\n", fill, btype, parm["recht"], boxlen if (dy == 0) { printf " \"%s\" at BoxB.c\n", text } else { if (rwid < 2) { start = "BoxB.s" } else { start = "BoxB.se - (" parm["linedisp"] ",0)" } printf " line from %s down %g\n", start, dy * parm["textht"] printf " \"%s\\|\" at last line .s rjust\n", text printf " box invis with .e at last line .s ht 0 wid %g\n", textlen } if (parm["addr"] ~ /^(left|right|both)$/) { dp = int(parm["addrdelta"]) # Delta Point size if (dp < 0 || dp > 9) { error("bad addrdelta value: " dp) } dah = parm["addrht"] # Delta Addr Height pb = parm["addr"] # Parameter for Bits if (rlo == rhi) { printf " \"\\s-%d%s\\s+%d\" at BoxB.s + (0,%g)\n", dp, rlo, dp, dah } else { if (pb == "left" || pb == "both") { printf "\t\"\\|\\s-%d%s\\s+%d\" ljust at BoxB.sw + (0,%g)\n", dp, rlo, dp, dah } if (pb == "right" || pb == "both") { printf "\t\"\\s-%d%s\\s+%d\\|\" rjust at BoxB.se + (0,%g)\n", dp, rhi, dp, dah } } } } END { if (inlang) { error("eof inside begin/end") } }