196 lines
7.5 KiB
Diff
196 lines
7.5 KiB
Diff
From e231110a641237817490785bdf3e96df1de524e2 Mon Sep 17 00:00:00 2001
|
|
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
|
Date: Thu, 12 Dec 2024 10:01:48 +0900
|
|
Subject: [PATCH] test: modernize generate-sym-test.py
|
|
|
|
(cherry picked from commit 6e399ece1fd6dc8cbf5830c263a118b58d36acac)
|
|
---
|
|
src/test/generate-sym-test.py | 107 +++++++++++++++++++++-------------
|
|
1 file changed, 67 insertions(+), 40 deletions(-)
|
|
|
|
diff --git a/src/test/generate-sym-test.py b/src/test/generate-sym-test.py
|
|
index 2e5177c934..24223aa7b0 100755
|
|
--- a/src/test/generate-sym-test.py
|
|
+++ b/src/test/generate-sym-test.py
|
|
@@ -1,78 +1,99 @@
|
|
#!/usr/bin/env python3
|
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
|
+#
|
|
+# ruff: noqa: E501 UP015
|
|
|
|
import os
|
|
import re
|
|
import sys
|
|
+from typing import IO
|
|
|
|
-def process_sym_file(file):
|
|
+
|
|
+def process_sym_file(file: IO[str]) -> None:
|
|
for line in file:
|
|
m = re.search(r'^ +([a-zA-Z0-9_]+);', line)
|
|
if m:
|
|
if m[1] == 'sd_bus_object_vtable_format':
|
|
- print(' {{"{0}", &{0}}},'.format(m[1]))
|
|
+ print(f' {{ "{m[1]}", &{m[1]} }},')
|
|
else:
|
|
- print(' {{"{0}", {0}}},'.format(m[1]))
|
|
+ print(f' {{ "{m[1]}", {m[1]} }},')
|
|
+
|
|
|
|
-def process_source_file(file):
|
|
+def process_source_file(file: IO[str]) -> None:
|
|
for line in file:
|
|
# Functions
|
|
m = re.search(r'^_public_\s+(\S+\s+)+\**(\w+)\s*\(', line)
|
|
if m:
|
|
- print(' {{ "{0}", {0} }},'.format(m[2]))
|
|
+ print(f' {{ "{m[2]}", {m[2]} }},')
|
|
+ continue
|
|
+
|
|
# Variables
|
|
m = re.search(r'^_public_\s+(\S+\s+)+\**(\w+)\s*=', line)
|
|
if m:
|
|
- print(' {{ "{0}", &{0} }},'.format(m[2]))
|
|
+ print(f' {{ "{m[2]}", &{m[2]} }},')
|
|
+ continue
|
|
+
|
|
# Functions defined through a macro
|
|
m = re.search(r'^DEFINE_PUBLIC_TRIVIAL_REF_FUNC\([^,]+,\s*(\w+)\s*\)', line)
|
|
if m:
|
|
- print(' {{ "{0}_ref", {0}_ref }},'.format(m[1]))
|
|
+ print(f' {{ "{m[1]}_ref", {m[1]}_ref }},')
|
|
+ continue
|
|
+
|
|
m = re.search(r'^DEFINE_PUBLIC_TRIVIAL_UNREF_FUNC\([^,]+,\s*(\w+)\s*,', line)
|
|
if m:
|
|
- print(' {{ "{0}_unref", {0}_unref }},'.format(m[1]))
|
|
- m = re.search(r"^DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC\([^,]+,\s*(\w+)\s*,", line)
|
|
+ print(f' {{ "{m[1]}_unref", {m[1]}_unref }},')
|
|
+ continue
|
|
+
|
|
+ m = re.search(r'^DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC\([^,]+,\s*(\w+)\s*,', line)
|
|
+ if m:
|
|
+ print(f' {{ "{m[1]}_ref", {m[1]}_ref }},')
|
|
+ print(f' {{ "{m[1]}_unref", {m[1]}_unref }},')
|
|
+ continue
|
|
+
|
|
+ m = re.search(r'^_DEFINE_STRING_TABLE_LOOKUP\((\w+),\s*\w+,\s*_public_\s*\)', line)
|
|
if m:
|
|
- print(' {{ "{0}_ref", {0}_ref }},'.format(m[1]))
|
|
- print(' {{ "{0}_unref", {0}_unref }},'.format(m[1]))
|
|
+ print(f' {{ "{m[1]}_from_string", {m[1]}_from_string }},')
|
|
+ print(f' {{ "{m[1]}_to_string", {m[1]}_to_string }},')
|
|
+ continue
|
|
|
|
-print('''/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
+
|
|
+print("""/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
-''')
|
|
+""")
|
|
|
|
for header in sys.argv[3:]:
|
|
print('#include "{}"'.format(header.split('/')[-1]))
|
|
|
|
-print('''
|
|
+print("""
|
|
/* We want to check deprecated symbols too, without complaining */
|
|
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
|
-''')
|
|
+""")
|
|
|
|
-print('''
|
|
+print("""
|
|
struct symbol {
|
|
const char *name;
|
|
const void *symbol;
|
|
};
|
|
-static struct symbol symbols_from_sym[] = {''')
|
|
+static struct symbol symbols_from_sym[] = {""")
|
|
|
|
-with open(sys.argv[1], "r") as f:
|
|
+with open(sys.argv[1], 'r') as f:
|
|
process_sym_file(f)
|
|
|
|
-print(''' {}
|
|
-}, symbols_from_source[] = {''')
|
|
+print(""" {}
|
|
+}, symbols_from_source[] = {""")
|
|
|
|
for dirpath, _, filenames in sorted(os.walk(sys.argv[2])):
|
|
for filename in sorted(filenames):
|
|
- if not filename.endswith(".c") and not filename.endswith(".h"):
|
|
+ if not filename.endswith('.c') and not filename.endswith('.h'):
|
|
continue
|
|
- with open(os.path.join(dirpath, filename), "r") as f:
|
|
+ with open(os.path.join(dirpath, filename), 'r') as f:
|
|
process_source_file(f)
|
|
|
|
-print(''' {}
|
|
+print(""" {}
|
|
};
|
|
|
|
static int sort_callback(const void *a, const void *b) {
|
|
@@ -81,34 +102,40 @@ static int sort_callback(const void *a, const void *b) {
|
|
}
|
|
|
|
int main(void) {
|
|
- size_t i, j;
|
|
+ size_t size = sizeof(symbols_from_sym[0]),
|
|
+ n_sym = sizeof(symbols_from_sym)/sizeof(symbols_from_sym[0]) - 1,
|
|
+ n_source = sizeof(symbols_from_source)/sizeof(symbols_from_source[0]) - 1;
|
|
|
|
- qsort(symbols_from_sym, sizeof(symbols_from_sym)/sizeof(symbols_from_sym[0])-1, sizeof(symbols_from_sym[0]), sort_callback);
|
|
- qsort(symbols_from_source, sizeof(symbols_from_source)/sizeof(symbols_from_source[0])-1, sizeof(symbols_from_source[0]), sort_callback);
|
|
+ qsort(symbols_from_sym, n_sym, size, sort_callback);
|
|
+ qsort(symbols_from_source, n_source, size, sort_callback);
|
|
|
|
puts("From symbol file:");
|
|
- for (i = 0; symbols_from_sym[i].name; i++)
|
|
+ for (size_t i = 0; i < n_sym; i++)
|
|
printf("%p: %s\\n", symbols_from_sym[i].symbol, symbols_from_sym[i].name);
|
|
|
|
puts("\\nFrom source files:");
|
|
- for (j = 0; symbols_from_source[j].name; j++)
|
|
- printf("%p: %s\\n", symbols_from_source[j].symbol, symbols_from_source[j].name);
|
|
+ for (size_t i = 0; i < n_source; i++)
|
|
+ printf("%p: %s\\n", symbols_from_source[i].symbol, symbols_from_source[i].name);
|
|
|
|
puts("");
|
|
- printf("Found %zu symbols from symbol file.\\n", i);
|
|
- printf("Found %zu symbols from source files.\\n", j);
|
|
+ printf("Found %zu symbols from symbol file.\\n", n_sym);
|
|
+ printf("Found %zu symbols from source files.\\n", n_source);
|
|
+
|
|
+ unsigned n_error = 0;
|
|
|
|
- for (i = 0; symbols_from_sym[i].name; i++) {
|
|
- struct symbol *n = bsearch(symbols_from_sym+i, symbols_from_source, sizeof(symbols_from_source)/sizeof(symbols_from_source[0])-1, sizeof(symbols_from_source[0]), sort_callback);
|
|
- if (!n)
|
|
+ for (size_t i = 0; i < n_sym; i++) {
|
|
+ if (!bsearch(symbols_from_sym+i, symbols_from_source, n_source, size, sort_callback)) {
|
|
printf("Found in symbol file, but not in sources: %s\\n", symbols_from_sym[i].name);
|
|
+ n_error++;
|
|
+ }
|
|
}
|
|
|
|
- for (j = 0; symbols_from_source[j].name; j++) {
|
|
- struct symbol *n = bsearch(symbols_from_source+j, symbols_from_sym, sizeof(symbols_from_sym)/sizeof(symbols_from_sym[0])-1, sizeof(symbols_from_sym[0]), sort_callback);
|
|
- if (!n)
|
|
- printf("Found in sources, but not in symbol file: %s\\n", symbols_from_source[j].name);
|
|
+ for (size_t i = 0; i < n_source; i++) {
|
|
+ if (!bsearch(symbols_from_source+i, symbols_from_sym, n_sym, size, sort_callback)) {
|
|
+ printf("Found in source file, but not in symbol file: %s\\n", symbols_from_source[i].name);
|
|
+ n_error++;
|
|
+ }
|
|
}
|
|
|
|
- return i == j ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
-}''')
|
|
+ return n_error == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
+}""")
|