Mercurial > ~dholland > hg > ag > index.cgi
diff lint/check.sh @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lint/check.sh Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,152 @@ +#!/bin/sh +# check.sh - do checks on a source file +# usage: check.sh [--set] topdir sourcefile + +usage() { + echo "$0: Usage: $0 [--tool|main|example] topdir srcfile" 1>&2 +} + +SET=unknown +case "$1" in + --tool) SET=tool; shift;; + --main) SET=main; shift;; + --example) SET=example; shift;; + -*) usage; exit 1;; +esac +if [ $# != 2 ]; then + usage; exit 1 +fi + +cd "$1" || exit 1 +FILE="$2" + +############################################################ +# +# 1. Find unapproved preprocessor symbols used in conditionals. +# + +egrep -n '^(#if|#elif)' "$FILE" | tr -d '\r' | expand |\ + awk '{ + lineno=$1; + sub(":.*", "", lineno); + sub("^[0-9]*:", "", $1); + + directive=$1; + + if (file ~ "\\.h$" || file ~ "\\.hpp$") { + sym=file; + sub("^.*/", "", sym); + sym=toupper(sym); + gsub("\\.", "_", sym); + gsub("-", "_", sym); + if (sym == $2 && directive == "#ifndef") { + next; + } + } + + sub("//.*", "", $0); + sub("/\\*.*\\*/", "", $0); + sub(" *$", "", $0); + + $1 = file ":" lineno ": @"; + + print; + }' "file=$FILE" | sed ' + /@ 0$/d + + /@ __BCPLUSPLUS__$/d + /@ __GNUC__$/d + /@ __IBMCPP__$/d + /@ _MSC_VER$/d + /@ __WATCOM_CPLUSPLUS__$/d + + /@ O_BINARY$/d + ' | ( + if [ $SET = main ]; then + sed ' + /@ AG_ON_AMIGA$/d + /@ AG_ON_UNIX$/d + /@ AG_ON_WINDOWS$/d + + /@ DUMMYGUI$/d + /@ VACLGUI$/d + + /@ INCLUDE_LOGGING$/d + /@ AG_EXE$/d + ' + elif [ $SET = example ]; then + sed ' + /@ __MSDOS__$/d + /@ defined(__MSDOS__) || defined(__WINDOWS__)$/d + ' + else + cat + fi + ) | sed ' + s/@ /Symbol `/ + s/$/'"'"' in conditional/ + ' + + +############################################################ +# +# 2. Check for certain issues with header files. +# + +awk < "$FILE" ' + { + ++lineno; + sub("\r$", "", $0); + gsub("\t", " ", $0); + gsub("/\\*.*\\*/", " ", $0); + sub(" *$", "", $0); + sub("^ *# *", "#", $0); + } + + function complain(msg) { + printf "%s:%d: %s\n", file, lineno, msg; + bad = 1; + } + + /^#include / && $2 == "<sys/types.h>" { systypes=1; } + /^#include / && $2 ~ "<sys/.*\\.h>" && !systypes { + complain(sprintf("Used %s without <sys/types.h>", $2)); + } + + set=="main" && /^#include / && $2 == "<assert.h>" { + complain("Used system <assert.h>"); + } + + # The tree is not ready for these measures + + #length($0) > 79 { + # complain("Line too long"); + #} + + #(/break;/ || /continue;/ || /return[^;]*;/) && + #!(/^ *break; *$/ || /^ *continue; *$/ || /^ *return[^;]*; *$/) { + # complain("break/continue/return not on own line"); + #} + + #{ + # t = $0; + # gsub(", ", " ", t); + # sub(",$", "", t); + # if (t ~ ",") { + # complain("comma without following space"); + # } + #} + + END { + exit(bad); + } +' "file=$FILE" "set=$SET" + +#if [ "$?" != 0 ]; then +# BAD=1 +#fi + +############################################################ + +# done +exit 0