mirror of https://github.com/zeldaret/mm.git
Add progress script
This commit is contained in:
parent
f022cace71
commit
8f66e8c6a9
|
|
@ -0,0 +1,91 @@
|
|||
#!/usr/bin/env python3
|
||||
import os, struct, sys, ast, argparse
|
||||
|
||||
def read_all_lines(file_name):
|
||||
lines = list()
|
||||
try:
|
||||
with open(file_name) as f:
|
||||
lines = f.readlines()
|
||||
except IOError:
|
||||
print('failed to read file ' + file_name)
|
||||
sys.exit(1)
|
||||
|
||||
return lines
|
||||
|
||||
if __name__ == "__main__":
|
||||
map_lines = read_all_lines('build/mm.map')
|
||||
|
||||
current_section = ''
|
||||
in_section_list = False
|
||||
asm_amounts = dict()
|
||||
src_amounts = dict()
|
||||
src_files = dict()
|
||||
for line in map_lines:
|
||||
if in_section_list:
|
||||
if line.startswith('OUTPUT(build/code.elf elf32-tradbigmips)'):
|
||||
break
|
||||
|
||||
line_split = list(filter(None, line.split()))
|
||||
|
||||
if (len(line_split) > 0 and not line.startswith(' ')):
|
||||
current_section = line_split[0]
|
||||
src_amounts[current_section] = 0
|
||||
asm_amounts[current_section] = 0
|
||||
src_files[current_section] = []
|
||||
|
||||
if (len(line_split) == 4 and line_split[0].startswith(".")):
|
||||
section = line_split[0]
|
||||
size = int(line_split[2], 16)
|
||||
obj_file = line_split[3]
|
||||
|
||||
if (section == ".text" and not current_section + '_data' in obj_file and not current_section + '_todata' in obj_file):
|
||||
if (obj_file.startswith("build/src")):
|
||||
src_amounts[current_section] += size
|
||||
formatted_name = obj_file[len('build/'):] # remove build/ prefix
|
||||
formatted_name = formatted_name[:-1] + 'c' # replace .o preface with .c
|
||||
src_files[current_section].append(formatted_name)
|
||||
elif (obj_file.startswith("build/asm")):
|
||||
asm_amounts[current_section] += size
|
||||
else:
|
||||
in_section_list = line.startswith('Linker script and memory map')
|
||||
|
||||
for section in src_files:
|
||||
for file in src_files[section]:
|
||||
file_lines = read_all_lines(file)
|
||||
for line in file_lines:
|
||||
if line.startswith('GLOBAL_ASM'):
|
||||
line_split = list(filter(None, line.split('\"')))
|
||||
asm_lines = read_all_lines(line_split[1])
|
||||
for asm_line in asm_lines:
|
||||
if asm_line.startswith('/*'):
|
||||
asm_amounts[section] += 4
|
||||
src_amounts[section] -= 4
|
||||
|
||||
src = 0
|
||||
asm = 0
|
||||
for section in src_amounts:
|
||||
src += src_amounts[section]
|
||||
for section in asm_amounts:
|
||||
asm += asm_amounts[section]
|
||||
|
||||
total = src + asm
|
||||
src_percent = 100 * src / total
|
||||
asm_percent = 100 * asm / total
|
||||
|
||||
print('{} total bytes of decompilable code\n'.format(total))
|
||||
print('{} bytes of code in src {}%'.format(src, src_percent))
|
||||
print('{} bytes of code in asm {}%\n'.format(asm, asm_percent))
|
||||
print("------------------------------------\n")
|
||||
|
||||
num_masks = 24
|
||||
max_rupees = 500
|
||||
bytes_per_mask = total / num_masks
|
||||
bytes_per_rupee = bytes_per_mask / max_rupees
|
||||
masks = int(src / bytes_per_mask)
|
||||
rupees = int((src % bytes_per_mask) / bytes_per_rupee)
|
||||
|
||||
if (rupees > 0):
|
||||
print('You have {}/{} masks and {}/{} rupee(s).\n'.format(masks, num_masks, rupees, max_rupees));
|
||||
else:
|
||||
print('You have {}/{} masks .\n'.format(masks, num_masks));
|
||||
|
||||
Loading…
Reference in New Issue