1#!/usr/bin/ruby
2
3require 'find'
4require 'optparse'
5
6options = {}
7OptionParser.new do |opts|
8  opts.banner = "Usage: clean-header-guards [options]"
9
10  opts.on("--prefix [PREFIX]", "Append a header prefix to all guards") do |prefix|
11    options[:prefix] = prefix
12  end
13end.parse!
14
15IgnoredFilenamePatterns = [
16  # ignore headers which are known not to have guard
17  /WebCorePrefix/,
18  /ForwardingHeaders/,
19  %r|bindings/objc|,
20  /vcproj/, # anything inside a vcproj is in the windows wasteland
21
22  # we don't own any of these headers
23  %r|icu/unicode|,
24  %r|platform/graphics/cairo|,
25  %r|platform/image-decoders|,
26
27  /config.h/ # changing this one sounds scary
28].freeze
29
30IgnoreFileNamesPattern = Regexp.union(*IgnoredFilenamePatterns).freeze
31
32Find::find(".") do |filename|
33  next unless filename =~ /\.h$/
34  next if filename.match(IgnoreFileNamesPattern)
35
36  File.open(filename, "r+") do |file|
37    contents = file.read
38    match_results = contents.match(/#ifndef (\S+)\n#define \1/s)
39    if match_results
40      current_guard = match_results[1]
41      new_guard = File.basename(filename).sub('.', '_')
42      new_guard = options[:prefix] + '_' + new_guard  if options[:prefix]
43      contents.gsub!(/#{current_guard}\b/, new_guard)
44    else
45      puts "Ignoring #{filename}, failed to find existing header guards."
46    end
47    tmp_filename = filename + ".tmp"
48    File.open(tmp_filename, "w+") do |new_file|
49      new_file.write(contents)
50    end
51    File.rename tmp_filename, filename
52  end
53end
54