diff options
Diffstat (limited to 'ipl/mprogs/allocwrl.icn')
-rw-r--r-- | ipl/mprogs/allocwrl.icn | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/ipl/mprogs/allocwrl.icn b/ipl/mprogs/allocwrl.icn new file mode 100644 index 0000000..8521a8f --- /dev/null +++ b/ipl/mprogs/allocwrl.icn @@ -0,0 +1,167 @@ +############################################################################ +# +# File: allocwrl.icn +# +# Subject: Program to display storage allocation in VRML +# +# Author: Ralph E. Griswold +# +# Date: March 26, 2002 +# +############################################################################ +# +# This file is in the public domain. +# +############################################################################ +# +# This program produces VRML 1.0 worlds with shapes representing storage +# allocation in the program it monitors. +# +# The structures normally are laid out in the x-z plane along a path with +# the shapes rising in the y direction. The size of the allocation +# determines the size of the shapes. The same shape is used for all +# allocations, but the color indicates the type of allocation. +# +# The kinds of allocation modeled are given by masks: +# +# structs only allocation related to Icon's structure types +# blocks all allocations in the block region +# non-structs all allocations except for structures +# +# The supported shapes are: +# +# cylinder +# cuboid +# cone +# +# In this version, if the path file is exhausted before the SP terminates, +# the path file is closed and reopened. +# +############################################################################ +# +# Requires: MT Icon +# +############################################################################ +# +# Links: colormap, dialog, emutils, evinit, interact, options, vrml, +# vrml1lib +# +############################################################################ + +link colormap +link dialog +link emutils +link evinit +link interact +link vrml +link vrml1lib + +$include "evdefs.icn" + +procedure main(args) + local model, color_table, code, object_list, trans, mask, object + local path, input, scale, steps, symbol, hfactor, color, shape + local ashape, output + + if TextDialog("Configuration:", + ["SP", "path file", "coordinate scale", "shape scale", + "number of events", "mask", "shape", "world file"], + ["structalc", "line.path", 10.0, 0.2, + 200, "structs", "cylinder", "alloc.wrl"], + [15, 30, 5, 5, 5, 10, 10, 20] + ) == "Cancel" then exit() + + args := [dialog_value[1]] + path := dialog_value[2] + scale := dialog_value[3] + hfactor := dialog_value[4] + steps := dialog_value[5] + mask := case dialog_value[6] of { + "structs" | &null: cset(E_List || E_Lelem || E_Record || E_Selem || + E_Set || E_Slots || E_Table || E_Telem || E_Tvtbl) + "blocks": AllocMask -- (E_String || E_Coexpr) + "strings": cset(E_String) + default: ExitNotice("Invalid mask.") + } + ashape := case dialog_value[7] of { + "cylinder" | &null: Cylinder(2, 2) + "cuboid": Cube(4, 2, 4) + "cone": Cone(2, 2) + default: ExitNotice("Invalid shape.") + } + output := open(dialog_value[8], "w") | + ExitNotice("Cannot open " || dialog_value[8]) + + EvInit(args) | ExitNotice("Cannot load SP.") + + variable("write", &eventsource) := -1 # turn off output in SP + variable("writes", &eventsource) := -1 + + model := [] # list of children + + color_table := colormap() # standard colors + + every code := key(color_table) do { # convert colors to shapes + color := vrml_color(color_table[code]) # standard color + symbol := evsym(code) # use event code name + shape := Separator([ + Material(color), # diffuse color only + Translation("0 1 0"), + ashape, + Translation("0 -1 0") + ]) + + color_table[code] := USE(symbol) # put USE node in table + put(model, DEF(symbol, shape)) # create DEF node + } + + model := [Switch(-1, model)] + + input := open(path) | ExitNotice("Cannot open path file.") + + trans := "0 0 0" # initial "translation" + + every 1 to steps do { + EvGet(mask) | { # get allocation event + write(&errout, "*** event stream terminated") + break + } + object := \color_table[&eventcode] | { # get shape + write(&errout, "*** no entry for ", evsym(&eventcode)) + next + } + trans := Translation(scale_translate(read(input), scale)) | { + Notice("Path ended.") + break + } + put( + model, + Separator([ + trans, + Transform(, , "1.0 " || (&eventvalue * hfactor) || " 1.0"), + object + ]) + ) + } + + vrml1(Group(model), output) # generate world + +end + +procedure scale_translate(s, n) + local x, y, z + + s ? { + x := tab(find(" ")) + move(1) + y := tab(find(" ")) + move(1) + z := tab(0) + } + + return (x * n) || " " || (y * n) || " " || (z * n) + +end + + + |