blob: 2e4a1067b3bc4c2d513c34cb54b57d282f1faf58 [file] [log] [blame]
#!/bin/sh
#
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
#
HELP="\
Usage: $0 [--remove] [FILE...]
Insert or remove the GCC attribute \"warn_unused_result\" on each function
that returns a Subversion error, in the specified files or, by default,
*.h and *.c in the ./subversion and ./tools trees.
"
LC_ALL=C
# Parse options
REMOVE=
case "$1" in
--remove) REMOVE=1; shift;;
--help) echo "$HELP"; exit 0;;
--*) echo "$0: unknown option \"$1\"; try \"--help\""; exit 1;;
esac
# Set the positional parameters to the default files if none specified
if [ $# = 0 ]; then
set -- `find subversion/ tools/ -name '*.[ch]'`
fi
# A line that declares a function return type of "svn_error_t *" looks like:
# - Possibly leading whitespace, though not often.
# - Possibly "static" or "typedef".
# - The return type "svn_error_t *".
# - Possibly a function or pointer-to-function declarator:
# - "identifier"
# - "(identifier)" (used in some typedefs)
# - "(*identifier)"
# with either nothing more, or a "(" next (especially not "," or ";" or "="
# which all indicate a variable rather than a function).
# Regular expressions for "sed"
# Note: take care in matching back-reference numbers to parentheses
PREFIX="^\( *\| *static *\| *typedef *\)"
RET_TYPE="\(svn_error_t *\* *\)"
IDENT="[a-zA-Z_][a-zA-Z0-9_]*"
DECLR="\($IDENT\|( *\(\*\|\) *$IDENT *)\)"
SUFFIX="\($DECLR *\((.*\|\)\|\)$"
# The attribute string to be inserted or removed
ATTRIB_RE="__attribute__((warn_unused_result))" # regex version of it
ATTRIB_STR="__attribute__((warn_unused_result))" # plain text version of it
if [ $REMOVE ]; then
SUBST="s/$PREFIX$ATTRIB_RE $RET_TYPE$SUFFIX/\1\2\3/"
else
SUBST="s/$PREFIX$RET_TYPE$SUFFIX/\1$ATTRIB_STR \2\3/"
fi
for F do
# Edit the file, leaving a backup suffixed with a tilde
{ sed -e "$SUBST" "$F" > "$F~1" &&
{ ! cmp -s "$F" "$F~1"; } &&
mv "$F" "$F~" && # F is briefly absent now; a copy could avoid this
mv "$F~1" "$F"
} ||
# If anything went wrong or no change was made, remove the temporary file
rm "$F~1"
done