From bb5f8cf4951fc5813d60ab806c57c5b5d713f38c Mon Sep 17 00:00:00 2001
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Date: Wed, 23 Oct 2019 16:10:26 +0300
Subject: utils: checkstyle.py: Add include checker
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Add an include checker to verify usage of the C compatibility headers.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 utils/checkstyle.py | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

(limited to 'utils')

diff --git a/utils/checkstyle.py b/utils/checkstyle.py
index 42a96f6d..335e58f5 100755
--- a/utils/checkstyle.py
+++ b/utils/checkstyle.py
@@ -240,6 +240,38 @@ class StyleIssue(object):
         self.msg = msg
 
 
+class IncludeChecker(StyleChecker):
+    patterns = ('*.cpp', '*.h')
+
+    headers = ('assert', 'ctype', 'errno', 'fenv', 'float', 'inttypes',
+               'limits', 'locale', 'math', 'setjmp', 'signal', 'stdarg',
+               'stddef', 'stdint', 'stdio', 'stdlib', 'string', 'time', 'uchar',
+               'wchar', 'wctype')
+    include_regex = re.compile('^#include <c([a-z]*)>')
+
+    def __init__(self, content):
+        super().__init__()
+        self.__content = content
+
+    def check(self, line_numbers):
+        issues = []
+
+        for line_number in line_numbers:
+            line = self.__content[line_number - 1]
+            match = IncludeChecker.include_regex.match(line)
+            if not match:
+                continue
+
+            header = match.group(1)
+            if header not in IncludeChecker.headers:
+                continue
+
+            issues.append(StyleIssue(line_number, line,
+                                     'C compatibility header <%s.h> is preferred' % header))
+
+        return issues
+
+
 class LogCategoryChecker(StyleChecker):
     log_regex = re.compile('\\bLOG\((Debug|Info|Warning|Error|Fatal)\)')
     patterns = ('*.cpp',)
-- 
cgit v1.2.1