]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test: modernize generate-sym-test.py
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 12 Dec 2024 01:01:48 +0000 (10:01 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 12 Dec 2024 06:03:36 +0000 (15:03 +0900)
src/test/generate-sym-test.py

index 2e5177c9340e471167c8224f0b78c348ca1212e7..24223aa7b0380877adc3d7a91c58b0b7085c0f1f 100755 (executable)
@@ -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;
+}""")