#!/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 ] [-f ]...") 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()