// -*- C++ -*-
/***************************************************************************
 *
 * cstdlib - C++ Standard library interface to the ANSI C header stdlib.h
 *
 * $Id: cstdlib 550991 2007-06-26 23:58:07Z sebor $
 *
 ***************************************************************************
 *
 * 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
