]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
devel: add script to fix header inclusion
authorDaiki Ueno <ueno@gnu.org>
Sat, 7 Oct 2023 08:17:39 +0000 (17:17 +0900)
committerDaiki Ueno <ueno@gnu.org>
Sun, 8 Oct 2023 22:12:42 +0000 (07:12 +0900)
This adds check-headers.sh script which scans .c files and checks that
local header files under lib/ are consistently included with #include
"foo.h" instead of #include <foo.h>.

Signed-off-by: Daiki Ueno <ueno@gnu.org>
devel/check-headers.sh [new file with mode: 0755]

diff --git a/devel/check-headers.sh b/devel/check-headers.sh
new file mode 100755 (executable)
index 0000000..37b09c9
--- /dev/null
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+# Copyright (c) 2023 Daiki Ueno
+# License: GPLv3+ <http://gnu.org/licenses/gpl.html>
+
+# This script checks that local header files under lib/ are
+# consistently included with #include "foo.h" instead of #include
+# <foo.h>.
+
+: ${top_srcdir=.}
+
+progname="$0"
+
+test -d "$top_srcdir"/lib || {
+    echo "Run this script from the top-level directory" 1>&2
+    exit 1
+}
+
+mode=check
+
+while test $# -gt 0; do
+    case "$1" in
+       --format )
+           mode=format
+           shift ;;
+       --help )
+           echo "Usage: $progname [--parallel=MAX-PROCS] [--format]"
+            exit ;;
+       -* )
+            echo "$progname: unknown option $1" 1>&2
+            echo "Try '$progname --help' for more information." 1>&2
+            exit 1 ;;
+       * )
+            break ;;
+    esac
+done
+
+lib_quoted='config\.h'
+lib_dirs=
+
+for i in 1 2 3; do
+    lib_quoted1=$(git ls-files "$top_srcdir"/lib | grep -v '^lib/includes' | grep '\.h$' | sed -n 's!^lib/'"$lib_dirs"'!!p' | paste -s -d'|' | sed -e 's!\.!\\.!g' -e 's!|!\\|!g')
+    lib_quoted="$lib_quoted\|$lib_quoted1"
+    lib_dirs="$lib_dirs[^/]*/"
+done
+
+src_quoted='config\.h'
+
+src_quoted1=$(git ls-files "$top_srcdir"/src | grep '\.h$' | sed -n 's!^src/!!p' | paste -s -d'|' | sed -e 's!\.!\\.!g' -e 's!|!\\|!g')
+src_quoted="$src_quoted\|$src_quoted1"
+
+tests_quoted='config\.h'
+tests_dirs=
+
+for i in 1 2; do
+    tests_quoted1=$(git ls-files "$top_srcdir"/tests | grep -v '^lib/includes' | grep '\.h$' | sed -n 's!^tests/'"$tests_dirs"'!!p' | paste -s -d'|' | sed -e 's!\.!\\.!g' -e 's!|!\\|!g')
+    tests_quoted="$tests_quoted\|$tests_quoted1"
+    tests_dirs="$tests_dirs[^/]*/"
+done
+
+lib_pattern="\(# *include *\)<\($lib_quoted\)>"
+src_pattern="\(# *include *\)<\($src_quoted\)>"
+tests_pattern="\(# *include *\)<\($tests_quoted\)>"
+
+case $mode in
+    check )
+       grep "$lib_pattern" $(git ls-files "$top_srcdir"/lib | grep -v '^lib/includes' | grep '\.[ch]$') && exit 1
+       grep "$src_pattern" $(git ls-files "$top_srcdir"/src | grep '\.[ch]$') && exit 1
+       grep "$tests_pattern" $(git ls-files "$top_srcdir"/tests | grep '\.[ch]$') && exit 1
+       exit 0
+       ;;
+    format )
+       sed -i 's!'"$lib_pattern"'!\1"\2"!' $(git ls-files "$top_srcdir"/lib | grep -v '^lib/includes' | grep '\.[ch]$')
+       sed -i 's!'"$src_pattern"'!\1"\2"!' $(git ls-files "$top_srcdir"/src | grep '\.[ch]$')
+       sed -i 's!'"$tests_pattern"'!\1"\2"!' $(git ls-files "$top_srcdir"/tests | grep '\.[ch]$')
+       ;;
+esac