libc: minimal: add strerror and strerror_r function
Add simple strerror() and strerror_r() implementations.
Fixes #46099
Signed-off-by: Christopher Friedt <cfriedt@fb.com>
diff --git a/scripts/gen_strerror_table.py b/scripts/gen_strerror_table.py
new file mode 100755
index 0000000..4e04d79
--- /dev/null
+++ b/scripts/gen_strerror_table.py
@@ -0,0 +1,107 @@
+#!/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()