/***************************************************************************
 *
 * limits.h
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 1994-2008 Rogue Wave Software, Inc.
 * 
 **************************************************************************/

#ifndef _RWSTD_LIMITS_H_INCLUDED
#define _RWSTD_LIMITS_H_INCLUDED


#include <rw/_defs.h>


#if !defined (_RWSTD_NO_PURE_C_HEADERS) || defined (_RWSTD_NO_LIMITS_H)

// 18.2.2, p2
#ifndef CHAR_BIT
#  define CHAR_BIT   _RWSTD_CHAR_BIT
#endif   // CHAR_BIT

#ifndef CHAR_MAX
#  define CHAR_MAX   _RWSTD_CHAR_MAX
#endif   // CHAR_MAX

#ifndef CHAR_MIN
#  define CHAR_MIN   _RWSTD_CHAR_MIN
#endif   // CHAR_MIN

#ifndef SCHAR_MAX
#  define SCHAR_MAX  _RWSTD_SCHAR_MAX
#endif   // SCHAR_MAX

#ifndef SCHAR_MIN
#  define SCHAR_MIN  _RWSTD_SCHAR_MIN
#endif   // SCHAR_MIN

#ifndef UCHAR_MAX
#  define UCHAR_MAX  _RWSTD_UCHAR_MAX
#endif   // UCHAR_MAX

#ifndef SHRT_MAX
#  define SHRT_MAX   _RWSTD_SHRT_MAX
#endif   // SHRT_MAX

#ifndef SHRT_MIN
#  define SHRT_MIN   _RWSTD_SHRT_MIN
#endif   // SHRT_MIN

#ifndef USHRT_MAX
#  define USHRT_MAX  _RWSTD_USHRT_MAX
#endif   // USHRT_MAX

#ifndef INT_MAX
#  define INT_MAX    _RWSTD_INT_MAX
#endif   // INT_MAX

#ifndef INT_MIN
#  define INT_MIN    _RWSTD_INT_MIN
#endif   // INT_MIN

#ifndef UINT_MAX
#  define UINT_MAX   _RWSTD_UINT_MAX
#endif   // UINT_MAX

#ifndef LONG_MAX
#  define LONG_MAX   _RWSTD_LONG_MAX
#endif   // LONG_MAX

#ifndef LONG_MIN
#  define LONG_MIN   _RWSTD_LONG_MIN
#endif   // LONG_MIN

#ifndef ULONG_MAX
#  define ULONG_MAX  _RWSTD_ULONG_MAX
#endif   // ULONG_MAX

#ifndef MB_LEN_MAX
#  define MB_LEN_MAX _RWSTD_MB_LEN_MAX
#endif   // MB_LEN_MAX

#else   // if defined (_RWSTD_NO_DEPRECATED_C_HEADERS)

#  if __GNUC__ > 2
#    pragma GCC system_header
#  endif

#  ifdef __GNUC__
     // use the gcc extension to #include the compiler's <limits.h>
#    include_next <limits.h>

     // include the same file again to get it to #include the system
     // <limits.h> (presumably residing /usr/include/)
#    define _GCC_NEXT_LIMITS_H
#    include_next <limits.h>
#  else
#    include _RWSTD_ANSI_C_LIMITS_H
#  endif   // gcc

#endif   // _RWSTD_NO_DEPRECATED_C_HEADERS

#if defined (__hpux__) || defined (__hpux) || defined (hpux)
#  ifndef _POSIX_PATH_MAX
#    define _POSIX_PATH_MAX 255
#  endif   // _POSIX_PATH_MAX
#endif   // HP-UX

#if (MB_LEN_MAX != _RWSTD_MB_LEN_MAX)
#  undef MB_LEN_MAX
#  define MB_LEN_MAX _RWSTD_MB_LEN_MAX
#endif   // MB_LEN_MAX

#endif   // _RWSTD_LIMITS_H_INCLUDED
