100 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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()
 |