codegraph 0.7.2 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. data/gemspec +2 -2
  2. data/lib/codegraph.rb +55 -62
  3. metadata +3 -3
data/gemspec CHANGED
@@ -2,8 +2,8 @@ require 'rubygems'
2
2
 
3
3
  spec = Gem::Specification.new do |s|
4
4
  s.name = "codegraph"
5
- s.version = "0.7.2"
6
- s.date = "2010-11-01"
5
+ s.version = "0.7.3"
6
+ s.date = "2010-11-05"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.bindir = 'bin'
9
9
  s.files = ["lib/codegraph.rb","bin/codegraph"] + ["gemspec","LICENSE"]
@@ -1,8 +1,10 @@
1
1
  require 'rubygems'
2
+ require 'pp'
2
3
  require 'rgl/adjacency'
3
4
  require 'rgl/dot'
4
5
  require 'rgl/rdot'
5
6
  require 'rgl/traversal'
7
+ require 'thread'
6
8
 
7
9
  class FunctionGraph < RGL::DirectedAdjacencyGraph
8
10
  attr_accessor :funx, :internal
@@ -46,7 +48,7 @@ class FunctionGraph < RGL::DirectedAdjacencyGraph
46
48
  super
47
49
  # the following attribute will hold the functionnames and their bodies
48
50
  @funx = Hash.new
49
-
51
+ @lock = Mutex.new
50
52
  # Should the internal functions be displayed?
51
53
  @internal = false
52
54
 
@@ -57,86 +59,77 @@ class FunctionGraph < RGL::DirectedAdjacencyGraph
57
59
  # 2. One for functions inside the file 1
58
60
  # and fill the @funx hash
59
61
  def genFiles(graph, filelist, exclude=[])
60
- names, kinds, lines, files = [],[],[],[]
62
+ threads = []
61
63
 
