summaryrefslogtreecommitdiffhomepage
path: root/src/singleheader.py
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2023-02-04 23:35:56 +0100
committerGitHub <[email protected]>2023-02-04 23:35:56 +0100
commitadc47cefc2976768c3f0b773bd26bfd1062e8a53 (patch)
tree4923f88afb0d091d5d39ae03d65a4998a0517652 /src/singleheader.py
parent0c4c4f8bba17562735b67b2923cd23c773aa53a7 (diff)
parentd2ff84c53aa9bd3857fdf22dcf7cd9398a4780be (diff)
downloadSTC-modified-adc47cefc2976768c3f0b773bd26bfd1062e8a53.tar.gz
STC-modified-adc47cefc2976768c3f0b773bd26bfd1062e8a53.zip
Merge pull request #46 from tylov/newinit
Version 4.1 RC2: signed sizes and indices, cspan with numpy slicing.
Diffstat (limited to 'src/singleheader.py')
-rw-r--r--src/singleheader.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/singleheader.py b/src/singleheader.py
new file mode 100644
index 00000000..f5272cfb
--- /dev/null
+++ b/src/singleheader.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python3
+
+import re
+import sys
+import os
+from os.path import dirname, join as path_join, abspath, basename, exists
+
+extra_paths = [path_join(dirname(abspath(__file__)), "include")]
+
+
+def find_file(included_name, current_file):
+ current_dir = dirname(abspath(current_file))
+ for idir in [current_dir] + extra_paths:
+ try_path = path_join(idir, included_name)
+ if exists(try_path):
+ return try_path
+ return None
+
+
+def process_file(
+ file_path,
+ out_lines=[],
+ processed_files=[],
+):
+ out_lines += "// ### BEGIN_FILE_INCLUDE: " + basename(file_path) + '\n'
+ comment_block = False
+ with open(file_path, "r") as f:
+ for line in f:
+ is_comment = comment_block
+ if re.search('/\*.*?\*/', line):
+ pass
+ elif re.search('^\\s*/\*', line):
+ comment_block, is_comment = True, True
+ elif re.search('\*/', line):
+ comment_block = False
+
+ if is_comment:
+ continue
+
+ m_inc = re.search('^\\s*# *include\\s*[<"](.+)[>"]', line) if not is_comment else False
+ if m_inc:
+ inc_name = m_inc.group(1)
+ inc_path = find_file(inc_name, file_path)
+ if inc_path not in processed_files:
+ if inc_path is not None:
+ processed_files += [inc_path]
+ process_file(
+ inc_path,
+ out_lines,
+ processed_files,
+ )
+ else:
+ # assume it's a system header
+ out_lines += [line]
+ continue
+ m_once = re.match('^\\s*# *pragma once\\s*', line) if not is_comment else False
+ # ignore pragma once; we're handling it here
+ if m_once:
+ continue
+ # otherwise, just add the line to the output
+ if line[-1] != '\n':
+ line += '\n'
+ out_lines += [line]
+ out_lines += "// ### END_FILE_INCLUDE: " + basename(file_path) + '\n'
+ return (
+ "".join(out_lines)
+ )
+
+
+if __name__ == "__main__":
+ print(
+ process_file(
+ abspath(sys.argv[1]),
+ [],
+ # We use an include guard instead of `#pragma once` because Godbolt will
+ # cause complaints about `#pragma once` when they are used in URL includes.
+ [abspath(sys.argv[1])],
+ )
+ )