| #!/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 |