#!/usr/bin/env python
#===----------------------------------------------------------------------===##
#
#                     The LLVM Compiler Infrastructure
#
# This file is dual licensed under the MIT and the University of Illinois Open
# Source Licenses. See LICENSE.TXT for details.
#
#===----------------------------------------------------------------------===##

"""
sym_match - Match all symbols in a list against a list of regexes.
"""
from argparse import ArgumentParser
import sys
from sym_check import util, match, extract


def main():
    parser = ArgumentParser(
        description='Extract a list of symbols from a shared library.')
    parser.add_argument(
        '--blacklist', dest='blacklist',
        type=str, action='store', default=None)
    parser.add_argument(
        'symbol_list', metavar='symbol_list', type=str,
        help='The file containing the old symbol list')
    parser.add_argument(
        'regexes', metavar='regexes', default=[], nargs='*',
        help='The file containing the new symbol list or a library')
    args = parser.parse_args()

    if not args.regexes and args.blacklist is None:
        sys.stderr.write('Either a regex or a blacklist must be specified.\n')
        sys.exit(1)
    if args.blacklist:
        search_list = util.read_blacklist(args.blacklist)
    else:
        search_list = args.regexes

    symbol_list = util.extract_or_load(args.symbol_list)

    matching_count, report = match.find_and_report_matching(
        symbol_list, search_list)
    sys.stdout.write(report)
    if matching_count != 0:
        print('%d matching symbols found...' % matching_count)


if __name__ == '__main__':
    main()
