#!/usr/bin/env sh

# Copyright (C) 2013-2021 Free Software Foundation, Inc.
#
# This file is part of GDB.
#
# 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/>.

# Generate the init.c source file.
#
# Usage:
#
#    ./make-init-c source-files > init.c-tmp
#
# Where SOURCE-FILES is the list of source files to extract init functions from.
#
# Formatting conventions:  The name of the initialization routines must begin
# with `_initialize_`, must start in column zero, and be followed with exactly
# ` ()`.  For example:
#
# void
# _initialize_foo ()
# {
#   ...
# }
#

# Abort on command error.
set -e

echo "/* Do not modify this file.  */"
echo "/* It is created automatically by the Makefile.  */"
echo "#include \"defs.h\"      /* For initialize_file_ftype.  */"
echo "#include <algorithm>"
echo ""
sed -n -e 's/^\(_initialize_[a-zA-Z0-9_]*\) ()$/\1/p' "$@" | while read -r name; do
  echo "extern initialize_file_ftype $name;"
done
echo ""
echo "void initialize_all_files ();"
echo "void"
echo "initialize_all_files ()"
echo "{"
echo "  std::vector<initialize_file_ftype *> functions ="
echo "    {"
sed -n -e 's/^\(_initialize_[a-zA-Z0-9_]*\) ()$/\1/p' "$@" | while read -r name; do
  echo "      $name,"
done
echo "    };"
echo ""
echo "  /* If GDB_REVERSE_INIT_FUNCTIONS is set (any value), reverse the"
echo "     order in which initialization functions are called.  This is"
echo "     used by the testsuite.  */"
echo "  if (getenv (\"GDB_REVERSE_INIT_FUNCTIONS\") != nullptr)"
echo "    std::reverse (functions.begin (), functions.end ());"
echo ""
echo "  for (initialize_file_ftype *function : functions)"
echo "    function ();"
echo "}"
