All pastes #449440 Raw Edit

Miscellany

public ruby v1 · immutable
·published 2007-04-20 06:22 UTC
rendered paste body
raise "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}"