style: Add a control character checker
authorAndreas Sandberg <andreas.sandberg@arm.com>
Wed, 30 Mar 2016 14:31:23 +0000 (15:31 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Wed, 30 Mar 2016 14:31:23 +0000 (15:31 +0100)
Add a style checker that verifies that source code doesn't contain
non-printable (control) characters. The only allowed control
characters are:

  * 0x0a / \n: New line
  * 0x09 / \t: Tab (the whitespace checker enforces no-tabs for C/C++ files)

Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Brandon Potter <brandon.potter@amd.com>
--HG--
extra : rebase_source : 9ba3e2971774a7b3d73cda34bbee1f19c4add746

util/style/verifiers.py

index a9c78b41332f4a601887649f5e045c9c2a08300f..8626cc7ce4e68766f3ffea5b46576370296af53f 100644 (file)
@@ -348,6 +348,20 @@ class LineLength(LineVerifier):
     def fix_line(self, line):
         pass
 
+class ControlCharacters(LineVerifier):
+    languages = set(('C', 'C++', 'swig', 'python', 'asm', 'isa', 'scons'))
+    test_name = 'control character'
+    opt_name = 'ascii'
+
+    valid = ('\n', '\t')
+    invalid = "".join([chr(i) for i in range(0, 0x20) if chr(i) not in valid])
+
+    def check_line(self, line):
+        return self.fix_line(line) == line
+
+    def fix_line(self, line):
+        return line.translate(None, ControlCharacters.invalid)
+
 class BoolCompare(LineVerifier):
     languages = set(('C', 'C++', 'python'))
     test_name = 'boolean comparison'