On Tue, 10 Jul 2001, Yukihiro Matsumoto wrote:

> Hi,
> 
> In message "[ruby-talk:17598] Re: low-level TCP/IP manipulations?"
>     on 01/07/10, Wai-Sun Chia <waisun.chia / msa.dec.com> writes:
> 
> |> I should have put "default: break" explicitly though.
> |
> |You're absolutely, right.
> |
> |But you can't blame me as I'm used to seeing "default:" in switch 
> |statements..(to pass code review all switches MUST have defaults) ;-)
> 
> Yes, alright.  I admit it's my bad habit. ;-)

To help you out, here's a script that finds switches without
"default:" block for you. When you run it, you'll see that your bad habit
has been very bad (60 non-defaulted switches), but will be cured in no
time once you see where they are :).

Please, run it like

         ruby -n find_switches.rb *.c

An example output for ruby 1.6.4 sources is appended after the source
code.


    - Aleksi

Ps. Don't mind getting errors from lex.c and parse.c, since those bad
codes aren't your mistakes :).





switches = [] unless switches
line_no  = 0  unless line_no
Switch   = nil unless Switch
  
BEGIN {
  # let's initialize a stack of switches and line number counter 
  # for the current file
  switches = []
  line_no  = 0
  
  Switch = Struct.new("Switch", :switch_line, :indentation,
		      :found_default_line)
}

line_no += 1

# remember everytime we find a switch
$_.grep(/(\s*?)switch\s*\(/) do |m|
  switches.push Switch.new(line_no, $1, nil)
end

# add line number if found 'default:',
# and output error if found without beginning switch
$_.grep(/default\s*:/) do |m|
  if switches.size > 0
    switches.last.found_default_line = line_no
  else
    puts "\nFound default without appropriate switch on " + 
         "file #{$<.to_s} at row #{line_no}\n\n"
  end
end

# try to find switch closing '}'
# and output error if no 'default:' was found in switch
if switches.size > 0
  closing_brace = Regexp.escape(switches.last.indentation+"}")
  $_.grep(Regexp.new("^"+closing_brace)) do |m|
    if switches.last.found_default_line
      # all is right, so let's be quiet
      # puts "Found default for switch on file #{$<.to_s} "+
      #      "at row #{switches.last.switch_line} on row "+
      #      "#{switches.last.found_default_line}"
    else
      puts "Missing 'default:' for switch on file #{$<.to_s} " +
	   "at row #{switches.last.switch_line}, closing " +
	   "#{line_no}."
    end
    switches.pop
  end
end


# lastly check if any switchs are still open
# when we change a file
filename = $<.to_s unless filename

if filename != $<.to_s
  if switches.size > 0
    puts "\nThe file #{filename} changes but these " +
         "switches are still open"
    switches.each do |switch|
      puts "switch on line #{switch.switch_line} with " +
           "indentation #{switch.indentation.inspect}"
    end
    puts
  end

  # reset tracking
  switches = []
  line_no = 1
  filename = $<.to_s
end














Missing 'default:' for switch on file array.c at row 1198, closing 1216.
Missing 'default:' for switch on file dir.c at row 508, closing 524.
Missing 'default:' for switch on file dln.c at row 493, closing 503.
Missing 'default:' for switch on file dln.c at row 538, closing 554.
Missing 'default:' for switch on file dln.c at row 556, closing 572.
Missing 'default:' for switch on file dln.c at row 714, closing 744.
Missing 'default:' for switch on file dln.c at row 782, closing 792.
Missing 'default:' for switch on file dln.c at row 803, closing 816.
Missing 'default:' for switch on file dln.c at row 818, closing 829.
Missing 'default:' for switch on file eval.c at row 1486, closing 1492.
Missing 'default:' for switch on file eval.c at row 1525, closing 1530.
Missing 'default:' for switch on file eval.c at row 3655, closing 3660.
Missing 'default:' for switch on file eval.c at row 6198, closing 6208.
Missing 'default:' for switch on file eval.c at row 7157, closing 7187.
Missing 'default:' for switch on file eval.c at row 7190, closing 7203.
Missing 'default:' for switch on file file.c at row 1563, closing 1570.
Missing 'default:' for switch on file file.c at row 1620, closing 1687.
Missing 'default:' for switch on file file.c at row 1698, closing 1705.
Missing 'default:' for switch on file file.c at row 1715, closing 2079.
Missing 'default:' for switch on file gc.c at row 441, closing 580.
Missing 'default:' for switch on file gc.c at row 764, closing 771.
Missing 'default:' for switch on file gc.c at row 852, closing 863.
Missing 'default:' for switch on file io.c at row 1277, closing 1287.
Missing 'default:' for switch on file io.c at row 1305, closing 1316.
Missing 'default:' for switch on file io.c at row 2951, closing 3003.

The file lex.c changes but these switches are still open
switch on line 51 with indentation "  "

Missing 'default:' for switch on file pack.c at row 399, closing 542.

Found default without appropriate switch on file parse.c at row 2865

Missing 'default:' for switch on file parse.c at row 6011, closing 6037.
Missing 'default:' for switch on file parse.c at row 6056, closing 6067.
Missing 'default:' for switch on file parse.c at row 7018, closing 7024.
Missing 'default:' for switch on file parse.c at row 6985, closing 7120.
Missing 'default:' for switch on file parse.c at row 7293, closing 7302.
Missing 'default:' for switch on file parse.c at row 7304, closing 7313.
Missing 'default:' for switch on file parse.c at row 7455, closing 7462.
Missing 'default:' for switch on file parse.c at row 7579, closing 7604.
Missing 'default:' for switch on file parse.c at row 7573, closing 7652.

The file parse.c changes but these switches are still open
switch on line 2893 with indentation "  "

Missing 'default:' for switch on file re.c at row 146, closing 159.
Missing 'default:' for switch on file re.c at row 166, closing 179.
Missing 'default:' for switch on file re.c at row 302, closing 315.
Missing 'default:' for switch on file re.c at row 1084, closing 1093.
Missing 'default:' for switch on file regex.c at row 1093, closing 1117.
Missing 'default:' for switch on file regex.c at row 2913, closing 2928.
Missing 'default:' for switch on file regex.c at row 2935, closing 2950.
Missing 'default:' for switch on file regex.c at row 2767, closing 3093.
Missing 'default:' for switch on file regex.c at row 2765, closing 3105.
Missing 'default:' for switch on file regex.c at row 3699, closing 4345.
Missing 'default:' for switch on file regex.c at row 3697, closing 4372.
Missing 'default:' for switch on file regex.c at row 4499, closing 4516.
Missing 'default:' for switch on file signal.c at row 315, closing 336.
Missing 'default:' for switch on file signal.c at row 501, closing 520.
Missing 'default:' for switch on file signal.c at row 531, closing 565.
Missing 'default:' for switch on file sprintf.c at row 39, closing 64.
Missing 'default:' for switch on file sprintf.c at row 65, closing 73.
Missing 'default:' for switch on file sprintf.c at row 77, closing 95.
Missing 'default:' for switch on file sprintf.c at row 96, closing 100.
Missing 'default:' for switch on file sprintf.c at row 453, closing 459.
Missing 'default:' for switch on file sprintf.c at row 499, closing 504.
Missing 'default:' for switch on file sprintf.c at row 569, closing 578.
Missing 'default:' for switch on file st.c at row 490, closing 507.
Missing 'default:' for switch on file string.c at row 2619, closing 2628.
Missing 'default:' for switch on file time.c at row 459, closing 477.