Author: glen Date: Mon May 5 18:54:31 2008 GMT Module: SOURCES Tag: HEAD ---- Log message: - use ordered dict - skip configs that are really taken from env: option env="ARCH"
---- Files affected: SOURCES: kernel-symsorder.py (1.2 -> 1.3) ---- Diffs: ================================================================ Index: SOURCES/kernel-symsorder.py diff -u SOURCES/kernel-symsorder.py:1.2 SOURCES/kernel-symsorder.py:1.3 --- SOURCES/kernel-symsorder.py:1.2 Mon May 5 18:58:04 2008 +++ SOURCES/kernel-symsorder.py Mon May 5 20:54:26 2008 @@ -14,9 +14,62 @@ # # Date Created # 2008-04-23 -# +# import os,sys +from UserDict import UserDict + +# odict (Ordered Dict) from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747 +class odict(UserDict): + def __init__(self, dict = None): + self._keys = [] + UserDict.__init__(self, dict) + + def __delitem__(self, key): + UserDict.__delitem__(self, key) + self._keys.remove(key) + + def __setitem__(self, key, item): + UserDict.__setitem__(self, key, item) + if key not in self._keys: self._keys.append(key) + + def clear(self): + UserDict.clear(self) + self._keys = [] + + def copy(self): + dict = UserDict.copy(self) + dict._keys = self._keys[:] + return dict + + def items(self): + return zip(self._keys, self.values()) + + def keys(self): + return self._keys + + def popitem(self): + try: + key = self._keys[-1] + except IndexError: + raise KeyError('dictionary is empty') + + val = self[key] + del self[key] + + return (key, val) + + def setdefault(self, key, failobj = None): + UserDict.setdefault(self, key, failobj) + if key not in self._keys: self._keys.append(key) + + def update(self, dict): + UserDict.update(self, dict) + for key in dict.keys(): + if key not in self._keys: self._keys.append(key) + + def values(self): + return map(self.get, self._keys) class ParsingException(Exception): pass @@ -27,14 +80,15 @@ lineno = 0 helplen = 0 result = [] + index = 0 # strip quotes from string - def zapquotes(self, str): + def stripquotes(self, str): if str[0] == '"': str = str[1:str.rfind('"')] return str # pre-proccess input lines. handles line continuations - def preparse(self, data): + def getline(self, data): x = data.pop(0) self.lineno = self.lineno + 1 while True: @@ -50,7 +104,7 @@ raise StopIteration def parse(self, filename, basedir = None): - self.result = [] + self.result = odict() if basedir: self.basedir = basedir try: @@ -63,7 +117,7 @@ self.filename = filename lines = open(filename).read().split("\n") - for line in self.preparse(lines): + for line in self.getline(lines): if self.helplen: line = line.expandtabs() if not len(line) or line[:self.helplen].isspace(): @@ -72,6 +126,13 @@ self.helplen = 0 self.parseline(line) + def addconfig(self, config): + self.result[config] = config + + def addmenu(self, menu): + self.result[self.index] = menu + self.index = self.index + 1 + def parseline(self, line): words = line.strip().split(None, 1) # skip empty lines @@ -81,16 +142,21 @@ if words[0] in ('config', 'menuconfig'): config = words[1] - self.result.append(config) + self.addconfig(config) elif words[0] in ('menu'): - menu = self.zapquotes(words[1]) - self.result.append("") - self.result.append("#") - self.result.append("# " + menu) - self.result.append("#") + menu = self.stripquotes(words[1]) + self.addmenu(menu) + + elif words[0] in ('option'): + option = self.stripquotes(words[1]) + # delete config keys which have: option env="ARCH" + if option.find('=') > 0: + (key, val) = option.split('=') + val = self.stripquotes(val) + del self.result[val] - elif words[0] in ('bool', 'boolean', 'mainmenu', 'option', 'def_tristate', \ + elif words[0] in ('bool', 'boolean', 'mainmenu', 'def_tristate', \ 'optional', 'comment', 'choice', 'endchoice', 'range', 'def_bool', \ 'endmenu', 'tristate', 'string', 'hex', 'int', 'prompt', 'default', \ 'depends', 'select', 'if', 'endif'): @@ -100,8 +166,13 @@ self.helplen = len(line[:line.find(words[0])].expandtabs()) elif words[0] == 'source': - file = self.zapquotes(words[1]) - self.result += MenuParser().parse(file, basedir = self.basedir) + file = self.stripquotes(words[1]) + res = MenuParser().parse(file, basedir = self.basedir) + for a in res.keys(): + if type(a) == int: + self.addmenu(res[a]) + continue + self.addconfig(a) else: raise ParsingException, "%s:%d: Bad line: %s\n" % (self.filename, self.lineno, line.strip()) @@ -124,5 +195,14 @@ sys.stderr.write(e.message) sys.exit(1) - for symbol in res: + for symbol in res.keys(): + if type(symbol) == int: + # comments + print "" + print "#" + print "# " + res[symbol] + print "#" + continue + + # symbols print symbol ================================================================ ---- CVS-web: http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/kernel-symsorder.py?r1=1.2&r2=1.3&f=u _______________________________________________ pld-cvs-commit mailing list [email protected] http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit
