home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
mprogs
/
mmm.icn
< prev
next >
Wrap
Text File
|
2000-07-29
|
4KB
|
140 lines
############################################################################
#
# File: mmm.icn
#
# Subject: Program to show allocation as a miniature "MemMon"
#
# Author: Clinton Jeffery
#
# Date: August 12, 1994
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# Displays a tiny rendition of internal heap allocation.
#
############################################################################
#
# Requires: Version 9 graphics
#
############################################################################
#
# Links: evinit, options, optwindw, typebind, colormap, wipe, xcompat
#
############################################################################
#
# Includes: evdefs.icn
#
############################################################################
$include "evdefs.icn"
link evinit
link options
link optwindw
link typebind
link colormap
link wipe
link xcompat
global Visualization, contexts
global t, sum, threesixty, wid, hei
procedure main(av)
local c_string, lines, mymask, allocstr, blockall, sum1, sum2, row1, row2,
Regions, c, start, sum2div4, verbose
if *av>0 then
EvInit(av) | stop("EvInit() can't load ",av[1])
else
EvInit() | stop("can't EvInit()")
threesixty := 360 * 64
t := options(av)
/t["W"] := 650
/t["H"] := 50
&window := optwindow(t) | stop("no window")
Visualization := &window
contexts := itypebind(&window)
c_string := contexts[E_String] | stop("eh?")
/ contexts[E_Tvsubs] := c_string
wid := WAttrib("width")
hei := WAttrib("height")
lines := WAttrib("lines")
mymask := AllocMask ++ cset("\360"||E_Collect||E_BlkDeAlc||E_StrDeAlc)
allocstr := string(AllocMask)
blockall := 0
sum1 := 0
sum2 := 0
row1 := 0
row2 := hei/2+1
Regions := []
every put(Regions,keyword("regions",EventSource))
pop(Regions)
while EvGet(mymask) do {
if &eventcode === E_Lelem then &eventcode := E_List
if &eventcode === (E_Telem|E_Tvtbl|E_Slots) then &eventcode := E_Table
if &eventcode === E_Selem then &eventcode := E_Set
if &eventcode === E_Refresh then &eventcode := E_Coexpr
case &eventcode of {
E_Collect: {
wipe(&window)
sum1 := sum2 := 0
row1 := 0
row2 := hei/2+1
}
E_EndCollect: {
}
E_String: {
DrawLine(c_string,sum1/4,row1,(sum1+&eventvalue)/4,row1)
sum1 +:= &eventvalue
while sum1/4 >= wid do {
sum1 -:= wid * 4
row1 +:= 1
if row1 > hei/2 then {
EraseArea(0,0,wid,hei/2)
row1 := 0
}
DrawLine(c_string,0,row1,sum1/4,row1)
}
}
!.allocstr: {
c := \contexts[&eventcode] | stop("what is ",&eventcode)
start := sum2/4
sum2 +:= &eventvalue
sum2div4 := sum2/4
DrawLine(c,start,row2,sum2div4,row2)
while sum2div4 >= wid do {
sum2 -:= wid * 4
sum2div4 := sum2/4
row2 +:= 1
DrawLine(c,0,row2,sum2div4,row2)
}
}
default: {
if \verbose then write("unknown event code ",&eventcode)
}
}
}
end
procedure itypebind(z)
static t
initial {
t := table()
}
/(t[z]):=typebind(z,E_Integer||E_Real||E_Record||E_Set||E_String||E_Cset||
E_File||E_List||E_Null||E_Proc||E_Table,table())
# if type(t[z][E_Proc])=="file" then close(t[z][E_Proc])
t[z][E_Proc] := XBind(z,"fg=#999")
return t[z]
end