ruby生成C++头文件引用关系图
首先生成graphviz的dot格式文件
require 'find'
class RefNode
attr_accessor :name,:reference
end
include Find
if __FILE__ == $0
name = "name"
dot = []
h = Hash.new
puts ["digraph #{name}{","overlap = false","spline = true","ranksep=1.5"].join("\n")
Find.find('XX/dir1','XX/dir2') do |path|
path = path.downcase
if (path.end_with?(".h") && !path.end_with?("stdafx.h"))
headers = []
File.readlines(path).each do |line|
line = line
begin
m = /^\s*#include\s+"(.*?)"\s*/.match(line)
rescue
begin
m = /^\s*#include\s+"(.*?)"\s*/u.match(line)
rescue
end
end
if (m)
headers<<File.basename(m[1]).downcase
end
end
headers.each do |header|
if h.key?(header)
h[header]<<File.basename(path);
else
h[header] = []
end
end
end
end
h.keys.each do |key|
if (h[key].size > 3)
src = key
#sprintf("%d %s",h[key].size,key)
color = sprintf("%.4f,%.4f,%.4f",1 - h[key].size/150.0,1 - h[key].size/150.0,1 - h[key].size/150.0)
dot << sprintf("\nnode[color=\"%s\"]\nedge[color=\"%s\"]\n\"%s\"",color,color,src)
h[key].each do |header|
dot << sprintf("\t\"%s\"->\"%s\"",header,src)
end
end
end
puts dot.join("\n")
puts "}\n"
end
生成格式大概是这样的
node[color="0.9733,0.9733,0.9733"]
edge[color="0.9733,0.9733,0.9733"]
"tagnode.h"
"tagdocument.h"->"tagnode.h"
"tagelement.h"->"tagnode.h"
"tagnodecollection.h"->"tagnode.h"
然后调用graphviz 的命令行 fdp -Tpng XX.dot -o XX.png这样调用关系就生成了