intprops: Avoid bogus "warning: division by zero is undefined" on clang.
[gnulib.git] / build-aux / declared.sh
blobb2b71a6e7992d21a036a7a5c1f891e01bf328c18
1 #! /bin/sh
3 # Copyright (C) 2006-2020 Free Software Foundation, Inc.
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <https://www.gnu.org/licenses/>.
19 # This script determines the declared global symbols in a C header file.
20 # Assumptions:
21 # - The header files are in C, with only C89 comments.
22 # - No use of macros with parameters.
23 # - All global declarations are marked with 'extern'.
24 # - All declarations end in ';' on the same line.
25 # - Not more than one symbol is declared in a declaration.
27 # This script requires GNU sed.
29 # func_usage
30 # outputs to stdout the --help usage message.
31 func_usage ()
33 echo "\
34 Usage: declared.sh [OPTION]... < SOURCE.h
36 Extracts the declared global symbols of a C header file.
38 Options:
39 --help print this help and exit
40 --version print version information and exit
42 Report bugs to <bruno@clisp.org>."
45 # func_version
46 # outputs to stdout the --version message.
47 func_version ()
49 echo "declared.sh (GNU gnulib)"
50 echo "Copyright (C) 2020 Free Software Foundation, Inc.
51 License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
52 This is free software: you are free to change and redistribute it.
53 There is NO WARRANTY, to the extent permitted by law."
54 echo "Written by" "Bruno Haible"
57 # func_fatal_error message
58 # outputs to stderr a fatal error message, and terminates the program.
59 func_fatal_error ()
61 echo "declared.sh: *** $1" 1>&2
62 echo "declared.sh: *** Stop." 1>&2
63 exit 1
66 # Command-line option processing.
67 while test $# -gt 0; do
68 case "$1" in
69 --help | --hel | --he | --h )
70 func_usage
71 exit 0 ;;
72 --version | --versio | --versi | --vers | --ver | --ve | --v )
73 func_version
74 exit 0 ;;
75 -- ) # Stop option processing
76 shift; break ;;
77 -* )
78 func_fatal_error "unrecognized option: $option"
80 * )
81 break ;;
82 esac
83 done
85 if test $# -gt 0; then
86 func_fatal_error "too many arguments"
89 # A sed expression that removes ANSI C and ISO C99 comments.
90 sed_remove_comments="
91 /[/][/*]/{
94 s,^\\(\\([^\"'/]\\|\"\\([^\\\"]\\|[\\].\\)*\"\\|'\\([^\\']\\|[\\].\\)*'\\|[/][^\"'/*]\\|[/]\"\\([^\\\"]\\|[\\].\\)*\"\\|[/]'\\([^\\']\\|[\\].\\)*'\\)*\\)//.*,\\1,
96 s,^\\(\\([^\"'/]\\|\"\\([^\\\"]\\|[\\].\\)*\"\\|'\\([^\\']\\|[\\].\\)*'\\|[/][^\"'/*]\\|[/]\"\\([^\\\"]\\|[\\].\\)*\"\\|[/]'\\([^\\']\\|[\\].\\)*'\\)*\\)/[*]\\([^*]\\|[*][^/*]\\)*[*][*]*/,\\1 ,
98 /^\\([^\"'/]\\|\"\\([^\\\"]\\|[\\].\\)*\"\\|'\\([^\\']\\|[\\].\\)*'\\|[/][^\"'/*]\\|[/]\"\\([^\\\"]\\|[\\].\\)*\"\\|[/]'\\([^\\']\\|[\\].\\)*'\\)*[/][*]/{
99 s,^\\(\\([^\"'/]\\|\"\\([^\\\"]\\|[\\].\\)*\"\\|'\\([^\\']\\|[\\].\\)*'\\|[/][^\"'/*]\\|[/]\"\\([^\\\"]\\|[\\].\\)*\"\\|[/]'\\([^\\']\\|[\\].\\)*'\\)*\\)/[*].*,\\1 ,
103 s,^\\([^*]\\|[*][^/*]\\)*[*][*]*/,,
105 s,^.*\$,,
112 # Check that 'sed' supports the kind of regular expressions used in
113 # sed_remove_comments. The use of \| meaning alternation of basic regular
114 # expressions is a GNU extension.
115 sed_test='s,^\(\(a\|X\)*\)//.*,\1,'
116 sed_result=`echo 'aaa//bcd' | sed -e "$sed_test"`
117 test "$sed_result" = 'aaa' \
118 || func_fatal_error "The 'sed' program is not GNU sed. Try installing GNU sed."
120 # A sed expression that joins 'extern' declarations that are broken over
121 # several lines.
122 sed_join_multiline_externs='
123 /^extern [^;]*$/{
126 s/\n/ /g
127 /^extern [^;]*$/{
132 # A sed expression that extracts the identifier of each 'extern' declaration.
133 sed_extract_extern_declared='s/^extern [^()]*[ *]\([A-Za-z_][A-Za-z0-9_]*\) *[;(].*$/\1/p'
135 sed -e "$sed_remove_comments" \
136 | sed -e "$sed_join_multiline_externs" \
137 | sed -n -e "$sed_extract_extern_declared"