You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.5 KiB
107 lines
2.5 KiB
#!/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(allow_abbrev=False) |
|
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()
|
|
|