2022-09-29 04:35:49 +02:00
|
|
|
#!/usr/bin/env python3
|
2009-07-12 17:01:57 +02:00
|
|
|
#
|
|
|
|
# Check trace components in FreeType 2 source.
|
2020-12-01 08:48:28 +01:00
|
|
|
# Author: suzuki toshiya, 2009, 2013, 2020
|
2009-07-12 17:01:57 +02:00
|
|
|
#
|
|
|
|
# This code is explicitly into the public domain.
|
|
|
|
|
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
import re
|
|
|
|
|
2022-09-29 04:35:49 +02:00
|
|
|
SRC_FILE_LIST = []
|
|
|
|
USED_COMPONENT = {}
|
2009-07-12 17:01:57 +02:00
|
|
|
KNOWN_COMPONENT = {}
|
|
|
|
|
2022-09-29 04:35:49 +02:00
|
|
|
SRC_FILE_DIRS = ["src"]
|
|
|
|
TRACE_DEF_FILES = ["include/freetype/internal/fttrace.h"]
|
|
|
|
|
|
|
|
|
|
|
|
def usage():
|
|
|
|
print("Usage: %s [option]" % sys.argv[0])
|
|
|
|
print("Search used-but-defined and defined-but-not-used trace_XXX macros")
|
|
|
|
print("")
|
|
|
|
print(" --help:")
|
|
|
|
print(" Show this help")
|
|
|
|
print("")
|
|
|
|
print(" --src-dirs=dir1:dir2:...")
|
|
|
|
print(" Specify the directories of C source files to be checked")
|
|
|
|
print(" Default is %s" % ":".join(SRC_FILE_DIRS))
|
|
|
|
print("")
|
|
|
|
print(" --def-files=file1:file2:...")
|
|
|
|
print(" Specify the header files including FT_TRACE_DEF()")
|
|
|
|
print(" Default is %s" % ":".join(TRACE_DEF_FILES))
|
|
|
|
print("")
|
2009-07-12 17:01:57 +02:00
|
|
|
|
|
|
|
|
|
|
|
# --------------------------------------------------------------
|
|
|
|
# Parse command line options
|
|
|
|
#
|
2022-09-29 04:35:49 +02:00
|
|
|
for i in range(1, len(sys.argv)):
|
|
|
|
if sys.argv[i].startswith("--help"):
|
|
|
|
usage()
|
|
|
|
exit(0)
|
|
|
|
if sys.argv[i].startswith("--src-dirs="):
|
|
|
|
SRC_FILE_DIRS = sys.argv[i].replace("--src-dirs=", "", 1).split(":")
|
|
|
|
elif sys.argv[i].startswith("--def-files="):
|
|
|
|
TRACE_DEF_FILES = sys.argv[i].replace("--def-files=", "", 1).split(":")
|
2009-07-12 17:01:57 +02:00
|
|
|
|
|
|
|
# --------------------------------------------------------------
|
|
|
|
# Scan C source and header files using trace macros.
|
|
|
|
#
|
|
|
|
|
2022-09-29 04:35:49 +02:00
|
|
|
c_pathname_pat = re.compile('^.*\.[ch]$', re.IGNORECASE)
|
|
|
|
trace_use_pat = re.compile('^[ \t]*#define[ \t]+FT_COMPONENT[ \t]+')
|
2009-07-12 17:01:57 +02:00
|
|
|
|
|
|
|
for d in SRC_FILE_DIRS:
|
2022-09-29 04:35:49 +02:00
|
|
|
for (p, dlst, flst) in os.walk(d):
|
|
|
|
for f in flst:
|
|
|
|
if c_pathname_pat.match(f) is not None:
|
|
|
|
src_pathname = os.path.join(p, f)
|
|
|
|
|
|
|
|
line_num = 0
|
|
|
|
for src_line in open(src_pathname, 'r'):
|
|
|
|
line_num = line_num + 1
|
|
|
|
src_line = src_line.strip()
|
|
|
|
if trace_use_pat.match(src_line) is not None:
|
|
|
|
component_name = trace_use_pat.sub('', src_line)
|
|
|
|
if component_name in USED_COMPONENT:
|
|
|
|
USED_COMPONENT[component_name]\
|
|
|
|
.append("%s:%d" % (src_pathname, line_num))
|
|
|
|
else:
|
|
|
|
USED_COMPONENT[component_name] =\
|
|
|
|
["%s:%d" % (src_pathname, line_num)]
|
2009-07-12 17:01:57 +02:00
|
|
|
|
|
|
|
# --------------------------------------------------------------
|
|
|
|
# Scan header file(s) defining trace macros.
|
|
|
|
#
|
|
|
|
|
2022-09-29 04:35:49 +02:00
|
|
|
trace_def_pat_opn = re.compile('^.*FT_TRACE_DEF[ \t]*\([ \t]*')
|
|
|
|
trace_def_pat_cls = re.compile('[ \t\)].*$')
|
2009-07-12 17:01:57 +02:00
|
|
|
|
|
|
|
for f in TRACE_DEF_FILES:
|
2022-09-29 04:35:49 +02:00
|
|
|
line_num = 0
|
|
|
|
for hdr_line in open(f, 'r'):
|
|
|
|
line_num = line_num + 1
|
|
|
|
hdr_line = hdr_line.strip()
|
|
|
|
if trace_def_pat_opn.match(hdr_line) is not None:
|
|
|
|
component_name = trace_def_pat_opn.sub('', hdr_line)
|
|
|
|
component_name = trace_def_pat_cls.sub('', component_name)
|
|
|
|
if component_name in KNOWN_COMPONENT:
|
|
|
|
print("trace component %s is defined twice,"
|
|
|
|
" see %s and fttrace.h:%d" %
|
|
|
|
(component_name, KNOWN_COMPONENT[component_name],
|
|
|
|
line_num))
|
|
|
|
else:
|
|
|
|
KNOWN_COMPONENT[component_name] =\
|
|
|
|
"%s:%d" % (os.path.basename(f), line_num)
|
2009-07-12 17:01:57 +02:00
|
|
|
|
|
|
|
# --------------------------------------------------------------
|
|
|
|
# Compare the used and defined trace macros.
|
|
|
|
#
|
|
|
|
|
2022-09-29 04:35:49 +02:00
|
|
|
print("# Trace component used in the implementations but not defined in "
|
|
|
|
"fttrace.h.")
|
|
|
|
cmpnt = list(USED_COMPONENT.keys())
|
2009-07-12 17:01:57 +02:00
|
|
|
cmpnt.sort()
|
|
|
|
for c in cmpnt:
|
2022-09-29 04:35:49 +02:00
|
|
|
if c not in KNOWN_COMPONENT:
|
|
|
|
print("Trace component %s (used in %s) is not defined." %
|
|
|
|
(c, ", ".join(USED_COMPONENT[c])))
|
2009-07-12 17:01:57 +02:00
|
|
|
|
2022-09-29 04:35:49 +02:00
|
|
|
print("# Trace component is defined but not used in the implementations.")
|
|
|
|
cmpnt = list(KNOWN_COMPONENT.keys())
|
2009-07-12 17:01:57 +02:00
|
|
|
cmpnt.sort()
|
|
|
|
for c in cmpnt:
|
2022-09-29 04:35:49 +02:00
|
|
|
if c not in USED_COMPONENT:
|
|
|
|
if c != "any":
|
|
|
|
print("Trace component %s (defined in %s) is not used." %
|
|
|
|
(c, KNOWN_COMPONENT[c]))
|