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

from argparse import ArgumentParser
import sys

def print_and_exit(msg):
    sys.stderr.write(msg + '\n')
    sys.exit(1)

def main():
    parser = ArgumentParser(
        description="Concatenate two files into a single file")
    parser.add_argument(
        '-o', '--output', dest='output', required=True,
        help='The output file. stdout is used if not given',
        type=str, action='store')
    parser.add_argument(
        'files', metavar='files',  nargs='+',
        help='The files to concatenate')

    args = parser.parse_args()

    if len(args.files) < 2:
        print_and_exit('fewer than 2 inputs provided')
    data = ''
    for filename in args.files:
        with open(filename, 'r') as f:
            data += f.read()
        if len(data) != 0 and data[-1] != '\n':
            data += '\n'
    assert len(data) > 0 and "cannot cat empty files"
    with open(args.output, 'w') as f:
        f.write(data)


if __name__ == '__main__':
    main()
    sys.exit(0)
