alsk/scripts/display_skeleton
2021-05-10 18:14:13 +02:00

100 lines
1.7 KiB
Python
Executable File

#!/usr/bin/env python3
import sys
import getopt
import re
matching = {'<': '>', '(': ')'}
def find_matching(block):
o = block[0]
c = matching[block[0]]
i = 1
d = 1
while d != 0:
if block[i] == o:
d = d + 1
elif block[i] == c:
d = d - 1
i = i + 1
return i
def help(argv):
cmd=argv[0]
print(f"{cmd} [-h] [-l <limit>] [-f <filter>]...")
def cli(argv):
filters = []
limit = 64
substs = {
'std::mersenne_twister_engine<[^>]*>': 'RNG',
}
try:
opts, args = getopt.getopt(argv[1:], "hf:l:", ["limit=", "filter="])
except getopt.GetoptError:
help(argv)
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
help(argv)
sys.exit()
elif opt in ("-f", "--filter"):
filters.append(arg)
elif opt in ("-l", "--limit"):
limit = int(arg)
return [filters, limit, substs]
def process(limit, line, d = 0):
i = 0
print(" "*d, end='')
while i < len(line):
c = line[i]
if c == '(':
trail = line[i:]
e = find_matching(trail)
print(trail[:e], end='')
i = i + e - 1
elif c == '<':
trail = line[i:]
e = find_matching(trail)
if e > limit:
print("<")
process(limit, trail[1:e-1], d+1)
print("\n"+" "*d+">", end='')
else:
print(trail[:e], end='')
i = i + e - 1
elif c == ',':
print(c)
print(" "*d, end='')
elif c != ' ':
print(c, end='')
i = i + 1
def applyReplaces(line, substs):
for fr, to in substs.items():
line = re.sub(fr, to, line)
return line
[filters, limit, substs] = cli(sys.argv)
lines = sys.stdin.readlines()
lines = [item.rstrip() for item in lines if item != "\n"]
data = "".join(lines)
data = applyReplaces(data, substs)
for f in filters:
data = data.replace(f, "")
process(limit, data)
print()