This commit is contained in:
Florian Albrechtskirchinger 2025-02-22 02:49:00 +00:00 committed by GitHub
commit ecd7403afa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

163
split.py
View File

@ -2,66 +2,127 @@
"""This script splits httplib.h into .h and .cc parts.""" """This script splits httplib.h into .h and .cc parts."""
import argparse
import os import os
import re
import sys import sys
border = '// ----------------------------------------------------------------------------' BORDER = (
"// ----------------------------------------------------------------------------"
args_parser = argparse.ArgumentParser(description=__doc__)
args_parser.add_argument(
"-e", "--extension", help="extension of the implementation file (default: cc)",
default="cc"
) )
args_parser.add_argument( INLINE_RE = re.compile(r"inline(?! namespace) ")
"-o", "--out", help="where to write the files (default: out)", default="out"
)
args = args_parser.parse_args()
cur_dir = os.path.dirname(sys.argv[0])
lib_name = 'httplib'
header_name = '/' + lib_name + '.h'
source_name = '/' + lib_name + '.' + args.extension
# get the input file
in_file = cur_dir + header_name
# get the output file
h_out = args.out + header_name
cc_out = args.out + source_name
# if the modification time of the out file is after the in file, def walk_dir(file_name, directory):
# don't split (as it is already finished) for root, subdirs, files in os.walk(directory):
do_split = True if file_name in files:
return os.path.join(root, file_name)
for subdir in subdirs:
return walk_dir(file_name, os.path.join(root, subdir))
if os.path.exists(h_out):
in_time = os.path.getmtime(in_file)
out_time = os.path.getmtime(h_out)
do_split = in_time > out_time
if do_split: def locate_file(file_name, search_dirs, base_directory=None):
with open(in_file) as f: cur_dir = base_directory or os.path.dirname(sys.argv[0])
lines = f.readlines() initial_path = os.path.join(cur_dir, file_name)
python_version = sys.version_info[0] if os.path.isfile(initial_path):
if python_version < 3: return initial_path
os.makedirs(args.out)
for directory in search_dirs:
result = walk_dir(file_name, os.path.join(cur_dir, directory))
if result:
return result
return None
def split(lib_name, search_dirs=[], extension="cc", out="out", base_directory=None):
header_name = lib_name + ".h"
source_name = lib_name + "." + extension
in_file = locate_file(header_name, search_dirs, base_directory)
if not in_file:
print("File not found: {}".format(header_name))
return
h_out = os.path.join(out, header_name)
cc_out = os.path.join(out, source_name)
# if the modification time of the out file is after the in file,
# don't split (as it is already finished)
do_split = True
if os.path.exists(h_out):
in_time = os.path.getmtime(in_file)
out_time = os.path.getmtime(h_out)
do_split = in_time > out_time
if do_split:
with open(in_file) as f:
lines = f.readlines()
python_version = sys.version_info[0]
if python_version < 3:
os.makedirs(out)
else:
os.makedirs(out, exist_ok=True)
in_implementation = False
with open(h_out, "w") as fh, open(cc_out, "w") as fc:
fc.write('#include "{}"\n'.format(header_name))
fc.write("namespace httplib {\n")
for line in lines:
is_border_line = BORDER in line
if is_border_line:
in_implementation = not in_implementation
elif in_implementation:
fc.write(INLINE_RE.sub("", line))
else:
fh.write(line)
fc.write("} // namespace httplib\n")
print("Wrote {} and {}".format(h_out, cc_out))
else: else:
os.makedirs(args.out, exist_ok=True) print("{} and {} are up to date".format(h_out, cc_out))
in_implementation = False
cc_out = args.out + source_name
with open(h_out, 'w') as fh, open(cc_out, 'w') as fc:
fc.write('#include "httplib.h"\n')
fc.write('namespace httplib {\n')
for line in lines:
is_border_line = border in line
if is_border_line:
in_implementation = not in_implementation
elif in_implementation:
fc.write(line.replace('inline ', ''))
else:
fh.write(line)
fc.write('} // namespace httplib\n')
print("Wrote {} and {}".format(h_out, cc_out)) def main():
else: import argparse
print("{} and {} are up to date".format(h_out, cc_out))
args_parser = argparse.ArgumentParser(description=__doc__)
args_parser.add_argument(
"-e",
"--extension",
help="extension of the implementation file (default: cc)",
default="cc",
)
args_parser.add_argument(
"-o", "--out", help="where to write the files (default: out)", default="out"
)
args_parser.add_argument(
"-l",
"--library",
action="append",
dest="libraries",
help="the libraries to split (default: [httplib])",
)
args_parser.add_argument(
"-b",
"--base-directory",
help="where to look for files (default: <script directory>)",
)
args = args_parser.parse_args()
default_libraries = ["httplib"]
search_dirs = ["example"]
for lib_name in args.libraries or default_libraries:
split(
lib_name,
search_dirs,
args.extension,
args.out,
args.base_directory,
)
if __name__ == "__main__":
main()