#! /bin/sh

# mknumeric_limits: generates
# - part of bits/std_limits.h completed by gen-num-limits.cc
# - src/limitsMEMBERS.cc that contains the definition of various
#   static data members of specialization of class template numeric_limits
#

echo "running mknumeric_limits"

: ${CXX:=g++}

case `uname` in
    CYGWIN*) 
	LDFLAGS='-nodefaultlibs -lcygwin -lc -lkernel32 -lgcc' ;;
    *) 
	LDFLAGS='-nodefaultlibs -lgcc -lc' ;;
esac

BUILD_DIR=$1
if [ ! -d "$BUILD_DIR" ]; then
  echo "build directory $BUILD_DIR not found, exiting."
  exit 1
fi

SRC_DIR=$2
if [ ! -d "$SRC_DIR" ]; then
  echo "source directory $SRC_DIR not found, exiting."
  exit 1
fi

if [ ! -d "$BUILD_DIR/bits" ]; then
  mkdir  "$BUILD_DIR/bits"
fi
if [ ! -d "$BUILD_DIR/src" ]; then
  mkdir  "$BUILD_DIR/src"
fi

OUT_H="$BUILD_DIR/bits/std_limits.h"
OUT_C="$BUILD_DIR/src/limitsMEMBERS.cc"

if [ -f $OUT_C ]; then
    rm -f $OUT_H OUT_C
fi

cat <<EOF > $OUT_H
// The template and inlines for the -*- C++ -*- numeric_limits classes.

// Copyright (C) 1999 Cygnus Solutions
//
// This file is part of the GNU ISO C++ Library.  This library 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 2, or (at your option)
// any later version.

// This 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 General Public License for more details.

// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING.  If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.

// As a special exception, you may use this file as part of a free software
// library without restriction.  Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License.  This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.

// Note: this is not a conforming implementation.
// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@cmla.ens-cachan.fr>

//
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT!
//

//
// ISO 14882:1998
// 18.2.1
//

#ifndef _CPP_NUMERIC_LIMITS
#define _CPP_NUMERIC_LIMITS 1

#include <bits/c++config.h>
#include <bits/std_cfloat.h>

namespace std {

    enum float_round_style {
        round_indeterminate       = -1,
        round_toward_zero         = 0,
        round_to_nearest          = 1,
        round_toward_infinity     = 2,
        round_toward_neg_infinity = 3
    };

    enum float_denorm_style {
        denorm_indeterminate = -1,
        denorm_absent        = 0,
        denorm_present       = 1
    };

    template<typename _T> struct numeric_limits {
        static const bool is_specialized = false;

        static _T min() throw() { return static_cast<_T>(0); }
        static _T max() throw() { return static_cast<_T>(0); }

        static const int digits = 0;
        static const int digits10 = 0;
        static const bool is_signed = false;
        static const bool is_integer = false;
        static const bool is_exact = false;
        static const int radix = 0;

        static _T epsilon() throw() { return static_cast<_T>(0); }
        static _T round_error() throw() { return static_cast<_T>(0); }

        static const int min_exponent = 0;
        static const int min_exponent10 = 0;
        static const int max_exponent = 0;
        static const int max_exponent10 = 0;

        static const bool has_infinity = false;
        static const bool has_quiet_NaN = false;
        static const bool has_signaling_NaN = false;
        static const float_denorm_style has_denorm = denorm_absent;
        static const bool has_denorm_loss = false;

        static _T infinity() throw()  { return static_cast<_T>(0); }
        static _T quiet_NaN() throw() { return static_cast<_T>(0); }
        static _T signaling_NaN() throw() { return static_cast<_T>(0); }
        static _T denorm_min() throw() { return static_cast<_T>(0); }

        static const bool is_iec559 = false;
        static const bool is_bounded = false;
        static const bool is_modulo = false;

        static const bool traps = false;
        static const bool tinyness_before = false;
        static const float_round_style round_style = round_toward_zero;
    };

    template<typename _T> _T __limits_infinity();
    template<typename _T> _T __limits_quiet_NaN();
    template<typename _T> _T __limits_signaling_NaN();
    template<typename _T> _T __limits_denorm_min();

EOF

$CXX -I$BUILD_DIR \
    -o "$BUILD_DIR/src/gen-num-limits" "$SRC_DIR/src/gen-num-limits.cc" \
     $LDFLAGS

if [ ! -f "$BUILD_DIR/src/gen-num-limits" ]; then
  echo "gen-num-limits failed to build, exiting."
  exit 1
fi

"$BUILD_DIR/src/gen-num-limits" >> $OUT_H

cat <<EOF >> $OUT_H
} // namespace std

#endif // _CPP_NUMERIC_LIMITS
EOF

trait_name=numeric_limits

cat <<EOF > $OUT_C
// Static data members of -*- C++ -*- numeric_limits classes

// Copyright (C) 1999 Cygnus Solutions
//
// This file is part of the GNU ISO C++ Library.  This library 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 2, or (at your option)
// any later version.

// This 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 General Public License for more details.

// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING.  If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.

// As a special exception, you may use this file as part of a free software
// library without restriction.  Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License.  This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.

// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@cmla.ens-cachan.fr>

//
// ISO C++ 14882:1998
// 18.2.1
//

#include <bits/std_limits.h>
namespace std {
EOF

for type_name in bool char 'signed char' 'unsigned char' \
	    short 'unsigned short' int 'unsigned int' \
	    long 'unsigned long' float double 'long double'
    do
     cat <<EOF >> $OUT_C

    const bool $trait_name<$type_name>::is_specialized;
    const int  $trait_name<$type_name>::digits;
    const int  $trait_name<$type_name>::digits10;
    const bool $trait_name<$type_name>::is_signed;
    const bool $trait_name<$type_name>::is_integer;
    const bool $trait_name<$type_name>::is_exact;
    const int  $trait_name<$type_name>::radix;
    const int  $trait_name<$type_name>::min_exponent;
    const int  $trait_name<$type_name>::min_exponent10;
    const int  $trait_name<$type_name>::max_exponent;
    const int  $trait_name<$type_name>::max_exponent10;
    const bool $trait_name<$type_name>::has_infinity;
    const bool $trait_name<$type_name>::has_quiet_NaN;
    const bool $trait_name<$type_name>::has_signaling_NaN;
    const float_denorm_style $trait_name<$type_name>::has_denorm;
    const bool $trait_name<$type_name>::has_denorm_loss;
    const bool $trait_name<$type_name>::is_iec559;
    const bool $trait_name<$type_name>::is_bounded;
    const bool $trait_name<$type_name>::is_modulo;
    const bool $trait_name<$type_name>::traps;
    const bool $trait_name<$type_name>::tinyness_before;
    const float_round_style $trait_name<$type_name>::round_style;
EOF

done

cat <<EOF >> $OUT_C
} // namespace std


EOF
