diff options
author | 2017-01-10 15:12:21 +1100 | |
---|---|---|
committer | 2017-01-10 15:12:21 +1100 | |
commit | 74af888a3021f321f5c5af73d600ff5db2833335 (patch) | |
tree | 41dde5d0966962474a0abb50f328567a6922a4df /src/tools/discrepancy-fixer.py | |
parent | f1ead008c4bd40a4ed67bc38879be7376db9d0d4 (diff) |
Clean up scripts from #1861 (nw):
* use spaces for indentation
* better error reporting
* some optimisation
* slightly more intelligent preservation of tabulation
Diffstat (limited to 'src/tools/discrepancy-fixer.py')
-rwxr-xr-x | src/tools/discrepancy-fixer.py | 121 |
1 files changed, 75 insertions, 46 deletions
diff --git a/src/tools/discrepancy-fixer.py b/src/tools/discrepancy-fixer.py index bc334444e85..d36d2863247 100755 --- a/src/tools/discrepancy-fixer.py +++ b/src/tools/discrepancy-fixer.py @@ -1,53 +1,82 @@ #!/usr/bin/python +## +## license:BSD-3-Clause +## copyright-holders:Zoe Blade # Fix discrepancies in arcade ROM dump names, by Zoe Blade -# For Python 2 +# For Python 2 and 3 +import sys import xml.etree.ElementTree -print('Loading XML file...') -root = xml.etree.ElementTree.parse('arcade.xml').getroot() -print('Done.') -for childMachine in root.iter('machine'): - if not childMachine.get('cloneof'): - continue - - for parentMachine in root.iter('machine'): - if not parentMachine.get('name') == childMachine.get('cloneof'): - continue - - # Machine pair found - - for childRom in childMachine.iter('rom'): - for parentRom in parentMachine.iter('rom'): - if not parentRom.get('sha1') == childRom.get('sha1'): - continue - - # ROM pair found - - if parentRom.get('name') == childRom.get('name'): - break - - # The names don't match - - sourceFilename = childMachine.get('sourcefile') - - input = open(sourceFilename, 'r') - source = input.read() - input.close() - - oldRomFilename = '"' + childRom.get('name') + '"' - newRomFilename = '"' + parentRom.get('name') + '"' - - oldRomFilenamePadded = oldRomFilename.ljust(14, ' ') - newRomFilenamePadded = newRomFilename.ljust(14, ' ') - - source = source.replace(oldRomFilenamePadded, newRomFilenamePadded) # Try to preserve fancy spacing where possible - source = source.replace(oldRomFilename, newRomFilename) # Fallback on just replacing the filename - - output = open(sourceFilename, 'w') - output.write(source) - output.close() - - print(sourceFilename + ': ' + oldRomFilename + ' -> ' + newRomFilename) +def fixPair(parentMachine, childMachine): + changes = { } + for childRom in childMachine.iter('rom'): + for parentRom in parentMachine.iter('rom'): + if parentRom.get('sha1') == childRom.get('sha1'): + # ROM pair found + if parentRom.get('name') != childRom.get('name'): + # The names don't match + changes[childRom.get('name')] = parentRom.get('name') + + if changes: + sourceFilename = childMachine.get('sourcefile') + + try: + input = open(sourceFilename, 'r') + source = input.read() + input.close() + except Exception as e: + sys.stderr.write('%s: error reading %s: %s\n' % (sys.argv[0], sourceFilename, e)) + return False + + for oldRomFilename in changes: + newRomFilename = '"%s"' % (changes[oldRomFilename]) + oldRomFilename = '"%s"' % (oldRomFilename) + + paddedLen = max(len(oldRomFilename), len(newRomFilename)) + oldRomFilenamePadded = oldRomFilename.ljust(paddedLen, ' ') + newRomFilenamePadded = newRomFilename.ljust(paddedLen, ' ') + + source = source.replace(oldRomFilenamePadded, newRomFilenamePadded) # Try to preserve fancy spacing where possible + source = source.replace(oldRomFilename, newRomFilename) # Fallback on just replacing the filename + + sys.stdout.write('%s: %s -> %s\n' % (sourceFilename, oldRomFilename, newRomFilename)) + + output = open(sourceFilename, 'w') + output.write(source) + output.close() + + return True + + +if __name__ == '__main__': + if len(sys.argv) > 2: + sys.stderr.write('Usage:\n%s [arcade.xml]\n' % sys.argv[0]) + sys.exit(1) + + if len(sys.argv) > 1: + filename = sys.argv[1] + else: + filename = 'arcade.xml' + + sys.stderr.write('Loading XML file...') + sys.stderr.flush() + try: + root = xml.etree.ElementTree.parse(filename).getroot() + except Exception as e: + sys.stderr.write('\n%s: error parsing %s: %s\n' % (sys.argv[0], filename, e)) + sys.exit(2) + sys.stderr.write('done.\n') + + errors = 0 + for childMachine in root.iter('machine'): + if childMachine.get('cloneof'): + for parentMachine in root.iter('machine'): + if parentMachine.get('name') == childMachine.get('cloneof'): + # Machine pair found + if not fixPair(parentMachine, childMachine): + errors += 1 + + sys.exit(0 if errors == 0 else 3) |