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

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();
        static T max() throw();

        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();
        static T round_error() throw();

        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();
        static T quiet_NaN() throw();
        static T signaling_NaN() throw();
        static T denorm_min() throw();

        static const bool is_iec559 = 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 -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










