// -*- C++ -*-
/***************************************************************************
 *
 * cstdlib - C++ Standard library interface to the ANSI C header stdlib.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-2006 Rogue Wave Software.
 * 
 **************************************************************************/

#include <rw/_defs.h>

#ifndef _RWSTD_NO_PURE_C_HEADERS
#  include <ansi/_cstdlib.h>
#else

#ifndef _RWSTD_NO_DEPRECATED_C_HEADERS

#ifndef _RWSTD_NAMESPACE_STD_OPEN
#define _RWSTD_NAMESPACE_STD_OPEN 15

_RWSTD_NAMESPACE (std) { 

#endif   // _RWSTD_NAMESPACE_STD_OPEN


#include _RWSTD_ANSI_C_STDLIB_H

#ifndef _RWSTD_CSTDLIB_INCLUDED
#define _RWSTD_CSTDLIB_INCLUDED


#ifdef _RWSTD_NO_ABS_LONG

inline long abs (long __x)
{
    return __x < 0L ? -__x : __x;
}

#endif   // _RWSTD_NO_ABS_LONG

#ifdef _RWSTD_NO_DIV_LONG
#  ifndef _RWSTD_NO_LDIV

inline ldiv_t div (long __x, long __y)
{
    return ldiv (__x, __y);
}

#  endif   // _RWSTD_NO_LDIV
#endif   // _RWSTD_NO_DIV_LONG


#endif   // _RWSTD_CSTDLIB_INCLUDED


#if _RWSTD_NAMESPACE_STD_OPEN == 15
#  undef _RWSTD_NAMESPACE_STD_OPEN

}   // namespace std

#endif   // _RWSTD_NAMESPACE_STD_OPEN == 15

#else   // if defined (_RWSTD_NO_DEPRECATED_C_HEADERS)

#ifndef _RWSTD_CSTDLIB_INCLUDED
#define _RWSTD_CSTDLIB_INCLUDED

#include _RWSTD_ANSI_C_STDLIB_H

#undef ldiv

#if !defined (_RWSTD_NO_NAMESPACE) && !defined (_RWSTD_NO_HONOR_STD) && \
    !defined (_RWSTD_NO_USING_LIBC_IN_STD)

namespace std {


#ifdef _RWSTD_NO_ABS_UINT

inline unsigned abs (unsigned __x)
{
    return __x;
}

#endif   // _RWSTD_NO_ABS_UINT

#ifdef _RWSTD_NO_ABS_LONG

inline long abs (long __x)
{
    return __x < 0L ? -__x : __x;
}

#endif   // _RWSTD_NO_ABS_LONG

#ifdef _RWSTD_NO_ABS_ULONG

inline unsigned long abs (unsigned long __x)
{
    return __x;
}

#endif   // _RWSTD_NO_ABS_ULONG

#ifdef _RWSTD_LONG_LONG
#  ifdef _RWSTD_NO_ABS_LLONG

inline _RWSTD_LONG_LONG abs (_RWSTD_LONG_LONG __x)
{
    return __x < (_RWSTD_LONG_LONG)0 ? -__x : __x;
}

#  endif   // _RWSTD_NO_ABS_LLONG

#  ifdef _RWSTD_NO_ABS_ULLONG

inline unsigned _RWSTD_LONG_LONG abs (unsigned _RWSTD_LONG_LONG __x)
{
    return __x;
}

#  endif   // _RWSTD_NO_ABS_ULLONG
#endif   // _RWSTD_LONG_LONG

#ifdef _RWSTD_NO_DIV_LONG
#  ifndef _RWSTD_NO_LDIV

    inline ldiv_t div (long __x, long __y)
    {
        return ldiv (__x, __y);
    }

#  endif   // _RWSTD_NO_LDIV
#endif   // _RWSTD_NO_DIV_LONG

#ifndef _RWSTD_NO_EXTERN_C_COMPATIBILITY
#  ifndef _RWSTD_NO_EXTERN_C_OVERLOAD

    extern "C" {
        typedef int (*__rw_compar_t)(const void*, const void*);
    }

    extern "C++" {

    // 25.4, p3
    inline void*
    bsearch (const void *__key, const void *__base, size_t __n, size_t __size,
             int (*__cmp)(const void*, const void*))
    {
        return ::bsearch (__key, __base, __n, __size,
                          _RWSTD_REINTERPRET_CAST (__rw_compar_t, __cmp));
    }

    // 25.4, p4
    inline void
    qsort (void *__base, size_t __n, size_t __size,
           int (*__cmp)(const void*, const void*))
    {
        return ::qsort (__base, __n, __size,
                        _RWSTD_REINTERPRET_CAST (__rw_compar_t, __cmp));
    }

    }   // extern "C++"

#  endif   // _RWSTD_NO_EXTERN_C_OVERLOAD
#endif   // _RWSTD_NO_EXTERN_C_COMPATIBILITY
    
    // using statements must come after the overloads.
    // working around MSVC6 PR# 27677
    using ::size_t;
    using ::div_t;

#ifndef _RWSTD_NO_LDIV
    using ::ldiv_t;
#endif   // _RWSTD_NO_LDIV

    using ::abort;

#if    defined (_RWSTD_NO_ABS) && defined (_RWSTD_NO_ABS_INT) \
    || defined (__HP_aCC) \
    && defined (_MATH_INCLUDED) && !defined (__MATH_INCLUDED)

// hacking around an HP aCC quirk when using system headers
// in /usr/include without the compiler's wrappers (i.e.,
// when -I/usr/include is on the command line)

}   // namespace std

extern "C" {

inline int abs (int __x)
{
    return __x < 0 ? -__x : __x;
}

}   // extern "C"

namespace std {

#endif   // _RWSTD_NO_ABS && _RWSTD_NO_ABS_INT ...

    using ::abs;

    using ::atexit;
    using ::atof;
    using ::atoi;
    using ::atol;
    using ::bsearch;
    using ::calloc;
    using ::div;
    using ::exit;
    using ::free;
    using ::getenv;
    using ::labs;
    using ::ldiv;
    using ::malloc;
    using ::mblen;
    using ::mbstowcs;

#ifndef _RWSTD_NO_MBTOWC
    using ::mbtowc;
#endif   // _RWSTD_NO_MBTOWC

    using ::qsort;
    using ::rand;
    using ::realloc;
    using ::srand;
    using ::strtod;
    using ::strtol;
    using ::strtoul;
    using ::system;
    using ::wcstombs;
    using ::wctomb;

}   // namespace std

#endif   // !_RWSTD_NO_NAMESPACE && !_RWSTD_NO_HONOR_STD && !_RWSTD_NO_USING_LIBC_IN_STD

#endif   // _RWSTD_CSTDLIB_INCLUDED

#endif   // _RWSTD_NO_DEPRECATED_C_HEADERS

#endif   // _RWSTD_NO_PURE_C_HEADERS
