| #!/usr/bin/python |
| |
| |
| # Produce a dump of name->constant of the poolitem values, to make interpreting things in the debugger easier |
| # |
| |
| import subprocess |
| |
| macroNameToValue = dict() |
| macroNameToOriginalLine = dict() |
| |
| |
| def extractMacroValue(macroValue): |
| if isinstance(macroValue, int): |
| return macroValue |
| elif macroValue.isdigit(): |
| return int(macroValue) |
| elif macroValue[0:2] == "0x": |
| return int(macroValue, 16) |
| elif macroValue.find("+") != -1: |
| tokens = macroValue.split("+") |
| tokens1 = tokens[0].strip() |
| tokens2 = tokens[1].strip() |
| return extractMacroValue(tokens1) + extractMacroValue(tokens2) |
| elif macroValue.find("-") != -1: |
| tokens = macroValue.split("-") |
| tokens1 = tokens[0].strip() |
| tokens2 = tokens[1].strip() |
| return extractMacroValue(tokens1) - extractMacroValue(tokens2) |
| rv = extractMacroValue(macroNameToValue[macroValue]) |
| macroNameToValue[macroValue] = rv |
| return rv |
| |
| |
| a = subprocess.Popen("cpp -E -dD -Iinclude/ include/editeng/eeitem.hxx", stdout=subprocess.PIPE, shell=True) |
| |
| with a.stdout as txt: |
| for line in txt: |
| line = line.strip() |
| originalLine = line |
| if not line.startswith("#define "): |
| continue |
| # strip the '#define' off the front |
| idx1 = line.find(" ") |
| line = line[idx1:len(line)].strip() |
| # extract the name |
| idx1 = line.find(" ") |
| if (idx1 == -1): |
| continue |
| macroName = line[0:idx1].strip() |
| line = line[idx1:len(line)].strip() |
| # ignore internal stuff |
| if macroName.startswith("_"): |
| continue |
| # strip any trailing comments |
| idx1 = line.find("//") |
| if (idx1 != -1): |
| line = line[0:idx1].strip() |
| idx1 = line.find("/*") |
| if (idx1 != -1): |
| line = line[0:idx1].strip() |
| if len(line) == 0: |
| continue |
| # strip brackets |
| if line[0] == "(": |
| line = line[1:] |
| if line[len(line)-1] == ")": |
| line = line[0:len(line)-1] |
| macroValue = line.strip() |
| # ignore macros that #define strings, not interested in those |
| if (macroValue.find("\"") != -1): |
| continue |
| # ignore the multiline macros |
| if (macroValue.find("\\") != -1): |
| continue |
| # check for redefinitions |
| if macroNameToValue.has_key(macroName): |
| print("Redefinition:\n\t", macroNameToOriginalLine[macroName], "\n\t", originalLine) |
| else: |
| macroNameToValue[macroName] = macroValue |
| macroNameToOriginalLine[macroName] = originalLine |
| |
| # decode the constants into their numeric values recursively |
| macroValueToName = dict() |
| for macroName in macroNameToValue: |
| macroValue = macroNameToValue[macroName] |
| try: |
| macroValue = extractMacroValue(macroName) |
| macroValueToName[macroValue] = macroName |
| except KeyError: |
| print("warning: could not decode macro ", macroName) |
| |
| for macroValue in sorted(macroValueToName): |
| macroName = macroValueToName[macroValue] |
| print(repr(macroNameToValue[macroName]).rjust(5), " ", macroName) |
| |
| |
| |