sm64

A Super Mario 64 decompilation
Log | Files | Refs | README | LICENSE

generate_armips_cpp.py (3973B)


      1 #!/usr/bin/env python
      2 
      3 import os
      4 import re
      5 import sys
      6 
      7 file_list = [
      8     'stdafx.h',
      9     'ext/tinyformat/tinyformat.h',
     10     'Commands/CAssemblerCommand.h',
     11     'Core/Expression.h',
     12     'Core/ExpressionFunctions.h',
     13     'Core/SymbolData.h',
     14     'Util/Util.h',
     15     'Util/FileClasses.h',
     16     'Util/ByteArray.h',
     17     'Core/FileManager.h',
     18     'Core/ELF/ElfTypes.h',
     19     'Core/ELF/ElfFile.h',
     20     'Core/ELF/ElfRelocator.h',
     21     'Archs/Architecture.h',
     22     'Archs/MIPS/Mips.h',
     23     'Archs/MIPS/MipsOpcodes.h',
     24     'Archs/MIPS/CMipsInstruction.h',
     25     'Util/EncodingTable.h',
     26     'Core/Misc.h',
     27     'Core/Assembler.h',
     28     'Core/SymbolTable.h',
     29     'Core/Common.h',
     30     'Parser/DirectivesParser.h',
     31     'Parser/Tokenizer.h',
     32     'Archs/MIPS/MipsMacros.h',
     33     'Archs/MIPS/MipsParser.h',
     34     'Archs/MIPS/CMipsInstruction.cpp',
     35     'Archs/MIPS/MipsExpressionFunctions.h',
     36     'Archs/MIPS/MipsElfRelocator.h',
     37     'Archs/MIPS/Mips.cpp',
     38     'Archs/MIPS/MipsElfFile.h',
     39     'Util/CRC.h',
     40     'Archs/MIPS/MipsElfFile.cpp',
     41     'Commands/CommandSequence.h',
     42     'Parser/Parser.h',
     43     'Archs/MIPS/MipsElfRelocator.cpp',
     44     'Archs/MIPS/MipsExpressionFunctions.cpp',
     45     'Archs/MIPS/MipsMacros.cpp',
     46     'Archs/MIPS/MipsOpcodes.cpp',
     47     'Parser/ExpressionParser.h',
     48     'Archs/MIPS/PsxRelocator.h',
     49     'Commands/CDirectiveFile.h',
     50     'Archs/MIPS/MipsParser.cpp',
     51     'Archs/MIPS/PsxRelocator.cpp',
     52     'Archs/Architecture.cpp',
     53     'Commands/CAssemblerCommand.cpp',
     54     'Commands/CAssemblerLabel.h',
     55     'Commands/CAssemblerLabel.cpp',
     56     'Commands/CDirectiveArea.h',
     57     'Commands/CDirectiveArea.cpp',
     58     'Commands/CDirectiveConditional.h',
     59     'Commands/CDirectiveConditional.cpp',
     60     'Commands/CDirectiveData.h',
     61     'Commands/CDirectiveData.cpp',
     62     'Commands/CDirectiveFile.cpp',
     63     'Commands/CDirectiveMessage.h',
     64     'Commands/CDirectiveMessage.cpp',
     65     'Commands/CommandSequence.cpp',
     66     'Parser/DirectivesParser.cpp',
     67     'Parser/ExpressionParser.cpp',
     68     'Parser/Parser.cpp',
     69     'Parser/Tokenizer.cpp',
     70     'Util/ByteArray.cpp',
     71     'Util/CRC.cpp',
     72     'Util/EncodingTable.cpp',
     73     'Util/FileClasses.cpp',
     74     'Util/Util.cpp',
     75     'Main/CommandLineInterface.h',
     76     'Main/CommandLineInterface.cpp',
     77     'Core/ELF/ElfFile.cpp',
     78     'Core/ELF/ElfRelocator.cpp',
     79     'Core/Assembler.cpp',
     80     'Core/Common.cpp',
     81     'Core/Expression.cpp',
     82     'Core/ExpressionFunctions.cpp',
     83     'Core/FileManager.cpp',
     84     'Core/Misc.cpp',
     85     'Core/SymbolData.cpp',
     86     'Core/SymbolTable.cpp',
     87     'Main/main.cpp',
     88 ]
     89 
     90 file_header =  \
     91 """// armips assembler v0.11
     92 // https://github.com/Kingcom/armips/
     93 // To simplify compilation, all files have been concatenated into one.
     94 // MIPS only, ARM is not included.\n\n"""
     95 
     96 def banned(line):
     97     return '#pragma once' in line or '#include "' in line
     98 
     99 def cat_file(fout, fin_name):
    100     with open(fin_name) as fin:
    101         lines = fin.readlines()
    102         lines = [l.rstrip() for l in lines if not banned(l)]
    103         for l in lines:
    104             if re.search(r'\bArm\b', l):
    105                 fout.write("#ifdef ARMIPS_ARM\n") # must manually insert #endif
    106             fout.write(l + '\n')
    107         fout.write('\n')
    108 
    109 def combine_armips(fout_name, armips_path):
    110     with open(fout_name, 'w') as fout:
    111         fout.write(file_header)
    112         fout.write("/*\n")
    113         cat_file(fout, os.path.join(armips_path, 'LICENSE.txt'))
    114         fout.write("*/\n\n")
    115         for f in file_list:
    116             fout.write(f"// file: {f}\n")
    117             cat_file(fout, os.path.join(armips_path, f))
    118 
    119 def main():
    120     if len(sys.argv) > 1 and sys.argv[1] in ['-h', '--help']:
    121         print('Usage: generate_armips_cpp.py [output_filename] [armips_src_dir]')
    122         print('Defaults: [output_filename = "armips.cpp"] [armips_src_dir = "./armips"]')
    123         return
    124     fout_name = sys.argv[1] if len(sys.argv) > 1 else 'armips.cpp'
    125     armips_path = sys.argv[2] if len(sys.argv) > 2 else './armips'
    126     combine_armips(fout_name, os.path.expanduser(armips_path))
    127 
    128 main()