#!/usr/bin/python # Scan .hrc files for conflicting SID constants # # This is not as easy as it sounds because some of the constants depend on other constants whose names do not start with SID_ # import subprocess import sys sidNameToValue = dict() sidNameToOriginalLine = dict() def extractSidValue(sidValue): if isinstance(sidValue, int): return sidValue if sidValue.isdigit(): return int(sidValue) if sidValue[0:2] == "0x": return int(sidValue, 16) if sidValue.find("+") != -1: tokens = sidValue.split("+") tokens1 = tokens[0].strip() tokens2 = tokens[1].strip() return extractSidValue(tokens1) + extractSidValue(tokens2) rv = extractSidValue(sidNameToValue[sidValue]) sidNameToValue[sidValue] = rv return rv #a = subprocess.Popen("git grep -P '#define\s+(SID_|SC_|DETECTIVE_|DRAWTEXTBAR_|DRAW_BAR_|RID_|OBJBAR_FORMAT_|TAB_POPUP_|DATA_MENU_|EXTRA_MENU_|FORMAT_MENU_|INSERT_MENU_|VIEW_MENU_|EDIT_MENU_|FILE_MENU_|SC_FUNCTION_|RC_)'", stdout=subprocess.PIPE, shell=True) a = subprocess.Popen("git grep -Pn '#define\s+(\S+)' -- *.hrc", stdout=subprocess.PIPE, shell=True) with a.stdout as txt: for line in txt: originalLine = line.strip() # 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 sidName = line[0 : idx1].strip() line = line[idx1 : len(line)].strip() # 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] sidTextValue = line.strip() # ignore the #define strings if (sidTextValue.find("\"") != -1): continue # ignore the multiline macros if (sidTextValue.find("\\") != -1): continue # check for redefinitions if sidName[0:4] == "SID_" and sidNameToValue.has_key(sidName): print "Redefinition:\n\t", sidNameToOriginalLine[sidName], "\n\t" , originalLine else: sidNameToValue[sidName] = sidTextValue sidNameToOriginalLine[sidName] = originalLine # decode the constants into their numeric values recursively sidNamesToIgnore = set() for sidName in sidNameToValue: sidTextValue = sidNameToValue[sidName] try: sidValueNum = extractSidValue(sidTextValue) sidNameToValue[sidName] = sidValueNum except KeyError: sidNamesToIgnore.add(sidName) # check for conflicts sidValueToName = dict() for sidName in sidNameToValue: if sidName in sidNamesToIgnore: continue if sidName[0:4] != "SID_": continue sidValue = sidNameToValue[sidName] if sidValueToName.has_key(sidValue): print "conflict:\n\t", sidNameToOriginalLine[sidName], "\n\t", sidNameToOriginalLine[sidValueToName[sidValue]] else: sidValueToName[sidValue] = sidName