# This is the implementation of gc_filter for Rhapsody generated C++ code # The following markers are recognized: # //#[ --> opens a block of user code # //#] --> closes a block of user code # some code //## --> user code on current line # //## --> user code on next line namespace eval gc_filter { variable next_state 0 proc change_gc_state {line} { variable marker_level variable next_state incr next_state -1 if {[regexp -- {(?://|/\*)\s*#\[\s*([^\s]+)} $line dummy marker]} { variable marker_found 1 switch -- $marker { default { incr marker_level if {$marker_level == 1} { return 1 } } } } elseif {[regexp -- {(?://|/\*)\s*#\]\s*([^\s]*)} $line dummy marker]} { variable marker_found 1 switch -- $marker { default { if {$marker_level} { incr marker_level -1 if {!$marker_level} { return 1 } } } } } elseif {[regexp -- {^\s*(?://|/\*)\s*##\s*([^\s]*)} $line dummy marker]} { variable marker_found 1 switch -- $marker { auto_generated { # code in auto_generated is not user code # add more marker to ignore if neeed } default { variable next_state 2 return 1 } } } elseif {[regexp -- {(?://|/\*)\s*##\s*([^\s]*)} $line dummy marker]} { variable marker_found 1 switch -- $marker { auto_generated { # code in auto_generated is not user code # add more marker to ignore if neeed } default { variable next_state 1 return 1 } } } elseif {[regexp -- {//\!\s*Generated\s*Date\s*\:} $line]} { # When this pattern is found, we guess it is a generated file variable marker_found 1 } if {$next_state == 0 && !$marker_level} { return 1 } return 0 } }