|
|
1.1 ! root 1: BEGIN { ! 2: # develop is set from first argument of form develop=filename ! 3: ! 4: fillstring = "; line from GL.n to GL.s; line from GL.e to GL.w "\ ! 5: "; line from GL.ne to GL.sw; line from GL.nw to GL.se" ! 6: set(textname, "small s medium m big b bigbig B") ! 7: set(linename, "solid s fat f fatfat F") ! 8: set(justtr, "l ljust r rjust a above b below") ! 9: set(linetr, "o dotted a dashed"); linetr["s"] = linetr["f"] = linetr["F"] = "" ! 10: set(arrowtr, "< <- > -> x <->"); arrowtr["-"] = "" ! 11: set(convert, "dot \\v'-.2m'\\s+3.\\s-3\\v'.2m' "\ ! 12: "bullet \\v'.2m'\\s+2\\(bu\\s-2\\v'-.2m' "\ ! 13: "times \\s-3\\(mu\\s+3 circle \\s-3\\(ob\\s+3") ! 14: instills = 0 ! 15: } ! 16: ! 17: instills == 0 { if ($1 == ".begin" && /^\.begin[ \t]+stills/) { ! 18: instills = 1; startstills() ! 19: } else print ! 20: next ! 21: } ! 22: /^\.end/ { instills = 0; endstills(); next } ! 23: END { if (instills) fatal("eof inside begin/end") } ! 24: ! 25: { inputline = $0; sub(/\#.*$/, "") } ! 26: /^[ \t]*$/ { next } ! 27: $1 == "view" { viewnum[$2] = viewct++ ! 28: if (NF <= 2) text = $2 ! 29: else { text = rest(3) ! 30: if (text ~ /^"/) { ! 31: if (text !~ /"$/) text = substr(text,2) ! 32: else text=substr(text,2,length(text)-2) ! 33: } ! 34: } ! 35: inviewtitle[$2] = text ! 36: next ! 37: } ! 38: $1 == "print" { sawprint = 1 ! 39: if ($2 == "all") printglobal = 1 ! 40: else if ($2 == "final") printfinal = 1 ! 41: else { # print <clickname> ... ! 42: if ($3 == "all") { # print <clickname> all ! 43: allnamearr[$2] = 1 ! 44: } else { # print <clickname> v1 v2 ... ! 45: if (!($2 in snamenum)) ! 46: snamenum[$2] = snamenumct++ ! 47: for (i = 3; i <= NF; i++) ! 48: printsome[snamenum[$2] "." $i]=1 ! 49: } ! 50: } ! 51: next ! 52: } ! 53: /./ { # parameter assignments ! 54: n = $2; sub(/^\+/, "", n); n = 0 + n ! 55: if ($1 == "file") infile = $2 ! 56: else if ($1 == "across") across = n ! 57: else if ($1 == "down") down = n ! 58: else if ($1 == "margin") margin = n ! 59: else if ($1 == "frameht") frameht = n ! 60: else if ($1 == "framewid") framewid = n ! 61: else if ($1 in textname) textinc[textname[$1]] = n ! 62: else if ($1 in linename) lineinc[linename[$1]] = n ! 63: else if ($1 ~ /^times?$/) { ! 64: wanttime = 1; if ($2 == "invis") wanttime = 0 ! 65: } else if ($1 ~ /^frames?$/) { ! 66: wantframe = 1; if ($2 == "invis") wantframe = 0 ! 67: } else warn("unrecognized command") ! 68: next ! 69: } ! 70: ! 71: function rest(f, s, i) { # rest of $0, starting at $f ! 72: if (NF <= f) return $f ! 73: s = $0 ! 74: sub(/^[ \t]+/, "", s) ! 75: for (i = 1; i < f; i++) ! 76: sub(/^[^ \t]+[ \t]+/, "", s) ! 77: return s ! 78: } ! 79: ! 80: function dump(time, i, gtype, vnum, x1, x2, y1, y2, ! 81: opts, text, delta, btype) { ! 82: btype = ""; if (wantframe == 0) btype = " invis" ! 83: if (goacross == 0) { # time goes down the page, views go across ! 84: if (colcnt >= colmax) { ! 85: delta = .1; if (wanttime) delta += .8 ! 86: print "A0: box invis wid 0 ht 0 with .sw at A0.sw + ("\ ! 87: viewct*framewid + delta " , 0)" ! 88: print "B0: box invis wid 0 ht 0 with .sw at A0.sw" ! 89: colcnt = 0 ! 90: } ! 91: print "B0: box" btype " wid framewid ht frameht with .n at B0.s" ! 92: for (i = 1; i < viewct; i++) ! 93: print "B" i ": box" btype\ ! 94: " wid framewid ht frameht with .w at B" i-1 ".e" ! 95: if (colcnt == 0) ! 96: for (i = 0; i < viewct; i++) ! 97: if (viewtitle[i] != "") ! 98: print "\"" viewtitle[i] "\" at B"\ ! 99: viewbase[i] ".n + (0, .1)" ! 100: if (wanttime) ! 101: print "\"" time "\" ljust at B" viewct-1 ".e + (.1,0)" ! 102: } else { # time goes across the page, views go down ! 103: if (colcnt >= colmax) { ! 104: delta = .1; if (wanttime) delta += .3 ! 105: print "A0: box invis wid 0 ht 0 with .c at A0.c - (0,"\ ! 106: viewct*frameht + delta ")" ! 107: print "B0: box invis wid 0 ht 0 with .c at A0.c" ! 108: colcnt = 0 ! 109: } ! 110: print "B0: box" btype " wid framewid ht frameht with .w at B0.e" ! 111: for (i = 1; i < viewct; i++) ! 112: print "B" i ": box" btype\ ! 113: " wid framewid ht frameht with .n at B" i-1 ".s" ! 114: if (colcnt == 0) ! 115: for (i = 0; i < viewct; i++) ! 116: if (viewtitle[i] != "") ! 117: print "\"" viewtitle[i] "\" rjust at B"\ ! 118: viewbase[i] ".w - (.1, 0)" ! 119: if (wanttime) ! 120: print "\"" time "\" at B" viewct-1 ".s + (0,-.15)" ! 121: } ! 122: colcnt++ ! 123: for (i = 1; i <= slotcnt; i++) ! 124: if (slot[i] != "") { ! 125: if (slot[i] ~ /^g\t/) slot[i] = makepic(slot[i]) ! 126: print slot[i] ! 127: } ! 128: for (i = 1; i <= staticcnt; i++) ! 129: print static[i] ! 130: } ! 131: ! 132: function pos(x, y) { ! 133: return sprintf("B%d.sw+(%.3g,%.3g)", basenum,\ ! 134: framexfac*(frameborder+x), frameyfac*(frameborder+y)) ! 135: } ! 136: ! 137: function makepic(istring, fields, gtype, vnum, pstring, just, ! 138: x1, x2, y1, y2, opts, text, i, t, linemode, arrow, ! 139: inc, ss, es) { # convert int file string to pic ! 140: fields = split(istring, f, "\t") ! 141: gtype=f[3]; vnum=f[4]; opts=f[5]; x1=f[6]; y1=f[7] ! 142: basenum = viewbase[vnum] ! 143: if (gtype == "l") { # line ! 144: x2 = f[8]; y2 = f[9] ! 145: linemode = substr(opts,1,1) # solid,fat,fatfat,dotted,dashed ! 146: arrow = substr(opts,2,1) # -,->,<-, <-> ! 147: pstring = "line " linetr[linemode] " " arrowtr[arrow]\ ! 148: " from " pos(x1, y1) " to " pos(x2, y2) ! 149: if (linemode != "f" && linemode != "F") linemode = "s" ! 150: inc = lineinc[linemode] ! 151: if (inc != 0) { ! 152: if (inc < 0) { ss = inc; es = "+" 0-inc } ! 153: else { ss = "+" inc; es = "-" inc } ! 154: pstring = ".ps " ss "\n" pstring "\n.ps " es ! 155: } ! 156: } else if (gtype == "b") { # box ! 157: x2 = f[8]; y2 = f[9] ! 158: if (x1 > x2) { t = x1; x1 = x2; x2 = t } ! 159: if (y1 > y2) { t = y1; y1 = y2; y2 = t } ! 160: pstring = "GL: box with .sw at " pos(x1,y1)\ ! 161: " ht " (y2-y1)*frameyfac\ ! 162: " wid " (x2-x1)*framexfac ! 163: if (substr(opts,1,1) == "f") pstring = pstring fillstring ! 164: } else if (gtype == "c") { # circle ! 165: pstring = "GL: circle radius " framexfac*f[8]\ ! 166: " at " pos(x1, y1) ! 167: if (substr(opts,1,1) == "f") pstring = pstring fillstring ! 168: } else if (gtype == "t") { # text ! 169: if (fields == 8) text = f[8] ! 170: for (i = 9; i <= fields; i++) text = text "\t" f[i] ! 171: if (text in convert) text = convert[text] ! 172: just = justtr[substr(opts,1,1)] ! 173: pstring = "\"" text "\" " just " at " pos(x1, y1) ! 174: inc = textinc[substr(opts,2,1)] ! 175: if (inc != 0) { ! 176: if (inc < 0) { ss = inc; es = "+" 0-inc } ! 177: else { ss = "+" inc; es = "-" inc } ! 178: pstring = ".ps " ss "\n" pstring "\n.ps " es ! 179: } ! 180: } else warn("int file bug: illegal modifier after g") ! 181: return pstring ! 182: } ! 183: ! 184: function warn(s) { ! 185: print "stills warning: " s >"/dev/tty" ! 186: print " near input line " NR ": " inputline >"/dev/tty" ! 187: } ! 188: function fatal(s) { ! 189: print "stills fatal error: " s >"/dev/tty" ! 190: print " near input line " NR ": " inputline >"/dev/tty" ! 191: exit ! 192: } ! 193: ! 194: function startstills() { ! 195: set(textinc, "s -2 m 0 b 3 B 8") ! 196: set(lineinc, "s 0 f 3 F 8") ! 197: infile = ""; sawprint = 0 ! 198: frameht = 1.5; framewid = 1.5; margin = 0.05 ! 199: wanttime = wantframe = 1 ! 200: printglobal = printfinal = 0 ! 201: across = 0; down = -1 ! 202: clear(allnamearr) ! 203: clear(allnumarr) ! 204: clear(clickname) ! 205: clear(inviewtitle) ! 206: clear(printsome) ! 207: clear(slot) ; slotcnt = 0 ! 208: clear(somenum) ! 209: clear(snamenum) ; snamenumct = 0 ! 210: clear(static) ; staticcnt = 0 ! 211: clear(timectr) ! 212: clear(viewactive) ! 213: clear(viewtitle) ! 214: clear(viewnum) ; viewct = 0 ! 215: print ".PS" ! 216: print "A0: B0: box invis wid 0 ht 0" ! 217: } ! 218: ! 219: function clear(a, i) { ! 220: for (i in a) delete a[i] ! 221: } ! 222: function set(a, s, i, n, q) { ! 223: n = split(s, q) ! 224: for (i = 1; i < n; i += 2) ! 225: a[q[i]] = q[i+1] ! 226: } ! 227: ! 228: function endstills() { ! 229: if (sawprint = 0) warn("no print statements") ! 230: if (viewct == 0) viewglobal = 1 ! 231: if (down < 0) { ! 232: goacross = 1; colmax = across; ratio = 6/framewid ! 233: } else { ! 234: goacross = 0; colmax = down; ratio = 8/frameht ! 235: } ! 236: if (colmax <= 0) colmax = int(ratio) ! 237: inputrange = 10000 # 0..9999 ! 238: frameborder = inputrange * margin # border of whitespace ! 239: framexfac = framewid/(inputrange + 2*frameborder) ! 240: frameyfac = frameht/(inputrange + 2*frameborder) ! 241: print "frameht = " frameht ! 242: print "framewid = " framewid ! 243: if (infile == "") fatal("missing script file name") ! 244: if (infile !~ /\.s$/) fatal("script file name must end in .s") ! 245: system(develop " " infile) ! 246: sub(".s$", ".i", infile) ! 247: OFMT = "%.3g" ! 248: FS = "\t" ! 249: while ((getline <infile) > 0) { ! 250: if ($1 == "g") { ! 251: if (viewactive[$4]) { ! 252: snum = $2 ! 253: if (snum > slotcnt) slotcnt = snum ! 254: if (snum != 0) slot[snum] = $0 ! 255: else static[++staticcnt] = makepic($0) ! 256: } ! 257: } else if ($1 == "e") { # erase ! 258: if (viewactive[$4]) slot[$2] = "" ! 259: } else if ($1 == "c") { # click ! 260: ++timectr[$2] ! 261: if (printglobal || allnumarr[$2] || ! 262: (somenum[$2] "." timectr[$2] in printsome)) ! 263: dump(clickname[$2] ": " timectr[$2]) ! 264: } else if ($1 == "#") { # comment -- ignore it ! 265: } else if ($1 == "b") { # blank the current view by enclosed erases ! 266: } else if ($1 == "d") { # define ! 267: if ($2 == "c") { # click ! 268: clickname[$3] = $4 ! 269: allnumarr[$3] = 0 ! 270: if ($4 in allnamearr) allnumarr[$3] = 1 ! 271: somenum[$3] = -1 ! 272: if ($4 in snamenum) somenum[$3] = snamenum[$4] ! 273: } else if ($2 == "v") { # view ! 274: viewactive[$3] = 0 ! 275: if ($4 in viewnum) { ! 276: viewactive[$3] = 1 ! 277: viewbase[$3] = viewnum[$4] ! 278: viewtitle[$3] = inviewtitle[$4] ! 279: } else if (viewglobal) { ! 280: viewactive[$3] = 1 ! 281: viewbase[$3] = viewct++ ! 282: viewtitle[$3] = $4 ! 283: } ! 284: } else if ($2 == "p") { # ``pragmas'' -- check here? ! 285: } else warn("int file bug: illegal modifier following d") ! 286: } else warn("int file bug: unrecognized command") ! 287: } ! 288: close(infile) ! 289: if (printfinal) dump("final") ! 290: print ".PE" ! 291: FS = " " ! 292: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.