#! /bin/sh
#
# Copyright (C) 2016 John W. Eaton
#
# This file is part of Octave.
#
# Octave 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.
#
# Octave 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 Octave; see the file COPYING.  If not, see
# <http://www.gnu.org/licenses/>.

if [ $# -ne 1 ]; then
  echo "usage: mk-octave-config-h.sh CONFIG-FILE" 1>&2
  exit 1
fi

config_h_file=$1

cat << EOF
/* DO NOT EDIT!  Generated by mk-octave-config-h.sh.  */
/*

Copyright (C) 2016 John W. Eaton

This file is part of Octave.

Octave 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.

Octave 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 Octave; see the file COPYING.  If not, see
<http://www.gnu.org/licenses/>.

*/

#if ! defined (octave_octave_config_h)
#define octave_octave_config_h 1

#include <stdint.h>

#if defined (__GNUC__)
#  define OCTAVE_DEPRECATED(msg) __attribute__ ((__deprecated__ (msg)))
#  define OCTAVE_NORETURN __attribute__ ((__noreturn__))
#  define OCTAVE_UNUSED __attribute__ ((__unused__))

#  define HAVE_OCTAVE_DEPRECATED_ATTR 1
#  define HAVE_OCTAVE_NORETURN_ATTR 1
#  define HAVE_OCTAVE_UNUSED_ATTR 1
#else
#  define OCTAVE_DEPRECATED(msg)
#  define OCTAVE_NORETURN
#  define OCTAVE_UNUSED

/* #  undef HAVE_OCTAVE_DEPRECATED_ATTR */
/* #  undef HAVE_OCTAVE_NORETURN_ATTR */
/* #  undef HAVE_OCTAVE_UNUSED_ATTR */
#endif

#if defined (_MSC_VER)
#  define OCTAVE_API __declspec(dllimport)
#  define OCTINTERP_API __declspec(dllimport)
#else
#  define OCTAVE_API
#  define OCTINTERP_API
#endif

#include <stdint.h>
EOF

octave_idx_type="`sed -n 's/#define OCTAVE_IDX_TYPE \([_a-zA-Z][_a-zA-Z0-9]*\)/\1/p' $config_h_file`"

if test -z "$octave_idx_type"; then
  echo "mk-octave-config-h.sh: failed to find OCTAVE_IDX_TYPE in $config_h_file" 1>&2
  exit 1
fi

cat << EOF

typedef octave_idx_type $octave_idx_type;

EOF

if grep "#define OCTAVE_ENABLE_FLOAT_TRUNCATE 1" $config_h_file > /dev/null;
then
  echo "#define OCTAVE_FLOAT_TRUNCATE volatile"
else
  echo "#define OCTAVE_FLOAT_TRUNCATE"
fi

grep "#\(undef\|define\) OCTAVE_ENABLE_64" $config_h_file
grep "#\(undef\|define\) OCTAVE_ENABLE_ATOMIC_REFCOUNT" $config_h_file
grep "#\(undef\|define\) OCTAVE_ENABLE_BOUNDS_CHECK" $config_h_file
grep "#\(undef\|define\) OCTAVE_ENABLE_OPENMP" $config_h_file

if grep "#undef HAVE_DEV_T" $config_h_file > /dev/null;
then
  cat << EOF

typedef short dev_t;

EOF
else
  cat << EOF

/* typedef short dev_t; */

EOF
fi

if grep "#undef HAVE_INO_T" $config_h_file > /dev/null;
then
    cat << EOF

typedef unsigned long ino_t;

EOF
else
    cat << EOF

/* typedef unsigned long ino_t; */

EOF
fi

have_roundl=no
if grep "#define HAVE_ROUNDL" $config_h_file > /dev/null;
then
  have_roundl=yes
fi

sizeof_long_double="`sed -n 's/#define SIZEOF_LONG_DOUBLE \([0-9]*\)/\1/p' $config_h_file`"

if test -z "$sizeof_long_double"; then
  echo "mk-octave-config-h.sh: failed to find SIZEOF_LONG_DOUBLE in $config_h_file" 1>&2
  exit 1
fi

if test $sizeof_long_double -ge 10 && test $have_roundl = yes; then
  echo "#define OCTAVE_INT_USE_LONG_DOUBLE 1"
  if test $sizeof_long_double -lt 16; then
    cat << EOF

#if (defined (__i386__) || defined (__x86_64__)) && defined (__GNUC__)
#  define OCTAVE_ENSURE_LONG_DOUBLE_OPERATIONS_ARE_NOT_TRUNCATED 1
#endif
EOF
  else
    cat << EOF
/* #undef OCTAVE_ENSURE_LONG_DOUBLE_OPERATIONS_ARE_NOT_TRUNCATED */
EOF
  fi
else
  cat << EOF
/* #undef OCTAVE_INT_USE_LONG_DOUBLE */
/* #undef OCTAVE_ENSURE_LONG_DOUBLE_OPERATIONS_ARE_NOT_TRUNCATED */
EOF
fi

cat << EOF

#endif
EOF
