88 lines
2.8 KiB
Python
88 lines
2.8 KiB
Python
import re
|
|
|
|
class FirmwareFile(object):
|
|
def __init__(self, binary, desc=None, source=None, version=None):
|
|
self.binary = binary
|
|
self.desc = desc
|
|
self.source = source
|
|
self.version = version
|
|
|
|
class FirmwareSection(object):
|
|
def __init__(self, driver, files, licence):
|
|
self.driver = driver
|
|
self.files = files
|
|
self.licence = licence
|
|
|
|
class FirmwareWhence(list):
|
|
def __init__(self, file):
|
|
self.read(file)
|
|
|
|
def read(self, file):
|
|
in_header = True
|
|
driver = None
|
|
files = {}
|
|
licence = None
|
|
binary = None
|
|
desc = None
|
|
source = None
|
|
version = None
|
|
|
|
for line in file:
|
|
if line.startswith('----------'):
|
|
if in_header:
|
|
in_header = False
|
|
else:
|
|
# Finish old section
|
|
if driver:
|
|
self.append(FirmwareSection(driver, files, licence))
|
|
driver = None
|
|
files = {}
|
|
licence = None
|
|
continue
|
|
|
|
if in_header:
|
|
continue
|
|
|
|
if line == '\n':
|
|
# End of field; end of file fields
|
|
if binary:
|
|
files[binary] = FirmwareFile(binary, desc, source, version)
|
|
binary = None
|
|
desc = None
|
|
source = None
|
|
version = None
|
|
continue
|
|
|
|
match = re.match(
|
|
r'(Driver|File|Info|Licen[cs]e|Source|Version'
|
|
r'|Original licen[cs]e info(?:rmation)?):\s*(.*)\n',
|
|
line)
|
|
if match:
|
|
keyword, value = match.group(1, 2)
|
|
if keyword == 'Driver':
|
|
driver = value.split(' ')[0].lower()
|
|
elif keyword == 'File':
|
|
match = re.match(r'(\S+)\s+--\s+(.*)', value)
|
|
if match:
|
|
binary = match.group(1)
|
|
desc = match.group(2)
|
|
else:
|
|
for binary in value.strip().split():
|
|
files[binary] = FirmwareFile(binary)
|
|
binary = None
|
|
elif keyword in ['Info', 'Version']:
|
|
version = value
|
|
elif keyword == 'Source':
|
|
source = value
|
|
else:
|
|
licence = value
|
|
elif licence is not None:
|
|
licence = (licence + '\n' +
|
|
re.sub(r'^(?:[/ ]\*| \*/)?\s*(.*?)\s*$', r'\1', line))
|
|
|
|
# Finish last section if non-empty
|
|
if binary:
|
|
files[binary] = FirmwareFile(binary, desc, source, version)
|
|
if driver:
|
|
self.append(FirmwareSection(driver, files, licence))
|