# -*- Python -*- vim: set syntax=python tabstop=4 expandtab cc=80:
#===----------------------------------------------------------------------===##
#
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
#===----------------------------------------------------------------------===##
"""
match - A set of functions for matching symbols in a list to a list of regexs
"""

import re


def find_and_report_matching(symbol_list, regex_list):
    report = ''
    found_count = 0
    for regex_str in regex_list:
        report += 'Matching regex "%s":\n' % regex_str
        matching_list = find_matching_symbols(symbol_list, regex_str)
        if not matching_list:
            report += '    No matches found\n\n'
            continue
        # else
        found_count += len(matching_list)
        for m in matching_list:
            report += '    MATCHES: %s\n' % m['name']
        report += '\n'
    return found_count, report


def find_matching_symbols(symbol_list, regex_str):
    regex = re.compile(regex_str)
    matching_list = []
    for s in symbol_list:
        if regex.match(s['name']):
            matching_list += [s]
    return matching_list
