1ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#!/bin/sh 27a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis 37a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis# chkfmt 47a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis# 57a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis# COPYRIGHT: Written by John Cunningham Bowler, 2010. 67a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis# To the extent possible under law, the author has waived all copyright and 77a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis# related or neighboring rights to this work. This work is published from: 87a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis# United States. 9ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# 10ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# Check the format of the source files in the current directory - checks for a 11ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# line length of 80 characters max and no tab characters. 12ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# 13ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# Optionally arguments are files or directories to check. 14ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# 15ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# -v: output the long lines (makes fixing them easier) 16ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# -e: spawn an editor for each file that needs a change ($EDITOR must be 17ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# defined). When using -e the script MUST be run from an interactive 18ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# command line. 19ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikverbose= 20ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikedit= 21ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikvers= 22ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craiktest "$1" = "-v" && { 23ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik shift 24ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik verbose=yes 25ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik} 26ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craiktest "$1" = "-e" && { 27ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik shift 28ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if test -n "$EDITOR" 29ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik then 30ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik edit=yes 31ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 32ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik # Copy the standard streams for the editor 33ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik exec 3>&0 4>&1 5>&2 34ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik else 35ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik echo "chkfmt -e: EDITOR must be defined" >&2 36ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik exit 1 37ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fi 38ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik} 39ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 40ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# Function to edit a single file - if the file isn't changed ask the user 41ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# whether or not to continue. This stuff only works if the script is run from 42ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# the command line (otherwise, don't specify -e or you will be sorry). 43ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikdoed(){ 44ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik cp "$file" "$file".orig 45ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik "$EDITOR" "$file" 0>&3 1>&4 2>&5 3>&- 4>&- 5>&- || exit 1 46ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if cmp -s "$file".orig "$file" 47ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik then 48ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik rm "$file".orig 49ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik echo -n "$file: file not changed, type anything to continue: " >&5 50ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik read ans 0>&3 51ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik test -n "$ans" || return 1 52ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fi 53ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik return 0 54ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik} 55ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 56ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# In beta versions the version string which appears in files can be a little 57ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# long and cause spuriously overlong lines. To avoid this subtitute the version 58ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# string with a 'standard' version a.b.cc before checking for long lines. 59ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikif test -r png.h 60ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikthen 61ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik vers="`sed -n -e \ 62ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 's/^#define PNG_LIBPNG_VER_STRING .\([0-9]\.[0-9]\.[0-9][0-9a-z]*\).$/\1/p' \ 63ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png.h`" 64ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik echo "chkfmt: checking version $vers" 65ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikfi 66ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikif test -z "$vers" 67ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikthen 68ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik echo "chkfmt: png.h not found, ignoring version number" >&2 69ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikfi 70ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 71ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craiktest -n "$1" || set -- . 72ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikfind "$@" \( -type d \( -name '.git' -o -name '.libs' -o -name 'projects' \) \ 73ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik -prune \) -o \( -type f \ 74ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik ! -name '*.[oa]' ! -name '*.l[oa]' ! -name '*.png' ! -name '*.out' \ 75ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik ! -name '*.jpg' ! -name '*.patch' ! -name '*.obj' ! -name '*.exe' \ 76ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik ! -name '*.com' ! -name '*.tar.*' ! -name '*.zip' ! -name '*.ico' \ 77ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik ! -name '*.res' ! -name '*.rc' ! -name '*.mms' ! -name '*.rej' \ 78ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik ! -name '*.dsp' ! -name '*.orig' ! -name '*.dfn' ! -name '*.swp' \ 79ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik ! -name '~*' ! -name '*.3' \ 80ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik ! -name 'missing' ! -name 'mkinstalldirs' ! -name 'depcomp' \ 81ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik ! -name 'aclocal.m4' ! -name 'install-sh' ! -name 'Makefile.in' \ 82ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik ! -name 'ltmain.sh' ! -name 'config*' -print \) | { 83ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik st=0 84ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik while read file 85ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik do 86ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik case "$file" in 87ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik *.mak|*[Mm]akefile.*|*[Mm]akefile) 88ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik # Makefiles require tabs, dependency lines can be this long. 89ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik check_tabs= 90ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik line_length=100;; 91ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik *.awk) 92ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik # Includes literal tabs 93ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik check_tabs= 94ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik # The following is arbitrary 95ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik line_length=132;; 96ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik *contrib/*/*.[ch]) 97ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik check_tabs=yes 98ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik line_length=96;; 99ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik *) 100ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik check_tabs=yes 101ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik line_length=80;; 102ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik esac 103ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 104ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik # Note that vers can only contain 0-9, . and a-z 105ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if test -n "$vers" 106ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik then 107ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik sed -e "s/$vers/a.b.cc/g" "$file" >"$file".$$ 108ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik else 109ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik cp "$file" "$file".$$ 110ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fi 111ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik splt="`fold -$line_length "$file".$$ | diff -c "$file".$$ -`" 112ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik rm "$file".$$ 113ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 114ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if test -n "$splt" 115ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik then 116ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik echo "$file: lines too long" 117ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik st=1 118ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if test -n "$EDITOR" -a -n "$edit" 119ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik then 120ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik doed "$file" || exit 1 121ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik elif test -n "$verbose" 122ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik then 123ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik echo "$splt" 124ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fi 125ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fi 126ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if test -n "$check_tabs" 127ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik then 128ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik tab="`tr -c -d '\t' <"$file"`" 129ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if test -n "$tab" 130ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik then 131ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik echo "$file: file contains tab characters" 132ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik st=1 133ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if test -n "$EDITOR" -a -n "$edit" 134ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik then 135ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik doed "$file" || exit 1 136ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik elif test -n "$verbose" 137ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik then 138ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik echo "$splt" 139ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fi 140ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fi 141ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fi 142ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik done 143ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik exit $st 144ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik} 145