#! /bin/sh

# Ensure consistent style by catching common improper constructs.

set -e

diag()
{
  fail=:
  echo "$file:" "$@"
  echo ============================================================
}

rm -f failures

# Get some help from GNU grep.
GREP_OPTIONS='--color=auto -n'
GREP_COLOR='1;31'
export GREP_OPTIONS
export GREP_COLOR

tmp=incltest.tmp

for dir in "${INCDIR-..}" "${INCDIR-..}"/../iface; do

  find "$dir" \( -name "${1-*}.hh" -o -name "${1-*}.cc" \) \
		 -a -type f -a -print |
  while read file; do
    if grep 'GNU Bison' "$file" >/dev/null ||
      grep 'generated by flex' "$file" >/dev/null ; then
      continue
    fi

    fail=false

    sed 's,//.*,,' < $file > $tmp

    grep '[	 ]if(' $tmp &&
      diag 'Missing space after "if"'

    grep '[	 ]if (.*).*{' $tmp &&
      diag 'Opening { should be on its own line.'

    grep '[	 ]if (.*).*;' $tmp &&
      diag 'if body should be on another line.'

    grep '[	 ]while(' $tmp &&
      diag 'Missing space after "while"'

    grep '[	 ]while (.*).*{' $tmp &&
      diag 'Opening { should be on its own line.'

    grep '[	 ]while (.*).*[^)];' $tmp &&
      diag 'while body should be on another line.'

    grep '[	 ]for(' $tmp &&
      diag 'Missing space after "for"'

    grep '[	 ]for (.*).*{' $tmp &&
      diag 'Opening { should be on its own line.'

    grep '[	 ]for (.*;.*;.*).*;' $tmp &&
      diag 'for body should be on another line.'

    grep '[	 ]switch(' $tmp &&
      diag 'Missing space after "switch"'

    grep '[	 ]switch (.*).*{' $tmp &&
      diag 'Opening { should be on its own line.'

    grep '( ' $tmp &&
      diag 'No space after opening (.'

    grep ' )' $tmp &&
      diag 'No space before closing ).'

    grep '! ' $tmp &&
      diag 'No space after unary operators (!).'

    grep ',[(a-zA-Z+=_!]' $tmp &&
      diag 'Space after coma.'

    grep '[^	 ]&&[^	 ]' $tmp &&
      diag 'Space arround binary operators.'

    grep '[^	 ]||[^	 ]' $tmp &&
      diag 'Space arround binary operators.'

    grep '[	 ]default:[^:].*;' $tmp &&
      diag 'Label should be on their own line.'

    grep '[	 ]case.*:[^:].*;' $tmp &&
      diag 'Label should be on their own line.'

    grep '[	 ];' $tmp &&
      diag 'No space before semicolon.'

    $fail && echo "$file" >>failures
  done
done

if test -f failures; then
   echo "The following files contain style errors:"
   cat failures
   rm failures
   exit 1;
fi
