#!/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 #include #include #include #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()