Class: LinkMap::Anylize

Inherits:
Object
  • Object
show all
Defined in:
lib/linkmap.rb

Instance Method Summary collapse

Constructor Details

#initializeAnylize

Returns a new instance of Anylize.



28
29
30
31
32
33
34
35
# File 'lib/linkmap.rb', line 28

def initialize()
    @reachFiles = false
    @reachSymbols = false
    @reachSections = false
    
    @fileMap = Hash.new
    @moduleMap = Hash.new
end

Instance Method Details

#getFileSize(size) ⇒ Object



164
165
166
167
168
169
170
# File 'lib/linkmap.rb', line 164

def getFileSize(size)
    if size < 1024*1024
        "#{size/1024.0}K"
    else
        "#{size/(1024.0*1024.0)}M"
    end
end

#run(argv) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/linkmap.rb', line 37

def run(argv)
    filename = argv[1]
    if File::file?(filename)
        File.open(filename, "r") do |file|
            while line = file.gets
                if line.include?("#")   #注释行
                    if line.include?("# Object files:")
                        reachFiles = true
                    elsif line.include?("# Sections:")
                        reachSections = true
                    elsif line.include?("# Symbols:")
                        reachSymbols = true
                    end
                else
                    if reachFiles and !reachSections and !reachSymbols
                        index = line.index("]")
                        if  index != nil
                            linkFile = LinkFile.new()
                            key = line[0, index+1]
                            name = line[index+1, line.length-index-1-1]
                            linkFile.name = name
                            @fileMap.store(key, linkFile)
                        end
                    elsif reachFiles and reachSections and !reachSymbols
#                                puts "read sections"
                    else
#                               puts "read symbols"
                        array = line.force_encoding("ISO-8859-1").split("\t")
                        if array.size == 3
                            keyAndName = array[2]
                            size = array[1].to_i(16)
                            index = keyAndName.index("]")
                            if index != nil
                                key = keyAndName[0, index+1]
                                linkFile = @fileMap.fetch(key)
                                if linkFile != nil
                                    linkFile.size = linkFile.size.to_i+size.to_i
                                end
                            end
                        end
                    end
                end
            end
        end
        
        fileArray = @fileMap.values
        fileArray.each do |linkFile|
            array = linkFile.name.split("/")
            line = array[array.size-1]
            if index=line.index("(") != nil
                index = line.index("(")
                moduleName = line[0, index]
            elsif index=line.index("tbd") != nil
                moduleName = "system"
            else
                moduleName = "other"
            end
#                    puts moduleName
            if !@moduleMap.has_key?(moduleName)
                fileModule = FileModule.new()
                fileModule.name = moduleName
                @moduleMap.store(moduleName, fileModule)
            else
                fileModule = @moduleMap.fetch(moduleName)
            end
            fileModule.size = fileModule.size.to_i+linkFile.size.to_i
            fileModule.moduleFiles.push(linkFile)
        end

        #创建输出文件
        array = filename.split("/")
        destFileName = array[array.size-1]
        destFileName = "analize_#{destFileName}"
        array.delete_at(array.size-1)
        array.push(destFileName)
        destFileName = array.join("/")
        if File::file?(destFileName)
            File::delete(destFileName)
        end
        destFile = File.new(destFileName, "w");
        
        #输出modules
        moduleArray = @moduleMap.values
        moduleArray = moduleArray.sort{|x,y| y.size <=> x.size}
        moduleArray.delete(@moduleMap.fetch("system"))
        moduleArray.insert(0, @moduleMap.fetch("system"))
        moduleArray.delete(@moduleMap.fetch("other"))
        moduleArray.push(@moduleMap.fetch("other"))
        
        totalSize = 0
        moduleArray.each do |fileModule|
            totalSize += fileModule.size
        end
        destFile.puts "总体积: #{getFileSize totalSize}"
    
        moduleArray.each do |fileModule|
            line = fileModule.name
            line += "\t"
            line += getFileSize fileModule.size
            destFile.puts line
        end
        destFile.puts "\n"
        
        #输出各个module
        moduleArray.each do |fileModule|
            fileArray = fileModule.moduleFiles.sort{|x,y| y.size <=> x.size}
            line = "====    #{fileModule.name}    ==="
            destFile.puts line
            fileArray.each do |linkFile|
                array = linkFile.name.split("/")
                line = array[array.size-1]
                line += "\t"
                line += "#{getFileSize linkFile.size}"
                destFile.puts line
                totalSize += linkFile.size
            end
            destFile.puts ""
        end
        destFile.close
        
        puts("success!")
        puts("result saved in:#{destFileName}")
    else
        puts "\t#{argv[1]} is not a file name"
    end
end