summaryrefslogblamecommitdiffstatshomepage
path: root/src/tools/discrepancy-fixer.py
blob: d36d286324709166c89b8df76f864c99c0cd9196 (plain) (tree)
1
2
3
4
5
6
7
8
9
                 


                              

                                                          
                    
 
          

                            
 





































































                                                                                                                              
#!/usr/bin/python
##
## license:BSD-3-Clause
## copyright-holders:Zoe Blade

# Fix discrepancies in arcade ROM dump names, by Zoe Blade
# For Python 2 and 3

import sys
import xml.etree.ElementTree


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)