V10/cmd/omovie/stills.awk
BEGIN {
# develop is set from first argument of form develop=filename
fillstring = "; line from GL.n to GL.s; line from GL.e to GL.w "\
"; line from GL.ne to GL.sw; line from GL.nw to GL.se"
set(textname, "small s medium m big b bigbig B")
set(linename, "solid s fat f fatfat F")
set(justtr, "l ljust r rjust a above b below")
set(linetr, "o dotted a dashed"); linetr["s"] = linetr["f"] = linetr["F"] = ""
set(arrowtr, "< <- > -> x <->"); arrowtr["-"] = ""
set(convert, "dot \\s+3.\\s-3 bullet \\s-3\\(bu\\s+3 "\
"times \\s-3\\(mu\\s+3 circle \\s-3\\(ob\\s+3")
instills = 0
}
instills == 0 { if ($1 == ".begin" && /^\.begin[ \t]+stills/) {
instills = 1; startstills()
} else print
next
}
/^\.end/ { instills = 0; endstills(); next }
END { if (instills) fatal("eof inside begin/end") }
{ inputline = $0; sub(/\#.*$/, "") }
/^[ \t]*$/ { next }
$1 == "view" { viewnum[$2] = viewct++
if (NF <= 2) text = $2
else { text = rest(3)
if (text ~ /^"/) {
if (text !~ /"$/) text = substr(text,2)
else text=substr(text,2,length(text)-2)
}
}
inviewtitle[$2] = text
next
}
$1 == "print" { sawprint = 1
if ($2 == "all") printglobal = 1
else if ($2 == "final") printfinal = 1
else { # print <clickname> ...
if ($3 == "all") { # print <clickname> all
allnamearr[$2] = 1
} else { # print <clickname> v1 v2 ...
if (!($2 in snamenum))
snamenum[$2] = snamenumct++
for (i = 3; i <= NF; i++)
printsome[snamenum[$2] "." $i]=1
}
}
next
}
/./ { # parameter assignments
n = $2; sub(/^\+/, "", n); n = 0 + n
if ($1 == "file") infile = $2
else if ($1 == "across") across = n
else if ($1 == "down") down = n
else if ($1 == "margin") margin = n
else if ($1 == "frameht") frameht = n
else if ($1 == "framewid") framewid = n
else if ($1 in textname) textinc[textname[$1]] = n
else if ($1 in linename) lineinc[linename[$1]] = n
else if ($1 ~ /^times?$/) {
wanttime = 1; if ($2 == "invis") wanttime = 0
} else if ($1 ~ /^frames?$/) {
wantframe = 1; if ($2 == "invis") wantframe = 0
} else warn("unrecognized command")
next
}
function rest(f, s, i) { # rest of $0, starting at $f
if (NF <= f) return $f
s = $0
sub(/^[ \t]+/, "", s)
for (i = 1; i < f; i++)
sub(/^[^ \t]+[ \t]+/, "", s)
return s
}
function dump(time, i, gtype, vnum, x1, x2, y1, y2,
opts, text, delta, btype) {
btype = ""; if (wantframe == 0) btype = " invis"
if (goacross == 0) { # time goes down the page, views go across
if (colcnt >= colmax) {
delta = .1; if (wanttime) delta += .8
print "A0: box invis wid 0 ht 0 with .sw at A0.sw + ("\
viewct*framewid + delta " , 0)"
print "B0: box invis wid 0 ht 0 with .sw at A0.sw"
colcnt = 0
}
print "B0: box" btype " wid framewid ht frameht with .n at B0.s"
for (i = 1; i < viewct; i++)
print "B" i ": box" btype\
" wid framewid ht frameht with .w at B" i-1 ".e"
if (colcnt == 0)
for (i = 0; i < viewct; i++)
if (viewtitle[i] != "")
print "\"" viewtitle[i] "\" at B"\
viewbase[i] ".n + (0, .1)"
if (wanttime)
print "\"" time "\" ljust at B" viewct-1 ".e + (.1,0)"
} else { # time goes across the page, views go down
if (colcnt >= colmax) {
delta = .1; if (wanttime) delta += .3
print "A0: box invis wid 0 ht 0 with .c at A0.c - (0,"\
viewct*frameht + delta ")"
print "B0: box invis wid 0 ht 0 with .c at A0.c"
colcnt = 0
}
print "B0: box" btype " wid framewid ht frameht with .w at B0.e"
for (i = 1; i < viewct; i++)
print "B" i ": box" btype\
" wid framewid ht frameht with .n at B" i-1 ".s"
if (colcnt == 0)
for (i = 0; i < viewct; i++)
if (viewtitle[i] != "")
print "\"" viewtitle[i] "\" rjust at B"\
viewbase[i] ".w - (.1, 0)"
if (wanttime)
print "\"" time "\" at B" viewct-1 ".s + (0,-.15)"
}
colcnt++
for (i = 1; i <= slotcnt; i++)
if (slot[i] != "") {
if (slot[i] ~ /^g\t/) slot[i] = makepic(slot[i])
print slot[i]
}
for (i = 1; i <= staticcnt; i++)
print static[i]
}
function pos(x, y) {
return sprintf("B%d.sw+(%.3g,%.3g)", basenum,\
framexfac*(frameborder+x), frameyfac*(frameborder+y))
}
function makepic(istring, fields, gtype, vnum, pstring, just,
x1, x2, y1, y2, opts, text, i, t, linemode, arrow,
inc, ss, es) { # convert int file string to pic
fields = split(istring, f, "\t")
gtype=f[3]; vnum=f[4]; opts=f[5]; x1=f[6]; y1=f[7]
basenum = viewbase[vnum]
if (gtype == "l") { # line
x2 = f[8]; y2 = f[9]
linemode = substr(opts,1,1) # solid,fat,fatfat,dotted,dashed
arrow = substr(opts,2,1) # -,->,<-, <->
pstring = "line " linetr[linemode] " " arrowtr[arrow]\
" from " pos(x1, y1) " to " pos(x2, y2)
if (linemode != "f" && linemode != "F") linemode = "s"
inc = lineinc[linemode]
if (inc != 0) {
if (inc < 0) { ss = inc; es = "+" 0-inc }
else { ss = "+" inc; es = "-" inc }
pstring = ".ps " ss "\n" pstring "\n.ps " es
}
} else if (gtype == "b") { # box
x2 = f[8]; y2 = f[9]
if (x1 > x2) { t = x1; x1 = x2; x2 = t }
if (y1 > y2) { t = y1; y1 = y2; y2 = t }
pstring = "GL: box with .sw at " pos(x1,y1)\
" ht " (y2-y1)*frameyfac\
" wid " (x2-x1)*framexfac
if (substr(opts,1,1) == "f") pstring = pstring fillstring
} else if (gtype == "c") { # circle
pstring = "GL: circle radius " framexfac*f[8]\
" at " pos(x1, y1)
if (substr(opts,1,1) == "f") pstring = pstring fillstring
} else if (gtype == "t") { # text
if (fields == 8) text = f[8]
for (i = 9; i <= fields; i++) text = text "\t" f[i]
if (text in convert) text = convert[text]
just = justtr[substr(opts,1,1)]
pstring = "\"" text "\" " just " at " pos(x1, y1)
inc = textinc[substr(opts,2,1)]
if (inc != 0) {
if (inc < 0) { ss = inc; es = "+" 0-inc }
else { ss = "+" inc; es = "-" inc }
pstring = ".ps " ss "\n" pstring "\n.ps " es
}
} else warn("int file bug: illegal modifier after g")
return pstring
}
function warn(s) {
print "stills warning: " s >"/dev/tty"
print " near input line " NR ": " inputline >"/dev/tty"
}
function fatal(s) {
print "stills fatal error: " s >"/dev/tty"
print " near input line " NR ": " inputline >"/dev/tty"
exit
}
function startstills() {
set(textinc, "s -2 m 0 b 3 B 8")
set(lineinc, "s 0 f 3 F 8")
infile = ""; sawprint = 0
frameht = 1.5; framewid = 1.5; margin = 0.05
wanttime = wantframe = 1
printglobal = printfinal = 0
across = 0; down = -1
clear(allnamearr)
clear(allnumarr)
clear(clickname)
clear(inviewtitle)
clear(printsome)
clear(slot) ; slotcnt = 0
clear(somenum)
clear(snamenum) ; snamenumct = 0
clear(static) ; staticcnt = 0
clear(timectr)
clear(viewactive)
clear(viewtitle)
clear(viewnum) ; viewct = 0
print ".PS"
print "A0: B0: box invis wid 0 ht 0"
}
function clear(a, i) {
for (i in a) delete a[i]
}
function set(a, s, i, n, q) {
n = split(s, q)
for (i = 1; i < n; i += 2)
a[q[i]] = q[i+1]
}
function endstills() {
if (sawprint = 0) warn("no print statements")
if (viewct == 0) viewglobal = 1
if (down < 0) {
goacross = 1; colmax = across; ratio = 6/framewid
} else {
goacross = 0; colmax = down; ratio = 8/frameht
}
if (colmax <= 0) colmax = int(ratio)
inputrange = 10000 # 0..9999
frameborder = inputrange * margin # border of whitespace
framexfac = framewid/(inputrange + 2*frameborder)
frameyfac = frameht/(inputrange + 2*frameborder)
print "frameht = " frameht
print "framewid = " framewid
if (infile == "") fatal("missing script file name")
if (infile !~ /\.s$/) fatal("script file name must end in .s")
system(develop " " infile)
sub(".s$", ".i", infile)
OFMT = "%.3g"
FS = "\t"
while ((getline <infile) > 0) {
if ($1 == "g") {
if (viewactive[$4]) {
snum = $2
if (snum > slotcnt) slotcnt = snum
if (snum != 0) slot[snum] = $0
else static[++staticcnt] = makepic($0)
}
} else if ($1 == "e") { # erase
if (viewactive[$4]) slot[$2] = ""
} else if ($1 == "c") { # click
++timectr[$2]
if (printglobal || allnumarr[$2] ||
(somenum[$2] "." timectr[$2] in printsome))
dump(clickname[$2] ": " timectr[$2])
} else if ($1 == "#") { # comment -- ignore it
} else if ($1 == "b") { # blank the current view by enclosed erases
} else if ($1 == "d") { # define
if ($2 == "c") { # click
clickname[$3] = $4
allnumarr[$3] = 0
if ($4 in allnamearr) allnumarr[$3] = 1
somenum[$3] = -1
if ($4 in snamenum) somenum[$3] = snamenum[$4]
} else if ($2 == "v") { # view
viewactive[$3] = 0
if ($4 in viewnum) {
viewactive[$3] = 1
viewbase[$3] = viewnum[$4]
viewtitle[$3] = inviewtitle[$4]
} else if (viewglobal) {
viewactive[$3] = 1
viewbase[$3] = viewct++
viewtitle[$3] = $4
}
} else if ($2 == "p") { # ``pragmas'' -- check here?
} else warn("int file bug: illegal modifier following d")
} else warn("int file bug: unrecognized command")
}
close(infile)
if (printfinal) dump("final")
print ".PE"
FS = " "
}