SOURCES: kernel-symsorder.py (NEW) - scans kernel Kconfig symbols ...
glen
glen at pld-linux.org
Wed Apr 23 17:40:07 CEST 2008
Author: glen Date: Wed Apr 23 15:40:07 2008 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- scans kernel Kconfig symbols order
---- Files affected:
SOURCES:
kernel-symsorder.py (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/kernel-symsorder.py
diff -u /dev/null SOURCES/kernel-symsorder.py:1.1
--- /dev/null Wed Apr 23 17:40:07 2008
+++ SOURCES/kernel-symsorder.py Wed Apr 23 17:40:02 2008
@@ -0,0 +1,111 @@
+#!/usr/bin/python
+# vim: set fileencoding=utf-8
+# -*- coding: utf-8 -*-
+#
+# Parse kernel Kconfig and return all kernel symbols in orders it will write
+# likely also to .config file. based on
+#
+# Parsing code based on http://kernel.org/doc/make/menuconfig2html.py
+#
+# Authors
+# Elan Ruusamäe <glen at pld-linux.org>
+# Patryk Zawadzki <patrys at pld-linux.org>
+#
+# Date Created
+# 2008-04-23
+#
+
+# "boolean" not documented type in kconfig-language.txt line 51
+
+import os,sys
+
+class ParsingException(Exception):
+ pass
+
+class MenuParser(object):
+ filename = ""
+ lineno = 0
+ helplen = 0
+ result = []
+
+ # strip quotes from string
+ def zapquotes(self, str):
+ if str[0] == '"': str = str[1:str.rfind('"')]
+ return str
+
+ # pre-proccess input lines. handles line continuations
+ def preparse(self, data):
+ x = data.pop(0)
+ self.lineno = self.lineno + 1
+ while True:
+ if x:
+ while x[-1] == '\\':
+ x = x[:-1] + data.pop(0)
+ self.lineno = self.lineno + 1
+ yield x
+ if data:
+ x = data.pop(0)
+ self.lineno = self.lineno + 1
+ else:
+ raise StopIteration
+
+ def parse(self, filename):
+ self.result = []
+ self.readfile(filename)
+ return self.result
+
+ def readfile(self, filename):
+ self.filename = filename
+ lines = open(filename).read().split("\n")
+
+ for line in self.preparse(lines):
+ if self.helplen:
+ line = line.expandtabs()
+ if not len(line) or line[:self.helplen].isspace():
+ continue
+ else:
+ self.helplen = 0
+ self.parseline(line)
+
+ def parseline(self, line):
+ words = line.strip().split(None, 1)
+ # skip empty lines
+ if not len(words): return
+ # skip comments
+ if words[0][0] == '#': return
+
+ if words[0] in ('config', 'menuconfig'):
+ config = words[1]
+ self.result.append(config)
+
+ elif words[0] in ('bool', 'boolean', 'mainmenu', 'option', 'def_tristate', \
+ 'optional', 'comment', 'choice', 'endchoice', 'range', 'def_bool', \
+ 'endmenu', 'tristate', 'string', 'hex', 'int', 'prompt', 'default', \
+ 'depends', 'select', 'if', 'endif', 'menu'):
+ pass
+
+ elif words[0] in ('help', '---help---'):
+ self.helplen = len(line[:line.find(words[0])].expandtabs())
+
+ elif words[0] == 'source':
+ file = self.zapquotes(words[1])
+ parser = MenuParser()
+ self.result += parser.parse(file)
+
+ else:
+ raise ParsingException, "%s:%d: Bad line: %s\n" % (self.filename, self.lineno, line.strip())
+
+if __name__ == '__main__':
+ # called as script, not as lib
+ if len(sys.argv) != 2:
+ sys.stderr.write("Usage: symsorder.py kconfigfile\n")
+ sys.exit(1)
+ parser = MenuParser()
+ config = sys.argv[1]
+ try:
+ res = parser.parse(config)
+ except IOError:
+ sys.stderr.write("File %s missing\n" % config)
+ except ParsingException, e:
+ sys.stderr.write(e.message)
+
================================================================
More information about the pld-cvs-commit
mailing list