(_AC_OUTPUT_CONFIG_STATUS): Set up traps to remove
[autoconf.git] / ifnames.in
bloba6fb37ab54be05dd72e5cdc1cf15e047d7b26f86
1 #! @SHELL@
2 # ifnames - print the identifiers used in C preprocessor conditionals
3 # Copyright (C) 1994, 95, 99, 2000 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 2, or (at your option)
8 # 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, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18 # 02111-1307, USA.
20 # Reads from stdin if no files are given.
21 # Writes to stdout.
23 # Written by David MacKenzie <djm@gnu.ai.mit.edu>
24 # and Paul Eggert <eggert@twinsun.com>.
26 me=`echo "$0" | sed -e 's,.*/,,'`
28 usage="\
29 Usage: $0 [OPTION] ...  [FILE] ...
31 Scan all of the C source FILES (or the standard input, if none are
32 given) and write to the standard output a sorted list of all the
33 identifiers that appear in those files in \`#if', \`#elif', \`#ifdef', or
34 \`#ifndef' directives.  Print each identifier on a line, followed by a
35 space-separated list of the files in which that identifier occurs.
37   -h, --help            print this help, then exit
38   -V, --version         print version number, then exit
39   -v, --verbose         verbosely report processing
41 Report bugs to <bug-autoconf@gnu.org>."
43 version="\
44 ifnames (GNU @PACKAGE@) @VERSION@
45 Written by David J. MacKenzie and Paul Eggert.
47 Copyright (C) 1994, 95, 99, 2000 Free Software Foundation, Inc.
48 This is free software; see the source for copying conditions.  There is NO
49 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
51 help="\
52 Try \`$me --help' for more information."
54 while test $# -gt 0; do
55   case "$1" in
56   --h* | -h )
57     echo "$usage"; exit 0 ;;
58   --v* | -V )
59     echo "$version"; exit 0 ;;
60   --)     # Stop option processing.
61     shift; break ;;
62   -*)
63     exec >&2
64     echo "$me: invalid option $1"
65     echo "$help"
66     exit 1 ;;
67   *) break ;;
68   esac
69 done
71 # Variables.
72 : ${AWK=@AWK@}
74 $AWK '
75   # Record that sym was found in FILENAME.
76   function file_sym(sym,  i, fs) {
77     if (sym ~ /^[A-Za-z_]/) {
78       if (!found[sym,FILENAME]) {
79         found[sym,FILENAME] = 1
81         # Insert FILENAME into files[sym], keeping the list sorted.
82         i = 1
83         fs = files[sym]
84         while (match(substr(fs, i), /^ [^ ]*/) \
85                && substr(fs, i + 1, RLENGTH - 1) < FILENAME) {
86           i += RLENGTH
87         }
88         files[sym] = substr(fs, 1, i - 1) " " FILENAME substr(fs, i)
89       }
90     }
91   }
93   {
94     while (sub(/\\$/, "", $0) > 0) {
95       if ((getline tmp) > 0)
96         $0 = $0 tmp
97       else
98         break
99     }
100   }
102   /^[\t ]*#/ {
103     if (sub(/^[\t ]*#[\t ]*ifn?def[\t ]+/, "", $0)) {
104       sub(/[^A-Za-z_0-9].*/, "", $0)
105       file_sym($0)
106     }
107     if (sub(/^[\t ]*#[\t ]*(el)?if[\t ]+/, "", $0)) {
108       # Remove comments.  Not perfect, but close enough.
109       gsub(/\/\*[^\/]*(\*\/)?/, "", $0)
111       for (i = split($0, field, /[^A-Za-z_0-9]+/);  1 <= i;  i--) {
112         if (field[i] != "defined") {
113           file_sym(field[i])
114         }
115       }
116     }
117   }
119   END {
120     for (sym in files) {
121       print sym files[sym]
122     }
123   }
124 ' ${1+"$@"} | sort