summaryrefslogtreecommitdiff
path: root/Tools/c-analyzer/c_common/strutil.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/c-analyzer/c_common/strutil.py')
-rw-r--r--Tools/c-analyzer/c_common/strutil.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/Tools/c-analyzer/c_common/strutil.py b/Tools/c-analyzer/c_common/strutil.py
new file mode 100644
index 0000000000..e7535d45bb
--- /dev/null
+++ b/Tools/c-analyzer/c_common/strutil.py
@@ -0,0 +1,42 @@
+import logging
+
+
+logger = logging.getLogger(__name__)
+
+
+def unrepr(value):
+ raise NotImplementedError
+
+
+def parse_entries(entries, *, ignoresep=None):
+ for entry in entries:
+ if ignoresep and ignoresep in entry:
+ subentries = [entry]
+ else:
+ subentries = entry.strip().replace(',', ' ').split()
+ for item in subentries:
+ if item.startswith('+'):
+ filename = item[1:]
+ try:
+ infile = open(filename)
+ except FileNotFoundError:
+ logger.debug(f'ignored in parse_entries(): +{filename}')
+ return
+ with infile:
+ # We read the entire file here to ensure the file
+ # gets closed sooner rather than later. Note that
+ # the file would stay open if this iterator is never
+ # exchausted.
+ lines = infile.read().splitlines()
+ for line in _iter_significant_lines(lines):
+ yield line, filename
+ else:
+ yield item, None
+
+
+def _iter_significant_lines(lines):
+ for line in lines:
+ line = line.partition('#')[0]
+ if not line.strip():
+ continue
+ yield line