#!/usr/bin/env python
#===----------------------------------------------------------------------===##
#
# 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
#
#===----------------------------------------------------------------------===##
"""
sym_diff - Compare two symbol lists and output the differences.
"""

from argparse import ArgumentParser
import sys
from libcxx.sym_check import diff, util


def main():
    parser = ArgumentParser(
        description='Extract a list of symbols from a shared library.')
    parser.add_argument(
        '--names-only', dest='names_only',
        help='Only print symbol names',
        action='store_true', default=False)
    parser.add_argument(
        '--removed-only', dest='removed_only',
        help='Only print removed symbols',
        action='store_true', default=False)
    parser.add_argument('--only-stdlib-symbols', dest='only_stdlib',
                        help="Filter all symbols not related to the stdlib",
                        action='store_true', default=False)
    parser.add_argument('--strict', dest='strict',
                        help="Exit with a non-zero status if any symbols "
                             "differ",
                        action='store_true', default=False)
    parser.add_argument(
        '-o', '--output', dest='output',
        help='The output file. stdout is used if not given',
        type=str, action='store', default=None)
    parser.add_argument(
        '--demangle', dest='demangle', action='store_true', default=False)
    parser.add_argument(
        'old_syms', metavar='old-syms', type=str,
        help='The file containing the old symbol list or a library')
    parser.add_argument(
        'new_syms', metavar='new-syms', type=str,
        help='The file containing the new symbol list or a library')
    args = parser.parse_args()

    old_syms_list = util.extract_or_load(args.old_syms)
    new_syms_list = util.extract_or_load(args.new_syms)

    if args.only_stdlib:
        old_syms_list, _ = util.filter_stdlib_symbols(old_syms_list)
        new_syms_list, _ = util.filter_stdlib_symbols(new_syms_list)

    added, removed, changed = diff.diff(old_syms_list, new_syms_list)
    if args.removed_only:
        added = {}
    report, is_break, is_different = diff.report_diff(
        added, removed, changed, names_only=args.names_only,
        demangle=args.demangle)
    if args.output is None:
        print(report)
    else:
        with open(args.output, 'w') as f:
            f.write(report + '\n')
    exit_code = 1 if is_break or (args.strict and is_different) else 0
    sys.exit(exit_code)

if __name__ == '__main__':
    main()