62
- funxFile = "funxnames"
63
- ctagsKinds='--c-kinds=f --fortran-kinds=fs --php-kinds=f --perl-kinds=f'
64
64
  filelist.each {|file|
65
- puts "Processing #{file} ..."
66
- basefile = File.basename(file)
67
- temfile = "_" + basefile
68
- case File.extname(file)
69
- when '.c','.h'
70
- cppCommand = "cpp -w -fpreprocessed -E -fdirectives-only #{file} -o #{@@codehomedir}/#{temfile} 2>/dev/null"
71
- cppCommand = "cpp -fpreprocessed #{file} -o #{@@codehomedir}/#{temfile} 2>/dev/null"
72
- grep = "grep -v -e '^$' #{temfile} | grep -v -e '^#' > #{basefile}"
73
- when '.f','.f77','.f90','.f95'
74
- cppCommand = "cp #{file} #{@@codehomedir}/#{temfile}"
75
- grep = "grep -v -e '^$' #{temfile} | grep -v -e '^ *!' > #{basefile}"
76
- else
77
- cppCommand = "cp #{file} #{@@codehomedir}/#{temfile}"
78
- grep = "grep -v -e '^$' #{temfile} | grep -v -e '^#' > #{basefile}"
79
- end
80
- cd = "cd #{@@codehomedir}"
81
- gen4ctags = "ctags -x #{ctagsKinds} #{basefile} | sort -n -k 3 > " + funxFile
82
- command = [cppCommand,cd,grep,gen4ctags].join(";")
83
-
84
- puts command if false
85
- system(command)
86
-
87
- open(@@codehomedir+'/'+funxFile).readlines.each {|line|
88
- name, kind, lineno, file = line.split[0,4]
89
- names << name
90
- kinds << kind
91
- lines << lineno.to_i
92
- files << file
65
+ threads << Thread.new(file, @@codehomedir) {|file,codehomedir|
66
+ funxFile = "funxnames"
67
+ ctagsKinds = '--c-kinds=f --fortran-kinds=fs --php-kinds=f --perl-kinds=f'
68
+
69
+ puts "Processing #{file} ..." if false
70
+ basefile = File.basename(file)
71
+ temfile = "_" + basefile
72
+ case File.extname(file)
73
+ when '.c','.h'
74
+ cppCommand = "cpp -w -fpreprocessed -E -fdirectives-only #{file} -o #{codehomedir}/#{temfile} 2>/dev/null"
75
+ cppCommand = "cpp -fpreprocessed #{file} -o #{codehomedir}/#{temfile} 2>/dev/null"
76
+ grep = "grep -v -e '^$' #{codehomedir}/#{temfile} | grep -v -e '^#' > #{codehomedir}/#{basefile}"
77
+ when '.f','.f77','.f90','.f95'
78
+ cppCommand = "cp #{file} #{codehomedir}/#{temfile}"
79
+ grep = "grep -v -e '^$' #{codehomedir}/#{temfile} | grep -v -e '^ *!' > #{codehomedir}/#{basefile}"
80
+ else
81
+ cppCommand = "cp #{file} #{codehomedir}/#{temfile}"
82
+ grep = "grep -v -e '^$' #{codehomedir}/#{temfile} | grep -v -e '^#' > #{codehomedir}/#{basefile}"
83
+ end
84
+ gen4ctags = "ctags -x #{ctagsKinds} #{codehomedir}/#{basefile} | sort -n -k 3"
85
+ command = [cppCommand,grep].join(";")
86
+
87
+ puts command if false
88
+ system(command)
89
+
90
+ code = open(codehomedir+'/'+ File.basename(file)).readlines
91
+ funxLocations = IO.popen(gen4ctags).readlines.map {|l| l.split[0,4]}
92
+ funxLocations.each_with_index {|ary,i|
93
+ name, kind, line, file = ary
94
+ puts name if false
95
+ line = line.to_i
96
+ startLineIndex = line - 1
97
+ endLineIndex = (i+1 < funxLocations.size) ? funxLocations[i+1][2].to_i - 2 : -1
98
+ body = code[startLineIndex..endLineIndex].join
99
+ @lock.synchronize {
100
+ @funx.store(name,body)
101
+ }
102
+ }
93
103
  }
94
104
  }
105
+ threads.each {|t| t.join}
95
106
 
96
- unless File.size?(@@codehomedir+'/'+funxFile)
107
+ if @funx.empty?
97
108
  puts "no functions found"
98
109
  exit
99
110
  end
100
-
101
- meta = [names, kinds, lines, files]
102
-
103
- # read the source once and save the function bodies as values
104
- # of the function names
105
-
106
- metasize = meta[2].size
107
- lastfile,code = nil,nil
108
- meta.transpose.each_with_index {|ary,i|
109
- name, kind, line, file = ary
110
-
111
- if file != lastfile
112
- code = open(@@codehomedir+'/'+ File.basename(file)).readlines
113
- codeLength = code.length
114
- end
115
- startLineIndex = meta[2][i]-1
116
- endLineIndex = (i+1 < metasize) ? meta[2][i+1] - 2 : -1
117
- # code-Index starts with 0 vs. line numbbers in (meta|m).lines start with 1
118
- body = code[startLineIndex..endLineIndex].join
119
-
120
- @funx.store(name,body)
121
- lastfile = file
122
- }
123
111
  end
124
112
 
125
113
  # fill the graph with all functions found in <filelist>
126
114
  # while all functions from <exclude> aren't recognized
127
115
  def fill(filelist,exclude=[])
116
+ threads = []
128
117
  # generate the necessary files and fill @funx
129
118
  genFiles(self,filelist,exclude)
130
119
 
131
120
  # scan functions for the function names
132
121
  names = @funx.keys
133
122
  @funx.each_pair {|name,body|
134
- puts "Add func: #{name}" if true
135
- add_vertex(name)
136
- (names - [name] + @@internal_funx).each { |func|
137
- add_edge("#{name}","#{func}") if/#@@matchBeforFuncName#{func}#@@matchAfterFuncName/.match(gbody)
138
- }
139
- }
123
+ # threads << Threads.new(name,body,names) {|name,body|
124
+ puts "Add func: #{name}" if false
125
+ add_vertex(name)
126
+ (names - [name] + @@internal_funx).each { |func|
127
+ puts body if false
128
+ add_edge("#{name}","#{func}") if/#@@matchBeforFuncName#{func}#@@matchAfterFuncName/.match(body)
129
+ }
130
+ }
131
+ # }
132
+ # threads.each {|t| t.join}
140
133
  end
141
134
 
142
135
  def limit(depth)
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 7
8
- - 2
9
- version: 0.7.2
8
+ - 3
9
+ version: 0.7.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ralf Mueller
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-01 00:00:00 +01:00
17
+ date: 2010-11-05 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency