3 # Checks some of the GNU style formatting rules in a set of patches.
4 # Copyright (C) 2010, 2012, 2016 Free Software Foundation, Inc.
5 # Contributed by Sebastian Pop <sebastian.pop@amd.com>
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, see the file COPYING3. If not,
19 # see <http://www.gnu.org/licenses/>.
21 # Set to empty in the environment to override.
22 : ${color:---color=always}
26 check_GNU_style.sh [patch]...
28 Checks the patches for some of the GNU style formatting problems.
29 When FILE is -, read standard input.
31 Please note that these checks are not always accurate, and
32 complete. The reference documentation of the GNU Coding Standards
33 can be found here: http://www.gnu.org/prep/standards_toc.html
34 and there are also some additional coding conventions for GCC:
35 http://gcc.gnu.org/codingconventions.html
41 test $# -eq 0 && usage
47 if [ $nfiles -eq 1 ] && [ "$files" = "-" ]; then
50 # By putting stdin into a temp file, we can handle it just like any other
51 # file. F.i., we can cat it twice, which we can't do with stdin.
52 stdin_tmp
=check_GNU_style.stdin
57 if [ "$f" = "-" ]; then
58 # Let's keep things simple. Either we read from stdin, or we read
59 # from files specified on the command line, not both.
62 if [ ! -f "$f" ]; then
63 echo "error: could not read file: $f"
69 inp
=check_GNU_style.inp
70 tmp
=check_GNU_style.tmp
71 tmp2
=check_GNU_style
.2.tmp
72 tmp3
=check_GNU_style
.3.tmp
74 # Remove $tmp on exit and various signals.
75 trap "rm -f $inp $tmp $tmp2 $tmp3 $stdin_tmp" 0
76 trap "rm -f $inp $tmp $tmp2 $tmp3 $stdin_tmp; exit 1" 1 2 3 5 9 13 15
78 if [ $nfiles -eq 1 ]; then
79 # There's no need for the file prefix if we're dealing only with one file.
84 grep $format '^+' $files \
92 if [ "$prefix" = "" ]; then
95 awk "{printf \"%s%s\n\", \"$prefix\", \$0}" $f
106 |
egrep $color -- "$arg" \
107 > "$tmp" && found
=true
123 |
egrep $color -- "$arg1" \
124 |
egrep $color -- "$arg2" \
125 > "$tmp" && found
=true
141 |
egrep -v -- "$varg" \
142 |
egrep $color -- "$arg" \
143 > "$tmp" && found
=true
158 if [ $nfiles -ne 1 ]; then
162 # Don't reuse $inp, which may be generated using -H and thus contain a
168 # Keep only line number prefix and patch modifier '+'.
170 |
sed 's/\(^[0-9][0-9]*:+\).*/\1/' \
173 # Remove line number prefix and patch modifier '+'.
174 # Expand tabs to spaces according to tab positions.
175 # Keep long lines, make short lines empty. Print the part past 80 chars
177 # Don't complain about dg-xxx directives in tests.
179 |
sed 's/^[0-9]*:+//' \
181 |
awk '$0 !~ /{[[:space:]]*dg-(error|warning|message)[[:space:]]/ { \
182 if (length($0) > 80) \
183 printf "%s\033[1;31m%s\033[0m\n", \
191 # Combine prefix back with long lines.
192 # Filter out empty lines.
194 paste -d '' "$tmp2" "$tmp3" \
195 |
grep -v '^[0-9][0-9]*:+$' \
196 > "$tmp" && found
=true
203 cat_with_prefix
"$tmp"
209 col 'Lines should not exceed 80 characters.'
211 g
'Blocks of 8 spaces should be replaced with tabs.' \
214 g
'Trailing whitespace.' \
217 g
'Space before dot.' \
218 '[[:alnum:]][[:blank:]]+\.'
220 g
'Dot, space, space, new sentence.' \
221 '[[:alnum:]]\.([[:blank:]]|[[:blank:]]{3,})[A-Z0-9]'
223 g
'Dot, space, space, end of comment.' \
224 '[[:alnum:]]\.([[:blank:]]{0,1}|[[:blank:]]{3,})\*/'
226 g
'Sentences should end with a dot. Dot, space, space, end of the comment.' \
227 '[[:alnum:]][[:blank:]]*\*/'
229 vg
'There should be exactly one space between function name and parenthesis.' \
231 '[[:alnum:]]([[:blank:]]{2,})?\('
233 g
'There should be no space before a left square bracket.' \
234 '[[:alnum:]][[:blank:]]+\['
236 g
'There should be no space before closing parenthesis.' \
237 '[[:graph:]][[:blank:]]+\)'
239 # This will give false positives for C99 compound literals.
240 g
'Braces should be on a separate line.' \
241 '(\)|else)[[:blank:]]*{'
243 # Does this apply to definition of aggregate objects?
244 g
'Trailing operator.' \
245 '(([^a-zA-Z_]\*)|([-%<=&|^?])|([^*]/)|([^:][+]))$'