[alsa-devel] rfe: keep SND_PCI_QUIRK groups are sorted by vendor and product id pair
Andy Shevchenko
andy at smile.org.ua
Sat Dec 15 23:30:31 CET 2007
Hi!
Some to be discussed. I found the SND_PCI_QUIRK group (lines with this macro
under one structure) is unsorted. Almost in all cases no sense to make so.
I wrote python script to keep lists sorted.
Please, comment this.
P.S. Known bug is a deletion of the empty lines under group.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# vim: ts=4 sw=4 et:
"""
The sript sorts SND_PCI_QUIRK groups by vendor and product id pair.
"""
__author__ = "Andy Shevchenko <andy at smile.org.ua>"
__revision__ = "$Id$"
import sys
import os
import re
def read_file(fname):
""" Read given file """
fdes = open(fname, 'rt')
result = fdes.readlines()
fdes.close()
return result
def save_file(fname, lines):
""" Write lines to the given file """
fdes = open(fname, 'wt')
fdes.writelines(lines)
fdes.flush()
fdes.close()
def parse_quirks(quirks):
""" Parse buffer as SND_PCI_QUIRK group """
rexp_begin = re.compile("^\s*[/\*]*\s*SND_PCI_QUIRK\((?P<vid>[^,]+),\s*(?P<pid>[^,]+)")
rexp_end = re.compile("\),\s*(/\*.+\*/)?\s*$")
xbuffer = {} # vendor, product: prefix lines, line, postfix lines
flag = False
vpid = 0
prefix = []
postfix = []
for line in quirks:
if line.strip() == '':
continue
rmatch = rexp_begin.match(line)
if rmatch:
if flag == True:
xbuffer[vpid][2].extend(postfix)
postfix = []
flag = False
vpid = (int(rmatch.group('vid'), 16) << 16) + int(rmatch.group('pid'), 16)
if xbuffer.has_key(vpid):
print "Warning: the line '%s' is duplicate!" % line.strip()
xbuffer[vpid][2].append(line)
else:
xbuffer[vpid] = [prefix, line, []]
prefix = []
if not rexp_end.search(line):
flag = True
else:
if flag == False:
prefix.append(line)
else:
postfix.append(line)
return xbuffer
def sort_quirks(quirks):
""" Sort SND_PCI_QUIRK group by vendor and product id pair """
xbuffer = []
keys = quirks.keys()
keys.sort()
for key in keys:
quirk = quirks[key]
xbuffer.extend(quirk[0])
xbuffer.append(quirk[1])
xbuffer.extend(quirk[2])
return xbuffer
def catch_quirk_lines(lines):
""" Catch SND_PCI_QUIRK group from lines and sort it """
rexp_begin = re.compile("\s*struct\s+snd_pci_quirk\s+.+\s*=\s*{\s*$")
flag = False
xbuffer = []
quirks = []
for line in lines:
if flag == False and rexp_begin.search(line):
xbuffer.append(line)
quirks.extend(xbuffer)
flag = True
xbuffer = []
continue
if flag == True and line.strip() == '{}':
quirks.extend(sort_quirks(parse_quirks(xbuffer)))
flag = False
xbuffer = []
xbuffer.append(line)
quirks.extend(xbuffer)
return quirks
def main():
""" MAIN """
try:
fname = sys.argv[1]
except IndexError:
print "Usage: %s <input file>" % os.path.basename(sys.argv[0])
sys.exit(1)
lines = read_file(fname)
quirks = catch_quirk_lines(lines)
save_file('%s.sorted' % fname, quirks)
if __name__ == '__main__':
main()
# End of file
--
With best regards,
Andy Shevchenko. mailto: andy at smile.org.ua
More information about the Alsa-devel
mailing list