#!/usr/bin/env python3.8
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import os
import re
import sys


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '--headers',
        help='The list of header files to check',
        default=[],
        nargs='*')
    parser.add_argument(
        '--stamp',
        help='The path to the stamp file in case of success',
        required=True)
    args = parser.parse_args()

    has_errors = False

    matcher = re.compile(r'^#pragma once')
    for header in args.headers:
        with open(header, 'r') as header_file:
            for line in header_file.readlines():
                if matcher.match(line):
                    print('Error: pragma disallowed in SDK: %s' % header)
                    has_errors = True
    if has_errors:
        return 1

    with open(args.stamp, 'w') as stamp_file:
        stamp_file.write('Success!')
    return 0


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