Guest User

Untitled

a guest
Sep 29th, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. var readline = require('readline'),
  2. fs = require('fs');
  3.  
  4. var LinkMap = function(filePath) {
  5. this.files = []
  6. this.filePath = filePath
  7. }
  8.  
  9. LinkMap.prototype = {
  10. start: function(cb) {
  11. var self = this
  12. var rl = readline.createInterface({
  13. input: fs.createReadStream(self.filePath),
  14. output: process.stdout,
  15. terminal: false
  16. });
  17. var currParser = "";
  18. rl.on('line', function(line) {
  19. if (line[0] == '#') {
  20. if (line.indexOf('Object files') > -1) {
  21. currParser = "_parseFiles";
  22. } else if (line.indexOf('Sections') > -1) {
  23. currParser = "_parseSection";
  24. } else if (line.indexOf('Symbols') > -1) {
  25. currParser = "_parseSymbols";
  26. }
  27. return;
  28. }
  29. if (self[currParser]) {
  30. self[currParser](line)
  31. }
  32. });
  33.  
  34. rl.on('close', function(line) {
  35. cb(self)
  36. });
  37. },
  38.  
  39. _parseFiles: function(line) {
  40. var arr =line.split(']')
  41. if (arr.length > 1) {
  42. var idx = Number(arr[0].replace('[',''));
  43. var file = arr[1].split('/').pop().trim()
  44. this.files[idx] = {
  45. name: file,
  46. size: 0
  47. }
  48. }
  49. },
  50.  
  51. _parseSection: function(line) {
  52. },
  53.  
  54. _parseSymbols: function(line) {
  55. var arr = line.split('\t')
  56. if (arr.length > 2) {
  57. var size = parseInt(arr[1], 16)
  58. var idx = Number(arr[2].split(']')[0].replace('[', ''))
  59. if (idx && this.files[idx]) {
  60. this.files[idx].size += size;
  61. }
  62. }
  63. },
  64.  
  65. _formatSize: function(size) {
  66. if (size > 1024 * 1024) return (size/(1024*1024)).toFixed(2) + "MB"
  67. if (size > 1024) return (size/1024).toFixed(2) + "KB"
  68. return size + "B"
  69. },
  70.  
  71. statLibs: function(h) {
  72. var libs = {}
  73. var files = this.files;
  74. var self = this;
  75. for (var i in files) {
  76. var file = files[i]
  77. var libName
  78. if (file.name.indexOf('.o)') > -1) {
  79. libName = file.name.split('(')[0]
  80. } else {
  81. libName = file.name
  82. }
  83. if (!libs[libName]) {
  84. libs[libName] = 0
  85. }
  86. libs[libName] += file.size
  87. }
  88. var i = 0, sortLibs = []
  89. for (var name in libs) {
  90. sortLibs[i++] = {
  91. name: name,
  92. size: libs[name]
  93. }
  94. }
  95. sortLibs.sort(function(a,b) {
  96. return a.size > b.size ? -1: 1
  97. })
  98. if (h) {
  99. sortLibs.map(function(o) {
  100. o.size = self._formatSize(o.size)
  101. })
  102. }
  103. return sortLibs
  104. },
  105.  
  106. statFiles: function(h) {
  107. var self = this
  108. self.files.sort(function(a,b) {
  109. return a.size > b.size ? -1: 1
  110. })
  111. if (h) {
  112. self.files.map(function(o) {
  113. o.size = self._formatSize(o.size)
  114. })
  115. }
  116. return this.files
  117. }
  118. }
  119.  
  120. if (!process.argv[2]) {
  121. console.log('usage: node linkmap.js filepath -hl')
  122. console.log('-h: format size')
  123. console.log('-l: stat libs')
  124. return
  125. }
  126. var isStatLib, isFomatSize
  127. var opts = process.argv[3];
  128. if (opts && opts[0] == '-') {
  129. if (opts.indexOf('h') > -1) isFomatSize = true
  130. if (opts.indexOf('l') > -1) isStatLib = true
  131. }
  132.  
  133. var linkmap = new LinkMap(process.argv[2])
  134. linkmap.start(function(){
  135. var ret = isStatLib ? linkmap.statLibs(isFomatSize)
  136. : linkmap.statFiles(isFomatSize)
  137. for (var i in ret) {
  138. console.log(ret[i].name + '\t' + ret[i].size)
  139. }
  140. })
Add Comment
Please, Sign In to add comment