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