+def loadModuleData(project):
+ moduleInfoDict = {}
+ listInfoDict = {}
+ configurationInfoDict = {}
+ for filename, path in findDefinitions("*.h", project):
+ commentList = getCommentList(open(path + "/" + filename, "r").read())
+ if len(commentList) > 0:
+ moduleInfo = {}
+ configurationInfo = {}
+ try:
+ toBeParsed, moduleDict = loadModuleDefinition(commentList[0])
+ except ParseError, err:
+ raise DefineException.ModuleDefineException(path, err.line_number, err.line)
+ for module, information in moduleDict.items():
+ information["category"] = os.path.basename(path)
+ if "configuration" in information.keys() and len(information["configuration"]):
+ configuration = moduleDict[module]["configuration"]
+ try:
+ configurationInfo[configuration] = loadConfigurationInfos(project.info("SOURCES_PATH") + "/" + configuration)
+ except ParseError, err:
+ raise DefineException.ConfigurationDefineException(project.info("SOURCES_PATH") + "/" + configuration, err.line_number, err.line)
+ moduleInfoDict.update(moduleDict)
+ configurationInfoDict.update(configurationInfo)
+ if toBeParsed:
+ try:
+ listDict = loadDefineLists(commentList[1:])
+ listInfoDict.update(listDict)
+ except ParseError, err:
+ raise DefineException.EnumDefineException(path, err.line_number, err.line)
+ for filename, path in findDefinitions("*_" + project.info("CPU_INFOS")["TOOLCHAIN"] + ".h", project):
+ commentList = getCommentList(open(path + "/" + filename, "r").read())
+ listInfoDict.update(loadDefineLists(commentList))
+ for tag in project.info("CPU_INFOS")["CPU_TAGS"]:
+ for filename, path in findDefinitions("*_" + tag + ".h", project):
+ commentList = getCommentList(open(path + "/" + filename, "r").read())
+ listInfoDict.update(loadDefineLists(commentList))
+ project.setInfo("MODULES", moduleInfoDict)
+ project.setInfo("LISTS", listInfoDict)
+ project.setInfo("CONFIGURATIONS", configurationInfoDict)
+
+def formatParamNameValue(text):
+ """
+ Take the given string and return a tuple with the name of the parameter in the first position
+ and the value in the second.
+ """
+ block = re.findall("\s*([^\s]+)\s*(.+?)\s*$", text, re.MULTILINE)
+ return block[0]
+
+def loadConfigurationInfos(path):
+ """
+ Return the module configurations found in the given file as a dict with the
+ parameter name as key and a dict containig the fields above as value:
+ "value": the value of the parameter
+ "description": the description of the parameter
+ "informations": a dict containig optional informations:
+ "type": "int" | "boolean" | "enum"
+ "min": the minimum value for integer parameters
+ "max": the maximum value for integer parameters
+ "long": boolean indicating if the num is a long
+ "value_list": the name of the enum for enum parameters
+ """
+ configurationInfos = {}
+ for comment, define in getDefinitionBlocks(open(path, "r").read()):
+ name, value = formatParamNameValue(define)
+ brief, description, informations = getDescriptionInformations(comment)
+ configurationInfos[name] = {}
+ configurationInfos[name]["value"] = value
+ configurationInfos[name]["informations"] = informations
+ if ("type" in configurationInfos[name]["informations"].keys() and
+ configurationInfos[name]["informations"]["type"] == "int" and
+ configurationInfos[name]["value"].find("L") != -1):
+ configurationInfos[name]["informations"]["long"] = True
+ configurationInfos[name]["value"] = configurationInfos[name]["value"].replace("L", "")
+ if ("type" in configurationInfos[name]["informations"].keys() and
+ configurationInfos[name]["informations"]["type"] == "int" and
+ configurationInfos[name]["value"].find("U") != -1):
+ configurationInfos[name]["informations"]["unsigned"] = True
+ configurationInfos[name]["value"] = configurationInfos[name]["value"].replace("U", "")
+ configurationInfos[name]["description"] = description
+ configurationInfos[name]["brief"] = brief
+ return configurationInfos
+
+def sub(string, parameter, value):
+ """
+ Substitute the given value at the given parameter define in the given string
+ """
+ return re.sub(r"(?P<define>#define\s+" + parameter + r"\s+)([^\s]+)", r"\g<define>" + value, string)
+
+def isInt(informations):
+ """
+ Return True if the value is a simple int.
+ """
+ if ("long" not in informatios.keys() or not informations["long"]) and ("unsigned" not in informations.keys() or informations["unsigned"]):
+ return True
+ else:
+ return False
+
+def isLong(informations):
+ """
+ Return True if the value is a long.
+ """
+ if "long" in informations.keys() and informations["long"] and "unsigned" not in informations.keys():
+ return True
+ else:
+ return False
+
+def isUnsigned(informations):
+ """
+ Return True if the value is an unsigned.
+ """
+ if "unsigned" in informations.keys() and informations["unsigned"] and "long" not in informations.keys():
+ return True
+ else:
+ return False
+
+def isUnsignedLong(informations):
+ """
+ Return True if the value is an unsigned long.
+ """
+ if "unsigned" in informations.keys() and "long" in informations.keys() and informations["unsigned"] and informations["long"]:
+ return True
+ else:
+ return False
+
+class ParseError(Exception):
+ def __init__(self, line_number, line):
+ Exception.__init__(self)
+ self.line_number = line_number
+ self.line = line