#! /usr/bin/env python # # A simple-minded style checker for C++ code. # This only catches the most obvious style mistakes, and occasionally # flags stuff that isn't wrong. # import sys, string, re # # Constants. # MAX_LINE_LENGTH = 78 # # Regular expressions corresponding to style violations. # tabs = re.compile(r"\t+") comma_space = re.compile(",[^ ]") # This one is really tough to get right, so we settle for catching the # most common mistakes. Add other operators as necessary and/or feasible. operator_space = re.compile("(\w(\+|\-|\*|\<|\>|\=)\w)" + \ "|(\w(\=\=|\<\=|\>\=)\w)") comment_line = re.compile("^\s*\/\*.*\*\/\s*$") cpp_comment_line = re.compile("^\s*\/\/.*$") open_comment_space = re.compile("\/\*[^ *\n]") close_comment_space = re.compile("[^ *]\*\/") cpp_comment_space = re.compile("\/\/[^ *\n]") paren_curly_space = re.compile("\)\{") semi_space = re.compile(";[^ \s]") def check_line(filename, line, n): """ Check a line of code for style mistakes. """ # Strip the terminal newline. line = line[:-1] if tabs.search(line): print "File %s, line %d: [TABS]:\n%s" % \ (filename, n, line) if len(line) > MAX_LINE_LENGTH: print "File %s, line %d: [TOO LONG (%d CHARS)]:\n%s" % \ (filename, n, len(line), line) if comma_space.search(line): print "File %s, line %d: [PUT SPACE AFTER COMMA]:\n%s" % \ (filename, n, line) if operator_space.search(line): if not comment_line.search(line) \ and not cpp_comment_line.search(line): print "File %s, line %d: [PUT SPACE AROUND OPERATORS]:\n%s" % \ (filename, n, line) if open_comment_space.search(line): print "File %s, line %d: [PUT SPACE AFTER OPEN COMMENT]:\n%s" % \ (filename, n, line) if close_comment_space.search(line): print "File %s, line %d: [PUT SPACE BEFORE CLOSE COMMENT]:\n%s" % \ (filename, n, line) if cpp_comment_space.search(line): print "File %s, line %d: [PUT SPACE AFTER OPEN COMMENT]:\n%s" % \ (filename, n, line) if paren_curly_space.search(line): print "File %s, line %d: [PUT SPACE BETWEEN ) AND {]:\n%s" % \ (filename, n, line) if semi_space.search(line): print "File %s, line %d: [PUT SPACE/NEWLINE AFTER SEMICOLON]:\n%s" % \ (filename, n, line) def check_file(filename): file = open(filename, "r") lines = file.readlines() file.close() for i in range(len(lines)): check_line(filename, lines[i], i + 1) # Start on line 1. # # Main body of program. # usage = "usage: c++_style_check filename1 [filename2 ...]" if len(sys.argv) < 2: print usage raise SystemExit for filename in sys.argv[1:]: check_file(filename)