#!/usr/bin/env python3
#
# Copyright (c) 2022 Meta
#
# SPDX-License-Identifier: Apache-2.0

import argparse
import os
import re


def front_matter(sys_nerr):
    return f'''
/*
 * This file generated by {__file__}
 */

#include <errno.h>
#include <stdint.h>
#include <string.h>

#include <zephyr/sys/util.h>

#define sys_nerr {sys_nerr}'''


def gen_strerror_table(input, output):
    with open(input, 'r') as inf:

        highest_errno = 0
        symbols = []
        msgs = {}

        for line in inf.readlines():
            # Select items of the form below (note: ERRNO is numeric)
            # #define SYMBOL ERRNO /**< MSG */
            pat = r'^#define[\s]+(E[A-Z_]*)[\s]+([1-9][0-9]*)[\s]+/\*\*<[\s]+(.*)[\s]+\*/[\s]*$'
            match = re.match(pat, line)

            if not match:
                continue

            symbol = match[1]
            errno = int(match[2])
            msg = match[3]

            symbols.append(symbol)
            msgs[symbol] = msg

            highest_errno = max(int(errno), highest_errno)

        try:
            os.makedirs(os.path.dirname(output))
        except BaseException:
            # directory already present
            pass

        with open(output, 'w') as outf:

            print(front_matter(highest_errno + 1), file=outf)

            # Generate string table
            print(
                f'static const char *const sys_errlist[sys_nerr] = {{', file=outf)
            print('[0] = "Success",', file=outf)
            for symbol in symbols:
                print(f'[{symbol}] = "{msgs[symbol]}",', file=outf)

            print('};', file=outf)

            # Generate string lengths (includes trailing '\0')
            print(
                f'static const uint8_t sys_errlen[sys_nerr] = {{', file=outf)
            print('[0] = 8,', file=outf)
            for symbol in symbols:
                print(f'[{symbol}] = {len(msgs[symbol]) + 1},', file=outf)

            print('};', file=outf)


def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-i',
        '--input',
        dest='input',
        required=True,
        help='input file (e.g. lib/libc/minimal/include/errno.h)')
    parser.add_argument(
        '-o',
        '--output',
        dest='output',
        required=True,
        help='output file (e.g. build/zephyr/misc/generated/libc/minimal/strerror_table.h)')

    args = parser.parse_args()

    return args


def main():
    args = parse_args()
    gen_strerror_table(args.input, args.output)


if __name__ == '__main__':
    main()
