blob: b60b23237dc6399da3c89bb2a36cb2fd27ee0a0b [file] [log] [blame]
Yong Cong Sin335acf82023-07-11 01:14:25 +08001#!/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()