2015-06-21 15:33:46 +00:00
|
|
|
#!/usr/bin/env python
|
|
|
|
#
|
|
|
|
# Script to sort the game controller database entries in SDL_gamecontroller.c
|
|
|
|
|
|
|
|
import re
|
|
|
|
|
|
|
|
|
|
|
|
filename = "SDL_gamecontrollerdb.h"
|
|
|
|
input = open(filename)
|
|
|
|
output = open(filename + ".new", "w")
|
|
|
|
parsing_controllers = False
|
|
|
|
controllers = []
|
|
|
|
controller_guids = {}
|
2020-03-13 02:47:28 +00:00
|
|
|
conditionals = []
|
2015-06-21 15:33:46 +00:00
|
|
|
split_pattern = re.compile(r'([^"]*")([^,]*,)([^,]*,)([^"]*)(".*)')
|
|
|
|
|
2020-03-13 02:47:28 +00:00
|
|
|
def find_element(prefix, bindings):
|
|
|
|
i=0
|
|
|
|
for element in bindings:
|
|
|
|
if element.startswith(prefix):
|
|
|
|
return i
|
|
|
|
i=(i + 1)
|
|
|
|
|
|
|
|
return -1
|
|
|
|
|
2015-06-21 15:33:46 +00:00
|
|
|
def save_controller(line):
|
|
|
|
global controllers
|
|
|
|
match = split_pattern.match(line)
|
|
|
|
entry = [ match.group(1), match.group(2), match.group(3) ]
|
|
|
|
bindings = sorted(match.group(4).split(","))
|
|
|
|
if (bindings[0] == ""):
|
|
|
|
bindings.pop(0)
|
2020-03-13 02:47:28 +00:00
|
|
|
|
|
|
|
pos=find_element("sdk", bindings)
|
|
|
|
if pos >= 0:
|
|
|
|
bindings.append(bindings.pop(pos))
|
|
|
|
|
|
|
|
pos=find_element("hint:", bindings)
|
|
|
|
if pos >= 0:
|
|
|
|
bindings.append(bindings.pop(pos))
|
|
|
|
|
2019-01-21 19:49:08 +00:00
|
|
|
entry.extend(",".join(bindings) + ",")
|
2015-06-21 15:33:46 +00:00
|
|
|
entry.append(match.group(5))
|
|
|
|
controllers.append(entry)
|
|
|
|
|
2020-03-13 02:47:28 +00:00
|
|
|
if ',sdk' in line or ',hint:' in line:
|
|
|
|
conditionals.append(entry[1])
|
2020-02-17 22:15:47 +00:00
|
|
|
|
2015-06-21 15:33:46 +00:00
|
|
|
def write_controllers():
|
|
|
|
global controllers
|
|
|
|
global controller_guids
|
2018-06-12 07:18:10 +00:00
|
|
|
# Check for duplicates
|
|
|
|
for entry in controllers:
|
2020-03-13 02:47:28 +00:00
|
|
|
if (entry[1] in controller_guids and entry[1] not in conditionals):
|
2018-06-12 07:18:10 +00:00
|
|
|
current_name = entry[2]
|
|
|
|
existing_name = controller_guids[entry[1]][2]
|
|
|
|
print("Warning: entry '%s' is duplicate of entry '%s'" % (current_name, existing_name))
|
|
|
|
|
|
|
|
if (not current_name.startswith("(DUPE)")):
|
|
|
|
entry[2] = "(DUPE) " + current_name
|
|
|
|
|
|
|
|
if (not existing_name.startswith("(DUPE)")):
|
|
|
|
controller_guids[entry[1]][2] = "(DUPE) " + existing_name
|
|
|
|
|
|
|
|
controller_guids[entry[1]] = entry
|
|
|
|
|
|
|
|
for entry in sorted(controllers, key=lambda entry: entry[2]+"-"+entry[1]):
|
2015-06-21 15:33:46 +00:00
|
|
|
line = "".join(entry) + "\n"
|
2017-08-31 06:02:39 +00:00
|
|
|
line = line.replace("\t", " ")
|
2021-06-25 01:09:04 +00:00
|
|
|
if not line.endswith(",\n") and not line.endswith("*/\n") and not line.endswith(",\r\n") and not line.endswith("*/\r\n"):
|
2015-06-21 15:33:46 +00:00
|
|
|
print("Warning: '%s' is missing a comma at the end of the line" % (line))
|
|
|
|
output.write(line)
|
2018-06-12 07:18:10 +00:00
|
|
|
|
2015-06-21 15:33:46 +00:00
|
|
|
controllers = []
|
|
|
|
controller_guids = {}
|
|
|
|
|
|
|
|
for line in input:
|
|
|
|
if (parsing_controllers):
|
|
|
|
if (line.startswith("{")):
|
|
|
|
output.write(line)
|
|
|
|
elif (line.startswith(" NULL")):
|
|
|
|
parsing_controllers = False
|
|
|
|
write_controllers()
|
|
|
|
output.write(line)
|
|
|
|
elif (line.startswith("#if")):
|
|
|
|
print("Parsing " + line.strip())
|
|
|
|
output.write(line)
|
|
|
|
elif (line.startswith("#endif")):
|
|
|
|
write_controllers()
|
|
|
|
output.write(line)
|
|
|
|
else:
|
|
|
|
save_controller(line)
|
|
|
|
else:
|
|
|
|
if (line.startswith("static const char *s_ControllerMappings")):
|
|
|
|
parsing_controllers = True
|
|
|
|
|
|
|
|
output.write(line)
|
|
|
|
|
|
|
|
output.close()
|
|
|
|
print("Finished writing %s.new" % filename)
|