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

131
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):
def locate_file(file_name, search_dirs, base_directory=None):
cur_dir = base_directory or os.path.dirname(sys.argv[0])
initial_path = os.path.join(cur_dir, file_name)
if os.path.isfile(initial_path):
return initial_path
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) in_time = os.path.getmtime(in_file)
out_time = os.path.getmtime(h_out) out_time = os.path.getmtime(h_out)
do_split = in_time > out_time do_split = in_time > out_time
if do_split: if do_split:
with open(in_file) as f: with open(in_file) as f:
lines = f.readlines() lines = f.readlines()
python_version = sys.version_info[0] python_version = sys.version_info[0]
if python_version < 3: if python_version < 3:
os.makedirs(args.out) os.makedirs(out)
else: else:
os.makedirs(args.out, exist_ok=True) os.makedirs(out, exist_ok=True)
in_implementation = False in_implementation = False
cc_out = args.out + source_name with open(h_out, "w") as fh, open(cc_out, "w") as fc:
with open(h_out, 'w') as fh, open(cc_out, 'w') as fc: fc.write('#include "{}"\n'.format(header_name))
fc.write('#include "httplib.h"\n') fc.write("namespace httplib {\n")
fc.write('namespace httplib {\n')
for line in lines: for line in lines:
is_border_line = border in line is_border_line = BORDER in line
if is_border_line: if is_border_line:
in_implementation = not in_implementation in_implementation = not in_implementation
elif in_implementation: elif in_implementation:
fc.write(line.replace('inline ', '')) fc.write(INLINE_RE.sub("", line))
else: else:
fh.write(line) fh.write(line)
fc.write('} // namespace httplib\n') fc.write("} // namespace httplib\n")
print("Wrote {} and {}".format(h_out, cc_out)) print("Wrote {} and {}".format(h_out, cc_out))
else: else:
print("{} and {} are up to date".format(h_out, cc_out)) print("{} and {} are up to date".format(h_out, cc_out))
def main():
import argparse
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()