#!/bin/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 "}"
