#!/usr/bin/perl

# Print a list of symbols exported by some headers that would
# otherwise be in the user's namespace.

# Copyright (C) 2014-2018 Free Software Foundation, Inc.
# This file is part of the GNU C Library.

# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.

# The GNU C Library 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
# Lesser General Public License for more details.

# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library; if not, see
# <http://www.gnu.org/licenses/>.

use GlibcConform;
use Getopt::Long;

GetOptions ('headers=s' => \$headers, 'standard=s' => \$standard,
	    'flags=s' => \$flags, 'cc=s' => \$CC, 'tmpdir=s' => \$tmpdir, 'withclang=s' => \$withclang);
@headers = split (/\s+/, $headers);

# Extra symbols possibly not found through -aux-info but still
# reserved by the standard: either data symbols, or symbols where the
# standard leaves unspecified whether the identifier is a macro or
# defined with external linkage.
$extra_syms{"ISO"} = ["errno", "setjmp", "va_end"];
$extra_syms{"ISO99"} = ["errno", "math_errhandling", "setjmp", "va_end"];
# stdatomic.h not yet covered by conformance tests; as per DR#419, all
# the generic functions there or may not be defined with external
# linkage (but are reserved in any case).
$extra_syms{"ISO11"} = ["errno", "math_errhandling", "setjmp", "va_end"];
# The following lists may not be exhaustive.
$extra_syms{"POSIX"} = ["errno", "setjmp", "va_end", "environ", "sigsetjmp",
			"optarg", "optind", "opterr", "optopt", "tzname"];
$extra_syms{"XPG4"} = ["errno", "setjmp", "va_end", "environ", "signgam",
		       "loc1", "loc2", "locs", "sigsetjmp", "optarg",
		       "optind", "opterr", "optopt", "daylight", "timezone",
		       "tzname"];
$extra_syms{"XPG42"} = ["errno", "setjmp", "va_end", "environ", "signgam",
		       "loc1", "loc2", "locs", "sigsetjmp", "optarg",
		       "optind", "opterr", "optopt", "daylight", "timezone",
		       "tzname", "getdate_err", "h_errno"];
$extra_syms{"UNIX98"} = ["errno", "setjmp", "va_end", "environ", "signgam",
			 "loc1", "loc2", "locs", "sigsetjmp", "optarg",
			 "optind", "opterr", "optopt", "daylight", "timezone",
			 "tzname", "getdate_err", "h_errno"];
$extra_syms{"XOPEN2K"} = ["errno", "setjmp", "va_end", "environ", "signgam",
			  "sigsetjmp", "optarg", "optind", "opterr", "optopt",
			  "daylight", "timezone", "tzname", "getdate_err",
			  "h_errno", "in6addr_any", "in6addr_loopback"];
$extra_syms{"XOPEN2K8"} = ["errno", "setjmp", "va_end", "environ", "signgam",
			   "sigsetjmp", "optarg", "optind", "opterr", "optopt",
			   "daylight", "timezone", "tzname", "getdate_err",
			   "in6addr_any", "in6addr_loopback"];
$extra_syms{"POSIX2008"} = ["errno", "setjmp", "va_end", "environ",
			    "sigsetjmp", "optarg", "optind", "opterr", "optopt",
			    "tzname", "in6addr_any", "in6addr_loopback"];

%user_syms = ();

foreach my $header (@headers) {
  @syms = list_exported_functions ("$CC $flags", $standard, $header, $tmpdir, $withclang);
  foreach my $sym (@syms) {
    if ($sym !~ /^_/) {
      $user_syms{$sym} = 1;
    }
  }
}
foreach my $sym (@{$extra_syms{$standard}}) {
  $user_syms{$sym} = 1;
}

foreach my $sym (sort keys %user_syms) {
  print "$sym\n";
}
