rendered paste bodyraise "you need to give target files!\n" unless ARGV.length >= 1 Bad = "\t\n \"<>"Reps = [[':','COLON'],['.','DOT'],['_','DOT'],['\\','SLASH'],['/','OTHERSLASH']]def scanfile(filename) incs = [] begin File.open(filename,"r").each_line {|l| next unless l.include?("#include") incs.push(l[/[\"<][^\"<>]*[\">]/].tr(Bad,'')) } rescue end return incsendclass IncGraph def initialize(files) @seen = {} @results = {} @results = scan(files) @clean_names = {} end def scan(files) ret_set = {} while files != [] file = files.pop ret_set[file] = [] unless ret_set.has_key?(file) scanfile(file).each {|inc| next if inc == "" ret_set[file].push(inc) if not @seen.has_key?(inc) then @seen[inc] = file files.push(inc) end } end return ret_set end def draw_node(key) if not @already_drawn.has_key?(key) then @already_drawn[key] = true print clean_name(key) + " [label=\""+key+"\",fillcolor=\"#f8c85c\"];\n" end end def draw() @already_drawn = {} print "digraph G {\n" print " ranksep=1.0;\n" print "node [stype=filled,fontname=Helvetica,fontsize=10];\n" @results.each_key {|key| draw_node(key) @results[key].each {|dep| draw_node(dep) print clean_name(key) + " -> " + clean_name(dep) +"\n" } } print "}\n" end def clean_name(key) return @clean_names[key] if @clean_names.has_key?(key) Reps.each {|rep| key = key.gsub(rep[0],rep[1]) } key endendprint "#{IncGraph.new(ARGV).draw}"}"