cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

sort_controllers.py (1974B)


      1#!/usr/bin/env python
      2#
      3# Script to sort the game controller database entries in SDL_gamecontroller.c
      4
      5import re
      6
      7
      8filename = "SDL_gamecontrollerdb.h"
      9input = open(filename)
     10output = open(filename + ".new", "w")
     11parsing_controllers = False
     12controllers = []
     13controller_guids = {}
     14split_pattern = re.compile(r'([^"]*")([^,]*,)([^,]*,)([^"]*)(".*)')
     15
     16def save_controller(line):
     17    global controllers
     18    match = split_pattern.match(line)
     19    entry = [ match.group(1), match.group(2), match.group(3) ]
     20    bindings = sorted(match.group(4).split(","))
     21    if (bindings[0] == ""):
     22        bindings.pop(0)
     23    entry.extend(",".join(bindings) + ",")
     24    entry.append(match.group(5))
     25    controllers.append(entry)
     26
     27def write_controllers():
     28    global controllers
     29    global controller_guids
     30    for entry in sorted(controllers, key=lambda entry: entry[2]):
     31        line = "".join(entry) + "\n"
     32        if not line.endswith(",\n") and not line.endswith("*/\n"):
     33            print "Warning: '%s' is missing a comma at the end of the line" % (line)
     34        if (entry[1] in controller_guids):
     35            print "Warning: entry '%s' is duplicate of entry '%s'" % (entry[2], controller_guids[entry[1]][2])
     36        controller_guids[entry[1]] = entry
     37
     38        output.write(line)
     39    controllers = []
     40    controller_guids = {}
     41
     42for line in input:
     43    if ( parsing_controllers ):
     44        if (line.startswith("{")):
     45            output.write(line)
     46        elif (line.startswith("#endif")):
     47            parsing_controllers = False
     48            write_controllers()
     49            output.write(line)
     50        elif (line.startswith("#")):
     51            print "Parsing " + line.strip()
     52            write_controllers()
     53            output.write(line)
     54        else:
     55            save_controller(line)
     56    else:
     57        if (line.startswith("static const char *s_ControllerMappings")):
     58            parsing_controllers = True
     59
     60        output.write(line)
     61
     62output.close()
     63print "Finished writing %s.new" % filename