1#!/usr/bin/env python3
2#
3# Copyright (c) 2023 Meta
4#
5# SPDX-License-Identifier: Apache-2.0
6
7import argparse
8import os
9import re
10
11
12def front_matter():
13    return f'''
14/*
15 * This file is generated by {__file__}
16 */
17
18#include <zephyr/posix/signal.h>
19'''
20
21
22def gen_strsignal_table(input, output):
23    with open(input, 'r') as inf:
24
25        highest_signo = 0
26        symbols = []
27        msgs = {}
28
29        for line in inf.readlines():
30            # Select items of the form below (note: SIGNO is numeric)
31            # #define SYMBOL SIGNO /**< MSG */
32            pat = r'^#define[\s]+(SIG[A-Z_]*)[\s]+([1-9][0-9]*)[\s]+/\*\*<[\s]+(.*)[\s]+\*/[\s]*$'
33            match = re.match(pat, line)
34
35            if not match:
36                continue
37
38            symbol = match[1]
39            signo = int(match[2])
40            msg = match[3]
41
42            symbols.append(symbol)
43            msgs[symbol] = msg
44
45            highest_signo = max(int(signo), highest_signo)
46
47        try:
48            os.makedirs(os.path.dirname(output))
49        except BaseException:
50            # directory already present
51            pass
52
53        with open(output, 'w') as outf:
54
55            print(front_matter(), file=outf)
56
57            # Generate string table
58            print(
59                f'static const char *const strsignal_list[{highest_signo + 1}] = {{', file=outf)
60            for symbol in symbols:
61                print(f'\t[{symbol}] = "{msgs[symbol]}",', file=outf)
62
63            print('};', file=outf)
64
65
66def parse_args():
67    parser = argparse.ArgumentParser(allow_abbrev=False)
68    parser.add_argument(
69        '-i',
70        '--input',
71        dest='input',
72        required=True,
73        help='input file (e.g. include/zephyr/posix/signal.h)')
74    parser.add_argument(
75        '-o',
76        '--output',
77        dest='output',
78        required=True,
79        help='output file (e.g. build/zephyr/misc/generated/lib/posix/strsignal_table.h)')
80
81    args = parser.parse_args()
82
83    return args
84
85
86def main():
87    args = parse_args()
88    gen_strsignal_table(args.input, args.output)
89
90
91if __name__ == '__main__':
92    main()
93