Browse Source

dist: tools: headerguard: initial commit

master
Kaspar Schleiser 5 years ago
parent
commit
de07fe07e5
  1. 44
      dist/tools/headerguards/check.sh
  2. 84
      dist/tools/headerguards/headerguards.py

44
dist/tools/headerguards/check.sh vendored

@ -0,0 +1,44 @@
#!/bin/sh
# Copyright 2017 Kaspar Schleiser <kaspar@schleiser.de>
#
# This file is subject to the terms and conditions of the GNU Lesser
# General Public License v2.1. See the file LICENSE in the top level
# directory for more details.
: ${RIOTBASE:=$(pwd)}
. ${RIOTBASE}/dist/tools/ci/changed_files.sh
EXIT_CODE=0
filter() {
if [ $QUIET -eq 0 ]; then
cat
else
grep '^---' | cut -f 2 -d ' '
fi
}
_headercheck() {
OUT="$(${RIOTBASE}/dist/tools/headerguards/headerguards.py ${FILES} | filter)"
if [ -n "$OUT" ]; then
EXIT_CODE=1
echo "$OUT"
fi
}
: ${FILES:=$(FILEREGEX='\.h$' changed_files)}
if [ -z "${FILES}" ]; then
exit
fi
: ${QUIET:=0}
if [ -z "$*" ]; then
_headercheck
fi
exit $EXIT_CODE

84
dist/tools/headerguards/headerguards.py vendored

@ -0,0 +1,84 @@
#!/usr/bin/env python3
import os, sys
import difflib
#from string import maketrans
from io import BytesIO, TextIOWrapper
_in = "/-."
_out = "___"
transtab = str.maketrans(_in, _out)
def path_to_guardname(filepath):
res = filepath.upper().translate(transtab)
if res.startswith("_"):
res = "PRIV" + res
return res
def get_guard_name(filepath):
parts = filepath.split(os.sep)
start = 0
found = False
for i, part in enumerate(parts):
if part == "include":
found = True
start = i+1
break
if not found:
start = len(parts) -1
return path_to_guardname(os.path.join(*parts[start:]))
def fix_headerguard(filename):
supposed = get_guard_name(filename)
with open(filename, "r",encoding='utf-8', errors='ignore') as f:
inlines = f.readlines()
tmp = TextIOWrapper(BytesIO(), encoding="utf-8", errors="ignore")
tmp.seek(0)
guard_found = 0
guard_name = ""
ifstack = 0
for n, line in enumerate(inlines):
if guard_found == 0:
if line.startswith("#ifndef"):
guard_found += 1
guard_name = line[8:].rstrip()
line = "#ifndef %s\n" % (supposed)
elif guard_found == 1:
if line.startswith("#define") and line[8:].rstrip() == guard_name:
line = "#define %s\n" % (supposed)
guard_found += 1
else:
break
elif guard_found == 2:
if line.startswith("#if"):
ifstack += 1
elif line.startswith("#endif"):
if ifstack > 0:
ifstack -= 1
else:
guard_found += 1
line = "#endif /* %s */\n" % supposed
tmp.write(line)
tmp.seek(0)
if guard_found == 3:
for line in difflib.unified_diff(inlines, tmp.readlines(), "%s" % filename, "%s" % filename):
sys.stdout.write(line)
else:
print("%s: no / broken header guard" % filename, file=sys.stderr)
return False
if __name__=="__main__":
error = False
for filename in sys.argv[1:]:
if fix_headerguard(filename) == False:
error = True
if error:
sys.exit(1)
Loading…
Cancel
Save