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