diff options
author | wkj <devnull@localhost> | 2004-05-16 07:58:31 +0000 |
---|---|---|
committer | wkj <devnull@localhost> | 2004-05-16 07:58:31 +0000 |
commit | b3878828c6c965e0c0953d1c8a2af01378908b75 (patch) | |
tree | f16be56c8bb0605ffb79a109c90cd433f7261673 | |
parent | b237df90f9390dac1ff1fdcb6813ca1f2a7bef4f (diff) | |
download | plan9port-b3878828c6c965e0c0953d1c8a2af01378908b75.tar.gz plan9port-b3878828c6c965e0c0953d1c8a2af01378908b75.tar.bz2 plan9port-b3878828c6c965e0c0953d1c8a2af01378908b75.zip |
bwk's dformat.
-rwxr-xr-x | src/cmd/dformat | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/cmd/dformat b/src/cmd/dformat new file mode 100755 index 00000000..f14b5841 --- /dev/null +++ b/src/cmd/dformat @@ -0,0 +1,108 @@ +awk ' +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") } +' $* |