100db7afdSDavid E. O'Brien // -*- C++ -*- forwarding header. 200db7afdSDavid E. O'Brien 3*f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 400db7afdSDavid E. O'Brien // Free Software Foundation, Inc. 500db7afdSDavid E. O'Brien // 600db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library. This library is free 700db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the 800db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the 900db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option) 1000db7afdSDavid E. O'Brien // any later version. 1100db7afdSDavid E. O'Brien 1200db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful, 1300db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of 1400db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1500db7afdSDavid E. O'Brien // GNU General Public License for more details. 1600db7afdSDavid E. O'Brien 1700db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along 1800db7afdSDavid E. O'Brien // with this library; see the file COPYING. If not, write to the Free 19*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 2000db7afdSDavid E. O'Brien // USA. 2100db7afdSDavid E. O'Brien 2200db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software 2300db7afdSDavid E. O'Brien // library without restriction. Specifically, if other files instantiate 2400db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile 2500db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this 2600db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by 2700db7afdSDavid E. O'Brien // the GNU General Public License. This exception does not however 2800db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by 2900db7afdSDavid E. O'Brien // the GNU General Public License. 3000db7afdSDavid E. O'Brien 31*f8a1b7d9SAlexander Kabaev /** @file include/cstdlib 3200db7afdSDavid E. O'Brien * This is a Standard C++ Library file. You should @c #include this file 3300db7afdSDavid E. O'Brien * in your programs, rather than any of the "*.h" implementation files. 3400db7afdSDavid E. O'Brien * 3500db7afdSDavid E. O'Brien * This is the C++ version of the Standard C Library header @c stdlib.h, 3600db7afdSDavid E. O'Brien * and its contents are (mostly) the same as that header, but are all 37*f8a1b7d9SAlexander Kabaev * contained in the namespace @c std (except for names which are defined 38*f8a1b7d9SAlexander Kabaev * as macros in C). 3900db7afdSDavid E. O'Brien */ 4000db7afdSDavid E. O'Brien 41*f8a1b7d9SAlexander Kabaev // 42*f8a1b7d9SAlexander Kabaev // ISO C++ 14882: 20.4.6 C library 43*f8a1b7d9SAlexander Kabaev // 44*f8a1b7d9SAlexander Kabaev 45ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_CSTDLIB 46ffeaf689SAlexander Kabaev #define _GLIBCXX_CSTDLIB 1 4700db7afdSDavid E. O'Brien 4800db7afdSDavid E. O'Brien #pragma GCC system_header 4900db7afdSDavid E. O'Brien 5000db7afdSDavid E. O'Brien #include <bits/c++config.h> 5100db7afdSDavid E. O'Brien #include <cstddef> 5200db7afdSDavid E. O'Brien 53*f8a1b7d9SAlexander Kabaev #if !_GLIBCXX_HOSTED 54*f8a1b7d9SAlexander Kabaev // The C standard does not require a freestanding implementation to 55*f8a1b7d9SAlexander Kabaev // provide <stdlib.h>. However, the C++ standard does still require 56*f8a1b7d9SAlexander Kabaev // <cstdlib> -- but only the functionality mentioned in 57*f8a1b7d9SAlexander Kabaev // [lib.support.start.term]. 58*f8a1b7d9SAlexander Kabaev 59*f8a1b7d9SAlexander Kabaev #define EXIT_SUCCESS 0 60*f8a1b7d9SAlexander Kabaev #define EXIT_FAILURE 1 61*f8a1b7d9SAlexander Kabaev 62*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std) 63*f8a1b7d9SAlexander Kabaev 64*f8a1b7d9SAlexander Kabaev extern "C" void abort(void); 65*f8a1b7d9SAlexander Kabaev extern "C" int atexit(void (*)()); 66*f8a1b7d9SAlexander Kabaev extern "C" void exit(int); 67*f8a1b7d9SAlexander Kabaev 68*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE 69*f8a1b7d9SAlexander Kabaev 70*f8a1b7d9SAlexander Kabaev #else 71*f8a1b7d9SAlexander Kabaev 7200db7afdSDavid E. O'Brien #include <stdlib.h> 7300db7afdSDavid E. O'Brien 7400db7afdSDavid E. O'Brien // Get rid of those macros defined in <stdlib.h> in lieu of real functions. 7500db7afdSDavid E. O'Brien #undef abort 7600db7afdSDavid E. O'Brien #undef abs 7700db7afdSDavid E. O'Brien #undef atexit 7800db7afdSDavid E. O'Brien #undef atof 7900db7afdSDavid E. O'Brien #undef atoi 8000db7afdSDavid E. O'Brien #undef atol 8100db7afdSDavid E. O'Brien #undef bsearch 8200db7afdSDavid E. O'Brien #undef calloc 8300db7afdSDavid E. O'Brien #undef div 8400db7afdSDavid E. O'Brien #undef exit 8500db7afdSDavid E. O'Brien #undef free 8600db7afdSDavid E. O'Brien #undef getenv 8700db7afdSDavid E. O'Brien #undef labs 8800db7afdSDavid E. O'Brien #undef ldiv 8900db7afdSDavid E. O'Brien #undef malloc 9000db7afdSDavid E. O'Brien #undef mblen 9100db7afdSDavid E. O'Brien #undef mbstowcs 9200db7afdSDavid E. O'Brien #undef mbtowc 9300db7afdSDavid E. O'Brien #undef qsort 9400db7afdSDavid E. O'Brien #undef rand 9500db7afdSDavid E. O'Brien #undef realloc 9600db7afdSDavid E. O'Brien #undef srand 9700db7afdSDavid E. O'Brien #undef strtod 9800db7afdSDavid E. O'Brien #undef strtol 9900db7afdSDavid E. O'Brien #undef strtoul 10000db7afdSDavid E. O'Brien #undef system 10100db7afdSDavid E. O'Brien #undef wcstombs 10200db7afdSDavid E. O'Brien #undef wctomb 10300db7afdSDavid E. O'Brien 104*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std) 105*f8a1b7d9SAlexander Kabaev 10600db7afdSDavid E. O'Brien using ::div_t; 10700db7afdSDavid E. O'Brien using ::ldiv_t; 10800db7afdSDavid E. O'Brien 10900db7afdSDavid E. O'Brien using ::abort; 11000db7afdSDavid E. O'Brien using ::abs; 11100db7afdSDavid E. O'Brien using ::atexit; 11200db7afdSDavid E. O'Brien using ::atof; 11300db7afdSDavid E. O'Brien using ::atoi; 11400db7afdSDavid E. O'Brien using ::atol; 11500db7afdSDavid E. O'Brien using ::bsearch; 11600db7afdSDavid E. O'Brien using ::calloc; 11700db7afdSDavid E. O'Brien using ::div; 11800db7afdSDavid E. O'Brien using ::exit; 11900db7afdSDavid E. O'Brien using ::free; 12000db7afdSDavid E. O'Brien using ::getenv; 12100db7afdSDavid E. O'Brien using ::labs; 12200db7afdSDavid E. O'Brien using ::ldiv; 12300db7afdSDavid E. O'Brien using ::malloc; 124ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_HAVE_MBSTATE_T 12500db7afdSDavid E. O'Brien using ::mblen; 12600db7afdSDavid E. O'Brien using ::mbstowcs; 12700db7afdSDavid E. O'Brien using ::mbtowc; 128ffeaf689SAlexander Kabaev #endif // _GLIBCXX_HAVE_MBSTATE_T 12900db7afdSDavid E. O'Brien using ::qsort; 13000db7afdSDavid E. O'Brien using ::rand; 13100db7afdSDavid E. O'Brien using ::realloc; 13200db7afdSDavid E. O'Brien using ::srand; 13300db7afdSDavid E. O'Brien using ::strtod; 13400db7afdSDavid E. O'Brien using ::strtol; 13500db7afdSDavid E. O'Brien using ::strtoul; 13600db7afdSDavid E. O'Brien using ::system; 137ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T 13800db7afdSDavid E. O'Brien using ::wcstombs; 13900db7afdSDavid E. O'Brien using ::wctomb; 140ffeaf689SAlexander Kabaev #endif // _GLIBCXX_USE_WCHAR_T 14100db7afdSDavid E. O'Brien 14200db7afdSDavid E. O'Brien inline long 14300db7afdSDavid E. O'Brien abs(long __i) { return labs(__i); } 14400db7afdSDavid E. O'Brien 14500db7afdSDavid E. O'Brien inline ldiv_t 14600db7afdSDavid E. O'Brien div(long __i, long __j) { return ldiv(__i, __j); } 147*f8a1b7d9SAlexander Kabaev 148*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE 14900db7afdSDavid E. O'Brien 150ffeaf689SAlexander Kabaev #if _GLIBCXX_USE_C99 15100db7afdSDavid E. O'Brien 15200db7afdSDavid E. O'Brien #undef _Exit 15300db7afdSDavid E. O'Brien #undef llabs 15400db7afdSDavid E. O'Brien #undef lldiv 15500db7afdSDavid E. O'Brien #undef atoll 15600db7afdSDavid E. O'Brien #undef strtoll 15700db7afdSDavid E. O'Brien #undef strtoull 15800db7afdSDavid E. O'Brien #undef strtof 15900db7afdSDavid E. O'Brien #undef strtold 16000db7afdSDavid E. O'Brien 161*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) 162*f8a1b7d9SAlexander Kabaev 163ffeaf689SAlexander Kabaev #if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC 16400db7afdSDavid E. O'Brien using ::lldiv_t; 1651b86b14eSAlexander Kabaev #endif 166ffeaf689SAlexander Kabaev #if _GLIBCXX_USE_C99_CHECK || _GLIBCXX_USE_C99_DYNAMIC 1671b86b14eSAlexander Kabaev extern "C" void (_Exit)(int); 1681b86b14eSAlexander Kabaev #endif 169ffeaf689SAlexander Kabaev #if !_GLIBCXX_USE_C99_DYNAMIC 17000db7afdSDavid E. O'Brien using ::_Exit; 1711b86b14eSAlexander Kabaev #endif 17200db7afdSDavid E. O'Brien 17300db7afdSDavid E. O'Brien inline long long 17400db7afdSDavid E. O'Brien abs(long long __x) { return __x >= 0 ? __x : -__x; } 17500db7afdSDavid E. O'Brien 176ffeaf689SAlexander Kabaev #if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC 177*f8a1b7d9SAlexander Kabaev using ::llabs; 178*f8a1b7d9SAlexander Kabaev 17900db7afdSDavid E. O'Brien inline lldiv_t 18000db7afdSDavid E. O'Brien div(long long __n, long long __d) 18100db7afdSDavid E. O'Brien { lldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; } 18200db7afdSDavid E. O'Brien 183*f8a1b7d9SAlexander Kabaev using ::lldiv; 1841b86b14eSAlexander Kabaev #endif 18500db7afdSDavid E. O'Brien 186ffeaf689SAlexander Kabaev #if _GLIBCXX_USE_C99_LONG_LONG_CHECK || _GLIBCXX_USE_C99_LONG_LONG_DYNAMIC 1871b86b14eSAlexander Kabaev extern "C" long long int (atoll)(const char *); 1881b86b14eSAlexander Kabaev extern "C" long long int 1891b86b14eSAlexander Kabaev (strtoll)(const char * restrict, char ** restrict, int); 1901b86b14eSAlexander Kabaev extern "C" unsigned long long int 1911b86b14eSAlexander Kabaev (strtoull)(const char * restrict, char ** restrict, int); 1921b86b14eSAlexander Kabaev #endif 193ffeaf689SAlexander Kabaev #if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC 19400db7afdSDavid E. O'Brien using ::atoll; 19500db7afdSDavid E. O'Brien using ::strtoll; 19600db7afdSDavid E. O'Brien using ::strtoull; 1971b86b14eSAlexander Kabaev #endif 1981b86b14eSAlexander Kabaev using ::strtof; 19900db7afdSDavid E. O'Brien using ::strtold; 20000db7afdSDavid E. O'Brien 201*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE 202*f8a1b7d9SAlexander Kabaev 203*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std) 204*f8a1b7d9SAlexander Kabaev 205ffeaf689SAlexander Kabaev #if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC 206*f8a1b7d9SAlexander Kabaev using ::__gnu_cxx::lldiv_t; 2071b86b14eSAlexander Kabaev #endif 208*f8a1b7d9SAlexander Kabaev using ::__gnu_cxx::_Exit; 209*f8a1b7d9SAlexander Kabaev using ::__gnu_cxx::abs; 210ffeaf689SAlexander Kabaev #if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC 211*f8a1b7d9SAlexander Kabaev using ::__gnu_cxx::llabs; 212*f8a1b7d9SAlexander Kabaev using ::__gnu_cxx::div; 213*f8a1b7d9SAlexander Kabaev using ::__gnu_cxx::lldiv; 2141b86b14eSAlexander Kabaev #endif 215*f8a1b7d9SAlexander Kabaev using ::__gnu_cxx::atoll; 216*f8a1b7d9SAlexander Kabaev using ::__gnu_cxx::strtof; 217*f8a1b7d9SAlexander Kabaev using ::__gnu_cxx::strtoll; 218*f8a1b7d9SAlexander Kabaev using ::__gnu_cxx::strtoull; 219*f8a1b7d9SAlexander Kabaev using ::__gnu_cxx::strtold; 220*f8a1b7d9SAlexander Kabaev 221*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE 222*f8a1b7d9SAlexander Kabaev 223*f8a1b7d9SAlexander Kabaev #endif // _GLIBCXX_USE_C99 224*f8a1b7d9SAlexander Kabaev 225*f8a1b7d9SAlexander Kabaev #endif // !_GLIBCXX_HOSTED 22600db7afdSDavid E. O'Brien 22700db7afdSDavid E. O'Brien #endif 228