home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
contrib
/
treefox.lzh
/
trees.icn
< prev
next >
Wrap
Text File
|
1993-04-29
|
8KB
|
269 lines
## TREES.ICN
global Lines, max, inter, inp, out, insitu, catlen, tabs,
calctabs, tincr, toffset, tadj, leftm
procedure main()
max := 8
calctabs := 0
tincr := 6 # C10=7.2 C16=4.32 C12=6
toffset := 1
leftm := 72
tadj := 4
out := open("TREES.OUT","w")
write("\n\nTREES - tree drawing utility")
write("(c) M. Jahn 1992")
write("\nPlease note:")
write(" - Input is expected from TREES.IN (ASCII)")
write(" (see sample in TREES.IN)")
write(" - Output goes to TREES.OUT")
write("\nSettings:")
writes(" Max Depth: (ENTER=8) ")
max:=integer(read())
write(" Format: (ENTER=terminals on baseline)")
writes(" ( 1=terminals in situ ) ")
insitu := read()
writes(" Calculate Tabstops: (ENTER=no) ")
if getch() ~== char(13) then {
write()
calctabs := 1
writes(" Increment Value (ENTER=6): ")
tincr := numeric(read())
writes(" Left Margin at (ENTER=72): ")
leftm := numeric(read())
writes(" Indent how many spaces (ENTER=1): ")
toffset:=integer(read())
if toffset<1 then toffset := 1
writes(" Proportional Adjustment (ENTER=4): ")
tadj := numeric(read())
}
write()
if insitu=="" then insitu:=0 else insitu := 1
(inp := open("TREES.IN")) | stop("TREES.IN not found")
repeat {
(lst0 := makestree()) | stop("eof: TREES.IN.")
write(lst0)
(lst0||".") ? if not (tab(bal(".")) & pos(-1)) then
stop("brackets not balanced.")
showtree(lst0)
} #repeat loop
end #main
procedure makestree()
(zeile := getroot()) | fail
if find("(",zeile) then return zeile || ","
curr := trim(read(inp)[3:0])
curr := map(curr,".,","·√")
currlev := 1
while nxt := getnxt() do {
nxtlev := upto(~' ',nxt)
nxt := nxt[nxtlev:0]
nxtlev := integer(nxtlev / 2)
if nxtlev=currlev then zeile ||:= "," || curr else
if nxtlev > currlev then zeile ||:= ",(" || curr else
zeile ||:= "," || curr || repl(")", currlev-nxtlev)
#write("zeile=", zeile)
#if read()=="x" then stop()
curr := nxt
currlev := nxtlev
}
zeile ||:= "," || curr || repl(")", currlev-1)
#write("letzte zeile=", zeile)
return "*" || zeile || ","
end #makestree
procedure getroot()
while x := trim(read(inp)) do {
if (x[1]=="#") | (x=="") then { write(out, x); next }
return x
}
end
procedure getnxt()
(nxt := trim(read(inp))) | fail
if nxt=="" then fail
return map(nxt,".,","·√")
end
procedure get_terms(tree)
local st, x
st:=""
tree ? if tab(bal(',)')+1) then {
while x := tab(bal(',)')) do {
if x[1] ~== "(" then st ||:= x || "_"
else st ||:= get_terms(x[2:-1]||",")
move(1)
}
}
return st
end
procedure showtree(L)
Lines := []; inter := []
every 1 to max do {
put(Lines,""); put(inter,"")
}
handlelist(L,1)
postproc()
show(L)
end
procedure handlelist(tree,n)
tree ? if move(1) then {
(cat := tab(upto(','))) | {write("empty list."); read(); fail}
if n<=3 then catlen := 4
if *cat<catlen then cat:=center(cat,catlen,"ⁿ") else catlen:=*cat
repeat {
move(1)
(x:=tab(bal(',)'))) | break
if (n>=(max-1)) & (x[1]=="(") then x:=get_terms(x[2:-1]||",")
if x[1]~=="(" then {
x:=trim(x,"_")
if *x<catlen then x:=center(x,catlen,"ⁿ")
if insitu=1 then xline:=n+2 else xline := max
if xline> max then xline:=max
if *Lines[max]>*Lines[n+1] then {
Lines[n+1]:=left(Lines[n+1], *Lines[max], ".")
inter[n+1]:=left(inter[n+1], *Lines[max], ".")
}
a := "." || center("│",*x,"ⁿ") || "."
Lines[n+1] ||:= a
inter[n+1] ||:= a
if insitu=0 then every i := n+2 to max-1 do {
Lines[i] := left(Lines[i], *Lines[n+1]- (*x+2)) || a
inter[i]:= left(inter[i], *Lines[n+1]- (*x+2),".") || a
} else {
every i := n+2 to max do {
Lines[i]:=left(Lines[i], *Lines[n+1],".")
inter[i]:=left(inter[i], *Lines[n+1],".")
}
}
Lines[xline] := left(Lines[xline], *Lines[n+1]- (*x+2)) || "." || x || "."
if insitu=0 then inter[xline] := left(".", *Lines[xline])
#show("item")
} else handlelist(x, n+1)
}
Lines[n+1] ? if move(*Lines[n]) then {
x:=tab(upto(~'.'))
Lines[n]||:= x; inter[n]||:=x
}
len:=*Lines[n]
x:= center("-", *trim(Lines[n+1],".")-len,"-")
Lines[n+1][len+1:0] ? while tab(a:=upto(~'.')) do {
if x[a]==("-") then {
tab(b:=many(~'.'))
b-:=1
mid :=a+integer((b-a)/2)
x[mid]:="!"
} else tab(b:=many(~'.'))
}
x:="." || x || "."
while a:=find(".-", x) do x[a+1]:="."
while a:=find("-.", x) do x[a]:="."
x:= x[2:-1]
inter[n]||:=x
(L:=find("!", x)) | (L:=10)
(R:=find("!.", x||".")) | (R:=10)
vor := left(".", L-1,".")
Insert := center(cat,R-L+1,".")
if (R-L)>=*cat then { # range of items
a:=upto(~'.',Insert)-1
mid := len + *vor + a+ integer((*cat+1)/2)
Lines[n] ||:= vor || Insert
Lines[n] := left(Lines[n], *inter[n],".")
if inter[n][mid]=="-" then inter[n][mid]:="t"
else inter[n][mid]:="+"
#show("RL-item")
} else { # single item
if integer(*cat/2*2)=*cat then cat:="."||cat
#show("embedded list")
if inter[n][-1]~=="." then {
Lines[n]:=left(Lines[n],*inter[n]-(integer(*cat/2)+1),".")
Lines[n] ||:= cat
} else {
a:=*trim(Lines[n+1],".")-len
Lines[n] ||:= center(cat, a,".")
#show("single item")
}
} # repeat
} #if
end
procedure postproc()
tabs := set([])
rep1:=[".!.",".!", "-!.", "-!-", "t!", "!t",".+."]
rep2:=[".i.",".L", "-R.", "-T-", "tT", "Tt",".!."]
every i:= 2 to max do {
if calctabs=1 then
inter[i-1] ? while tab(upto('i!LRTt+')) do {
insert(tabs, &pos+toffset-1)
move(1)
}
inter[i-1] := replace(inter[i-1]||".",rep1,rep2)
inter[i-1] := map(inter[i-1],"i!LRTt+-.","││┌┐┬┴┼─ ")
}
if calctabs=1 then {
tabs := sort(tabs)
writes(out,"Branches in columns: ")
every writes(out,!tabs, " ")
write(out,"\nTabstops from Margin offset: ", toffset,
"; by Increments: ", tincr)
write(out,"Set center Tabs at: ")
every i := 1 to *tabs do {
#writes(out, left((tabs[i]-1)*4.32 + 74.5, 5)," ")
writes(out, left((tabs[i]-1)*tincr + leftm + tadj, 5)," ")
}
write(out)
}
end #postproc
procedure replace(subject, rep1, rep2)
every i:= 1 to *rep1 do
{ search := rep1[i]
repeat
{ subject ? if pre:=tab(find(search)) then
{ =(search)
subject := pre || rep2[i] || tab(0)
}
else break
}
}
return subject
end
procedure show(L)
write()
preindent := repl(" ",toffset-1)
every i:=1 to max do {
if Lines[i]=="" then break
st:= preindent||trim(map(Lines[i],".ⁿ·√"," .,"))
write(st, out, st)
if i=max then break
st:=preindent||trim(map(inter[i],"ⁿ."," "))
if calctabs=1 then {
st1 := " "
every j := 1 to *tabs do {
x := tabs[j]
if any(~' ─',st[x]) then {
st1 := left(st1,x-1)
#if st1[-1]==" " then st1||:= left((x-1)*4.32 + 74.5, 3)
#st1 ||:= left((x-1)*4.32 + 74.5, 3)
st1 ||:= left((x-1)*tincr + leftm + tadj, 3)
}
}
write(st1, out,st1)
}
write(st, out, st)
}
write("ENTER=continue q=quit ")
ch := getch()
if ch=="q" then stop()
end