#!/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
#
#===----------------------------------------------------------------------===##

import argparse
import io
import libcxx.sym_check.extract
import libcxx.sym_check.util
import pprint
import sys

def OutputFile(file):
    if isinstance(file, io.IOBase):
        return file
    assert isinstance(file, str), "Got object {} which is not a str".format(file)
    return open(file, 'w', newline='\n')

def main(argv):
    parser = argparse.ArgumentParser(
        description='Extract a list of symbols from a shared library.')
    parser.add_argument('library', metavar='LIB', type=str,
        help='The library to extract symbols from.')
    parser.add_argument('-o', '--output', dest='output', type=OutputFile, default=sys.stdout,
        help='The output file to write the symbols to. It is overwritten if it already exists. '
             'If no file is specified, the results are written to standard output.')
    args = parser.parse_args(argv)

    symbols = libcxx.sym_check.extract.extract_symbols(args.library)
    symbols, _ = libcxx.sym_check.util.filter_stdlib_symbols(symbols)

    lines = [pprint.pformat(sym, width=99999) for sym in symbols]
    args.output.writelines('\n'.join(sorted(lines)))

if __name__ == '__main__':
    main(sys.argv[1:])
