#! /usr/bin/perl -w
# -*- perl -*-
# Generated from ifnames.in; do not edit by hand.

eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac'
    if 0;

# ifnames - print the identifiers used in C preprocessor conditionals

# Copyright (C) 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2005, 2006,
# 2007, 2008, 2009 Free Software Foundation, Inc.

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Reads from stdin if no files are given.
# Writes to stdout.

# Written by David MacKenzie <djm@gnu.ai.mit.edu>
# and Paul Eggert <eggert@twinsun.com>.

BEGIN
{
  my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '/usr/local/google/apenwarr/athena/out.mstc/host/usr/share/autoconf';
  unshift @INC, $pkgdatadir;

  # Override SHELL.  On DJGPP SHELL may not be set to a shell
  # that can handle redirection and quote arguments correctly,
  # e.g.: COMMAND.COM.  For DJGPP always use the shell that configure
  # has detected.
  $ENV{'SHELL'} = '/bin/sh' if ($^O eq 'dos');
}

use Autom4te::General;
use Autom4te::XFile;
use Autom4te::FileUtils;

# $HELP
# -----
$help = "Usage: $0 [OPTION]... [FILE]...

Scan all of the C source FILES (or the standard input, if none are
given) and write to the standard output a sorted list of all the
identifiers that appear in those files in `#if', `#elif', `#ifdef', or
`#ifndef' directives.  Print each identifier on a line, followed by a
space-separated list of the files in which that identifier occurs.

  -h, --help      print this help, then exit
  -V, --version   print version number, then exit

Report bugs to <bug-autoconf\@gnu.org>.
GNU Autoconf home page: <http://www.gnu.org/software/autoconf/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
";


# $VERSION
# --------
$version = "ifnames (GNU Autoconf) 2.65
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+/Autoconf: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David J. MacKenzie and Paul Eggert.
";


# &parse_args ()
# --------------
# Process any command line arguments.
sub parse_args ()
{
  getopt ();
}


# %OCCURRENCE
# -----------
my %occurrence;


# &scan_file ($FILE-NAME)
# -----------------------
sub scan_file ($)
{
  my ($file_name) = @_;
  my $file = new Autom4te::XFile ("< " . open_quote ($file_name));
  while ($_ = $file->getline)
    {
      # Continuation lines.
      $_ .= $file->getline
	while (s/\\$//);

      # Preprocessor directives.
      if (s/^\s*\#\s*(if|ifdef|ifndef|elif)\s+//)
	{
	  # Remove comments.  Not perfect, but close enough.
	  s(/\*.*?\*/)();
	  s(/\*.*)();
	  s(//.*)();
	  foreach my $word (split (/\W+/))
	    {
	      next
		if $word eq 'defined' || $word !~ /^[a-zA-Z_]/;
	      $occurrence{$word}{$file_name} = 1;
	    }
	}
    }
}


## ------ ##
## Main.  ##
## ------ ##

parse_args();
foreach (@ARGV)
  {
    scan_file ($_);
  }
foreach (sort keys %occurrence)
  {
    print "$_ ", join (' ', sort keys %{$occurrence{$_}}), "\n";
  }

### Setup "GNU" style for perl-mode and cperl-mode.
## Local Variables:
## perl-indent-level: 2
## perl-continued-statement-offset: 2
## perl-continued-brace-offset: 0
## perl-brace-offset: 0
## perl-brace-imaginary-offset: 0
## perl-label-offset: -2
## cperl-indent-level: 2
## cperl-brace-offset: 0
## cperl-continued-brace-offset: 0
## cperl-label-offset: -2
## cperl-extra-newline-before-brace: t
## cperl-merge-trailing-else: nil
## cperl-continued-statement-offset: 2
## End:
