#!/bin/sh # -*- tcl -*- \ exec tclsh "$0" ${1+"$@"} # Instrument C code file for stack measurements. foreach {in out} $argv break set if [open $in r] ##set of [open $out w] set state fun set lbrace "\{" set rbrace "\}" set retlast 0 while {![eof $if]} { gets $if line if {[eof $if]} { break } switch -exact $state { fun { if {[regexp "^(\[A-Za-z0-9_\]*)\\(" $line -> name]} { set fname $name set state body ## puts "Function $fname" } } body { if {[regexp ^$lbrace $line]} { set state code } elseif {[regexp ^$rbrace $line]} { puts "$fname no locals" set state fun } } code { if {[regexp ^$rbrace $line]} { puts "$fname no locals" set state fun } elseif {[string trim $line] == {}} { ##puts $of " TCL_STACK_MARK(\"$fname\");" set state ret } } ret { if {[regexp ^$rbrace $line]} { if {!$retlast} { ##puts $of " TCL_STACK_POP(\"$fname\");" } set state fun } elseif {[regexp "\[ \t\]*return" $line]} { ##puts $of " TCL_STACK_POP(\"$fname\");" set retlast 1 } elseif {[string trim $line] != {}} { set retlast 0 } } } ##puts $of $line } close $if ##close $of exit