test_headers.sh: handle the "#define restrict" bit in config.h
[darkstat] / test_headers.sh
index fef7860..73f9fdf 100755 (executable)
@@ -1,8 +1,9 @@
 #!/bin/sh
-# copyright (c) 2011 Emil Mikulic.
+# copyright (c) 2011-2012 Emil Mikulic.
 
 a="\033[33;1m"
 z="\033[m"
+problem=0
 
 check_deps() {
   echo checking header dependencies...
@@ -13,12 +14,14 @@ check_deps() {
   files=`ls *.h | fgrep -v -e graphjs.h -e stylecss.h`
 
   for f in $files; do
+    echo " * $f"
     cat >$src <<EOF
 #include "$f"
 void test_hdr_do_nothing(void) { }
 EOF
     if ! gcc -c $src 2>/dev/null; then
       echo "${a}===> $f can't be included by itself${z}"
+      problem=1
       gcc -c $src
     else
       cat >$src <<EOF
@@ -28,6 +31,7 @@ void test_hdr_do_nothing(void) { }
 EOF
       if ! gcc -c $src 2>/dev/null; then
         echo "${a}===> $f can't be included twice${z}"
+        problem=1
         gcc -c $src
       fi
     fi
@@ -38,7 +42,7 @@ EOF
 
 check_defines() {
   header=$1
-  defines=$2
+  defines="(^|[^a-zA-Z_])($2)"
   files=$3
 
   echo checking $header users...
@@ -47,6 +51,7 @@ check_defines() {
   for file in `egrep -l "$defines" $files`; do
     if ! fgrep -q '#include "'$header'"' $file; then
       echo "${a}===> $file should include $header${z}"
+      problem=1
       egrep --color=always "$defines" $file
     fi
   done
@@ -55,6 +60,7 @@ check_defines() {
   for file in `fgrep -l '#include "'$header'"' *.[ch]`; do
    if ! egrep -q "$defines" $file; then
     echo "${a}===> $file should not include $header${z}"
+    problem=1
    fi
   done
 }
@@ -63,9 +69,12 @@ check_defines() {
 
 check_deps
 
-defines=`grep \# config.h | cut -d# -f2 | cut -d' ' -f2 | tr '\n' '|' |
-  sed -e 's/|$//'`
+# Check config.h: build a list of macros that are or could be defined.
+defines=`egrep '#define|#undef' config.h | cut -d# -f2 | cut -d' ' -f2 |
+  sort -u | tr '\n' '|' | sed -e 's/|$//'`
+# Check against all files except itself.
 files=`ls *.[ch] | fgrep -v config.h`
+#echo "config.h defines: ($defines)"
 check_defines config.h "$defines" "$files"
 
 defines=`sed -e 's/# \+/#/;' < cdefs.h | grep '#define' | cut -d' ' -f2 |
@@ -73,4 +82,6 @@ defines=`sed -e 's/# \+/#/;' < cdefs.h | grep '#define' | cut -d' ' -f2 |
 files=`ls *.[ch] | fgrep -v -e cdefs.h -e graphjs.h -e stylecss.h`
 check_defines cdefs.h "$defines" "$files"
 
+exit $problem
+
 # vim:set ts=2 sw=2 et: