def main():
    logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
    #Configurator().default()

    if (len(sys.argv) < 2):
        print("Call: %s <output from FindIncludeGuards.sh>" % (sys.argv[0], ))
        exit()

    # TODO move i

    files_to_guards = dict([
        (path_name, guard)
        for (path_name, guard) in csv.reader(open(sys.argv[1]), delimiter=':')
    ])
    #duplicates = CollectionTools.find_duplicates(files_to_guards.itervalues(), lambda x: len(x)==0 or x == '#pragma once')
    duplicates_dict = CollectionTools.find_duplicate_values(
        files_to_guards.iteritems(),
        lambda x: len(x) == 0 or x == '#pragma once')

    correct, pragma_once, missing, irregular, ms_generated, guard = check_include_guards(
        files_to_guards, path_name, guard)

    print(
        "%i correct (%i of which using #pragma once before or without a guard), %i missing guard or malformed structure, %i irregular (%i of which are MS generated)"
        % (correct, pragma_once, missing, irregular, ms_generated))
    #print("%i duplicates: %s" % (len(duplicates), ",".join(duplicates)))
    print("%i duplicates" % (len(duplicates_dict)))
    for guard in sorted(duplicates_dict.keys()):
        print("%s:%s" % (guard, ",".join(sorted(duplicates_dict[guard]))))
def determine_duplicates():
    header_to_module_map = config_file_to_module_map_supply(
    ).get_module_to_header_file_map()
    duplicates = CollectionTools.find_duplicate_values(header_to_module_map)
    return duplicates