Skip to content

Instantly share code, notes, and snippets.

@TheJJ
Created August 21, 2017 02:34
Show Gist options
  • Save TheJJ/d5072e8b3718a1421a4a1f8f31872124 to your computer and use it in GitHub Desktop.
Save TheJJ/d5072e8b3718a1421a4a1f8f31872124 to your computer and use it in GitHub Desktop.
c++ template error message decoder and colorizer
#!/usr/bin/env python3
"""
C++ template error message decoder and colorizer.
Copyright (C) 2017 Jonas Jelten <jj@stusta.net>
Licensed under GNU GPLv3 or later.
"""
import argparse
import sys
def main():
"""
Decode and colorize template error messages.
It can surely be improved, but it was written while in rage.
"""
cmd = argparse.ArgumentParser()
cmd.add_argument("-c", "--no-color", action="store_true",
help="don't colorize output")
args = cmd.parse_args()
print("pls giev template data on stdin...")
data = []
while True:
read = sys.stdin.buffer.read()
if not read:
break
data.append(read)
indent_per_level = 4
indent = 0
in_quotes = False
opentags = 0
current_line = bytearray()
output = []
for group in data:
for char in group:
if char == ord("\n"):
continue
elif char == ord(","):
# newline after ,
current_line.append(char)
output.append((indent, current_line))
current_line = bytearray()
elif char == ord("'"):
# newline after ' if in quotes
if in_quotes:
output.append((indent, current_line))
current_line = bytearray()
current_line.append(char)
in_quotes = False
else:
current_line.append(char)
output.append((indent, current_line))
current_line = bytearray()
in_quotes = True
elif char == ord("<"):
# newline after < then indent
current_line.append(char)
output.append((indent, current_line))
current_line = bytearray()
indent += indent_per_level
opentags += 1
elif char == ord(">"):
# newline before > then dedent
output.append((indent, current_line))
current_line = bytearray()
current_line.append(char)
indent -= indent_per_level
if opentags == 0:
print("ERR: have more closing > than opening ones!")
opentags -= 1
else:
current_line.append(char)
if current_line:
output.append((indent, current_line))
if opentags != 0:
print("ERR: unbalanced < and > count!")
for indent, line in output:
if not args.no_color:
color = str(31 + (indent//indent_per_level) % 8).encode()
sys.stdout.buffer.write(b"\x1b[%sm" % color)
for elem in (b" " * indent, line.strip(), b"\n"):
sys.stdout.buffer.write(elem)
if not args.no_color:
sys.stdout.buffer.write(b"\x1b[m")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment