std_cstdlib.h revision 169691
1// -*- C++ -*- forwarding header.
2
3// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
4// Free Software Foundation, Inc.
5//
6// This file is part of the GNU ISO C++ Library.  This library is free
7// software; you can redistribute it and/or modify it under the
8// terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 2, or (at your option)
10// any later version.
11
12// This library is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15// GNU General Public License for more details.
16
17// You should have received a copy of the GNU General Public License along
18// with this library; see the file COPYING.  If not, write to the Free
19// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20// USA.
21
22// As a special exception, you may use this file as part of a free software
23// library without restriction.  Specifically, if other files instantiate
24// templates or use macros or inline functions from this file, or you compile
25// this file and link it with other files to produce an executable, this
26// file does not by itself cause the resulting executable to be covered by
27// the GNU General Public License.  This exception does not however
28// invalidate any other reasons why the executable file might be covered by
29// the GNU General Public License.
30
31/** @file include/cstdlib
32 *  This is a Standard C++ Library file.  You should @c #include this file
33 *  in your programs, rather than any of the "*.h" implementation files.
34 *
35 *  This is the C++ version of the Standard C Library header @c stdlib.h,
36 *  and its contents are (mostly) the same as that header, but are all
37 *  contained in the namespace @c std (except for names which are defined
38 *  as macros in C).
39 */
40
41//
42// ISO C++ 14882: 20.4.6  C library
43//
44
45#ifndef _GLIBCXX_CSTDLIB
46#define _GLIBCXX_CSTDLIB 1
47
48#pragma GCC system_header
49
50#include <bits/c++config.h>
51#include <cstddef>
52
53#if !_GLIBCXX_HOSTED
54// The C standard does not require a freestanding implementation to
55// provide <stdlib.h>.  However, the C++ standard does still require
56// <cstdlib> -- but only the functionality mentioned in
57// [lib.support.start.term].
58
59#define EXIT_SUCCESS 0
60#define EXIT_FAILURE 1
61
62_GLIBCXX_BEGIN_NAMESPACE(std)
63
64  extern "C" void abort(void);
65  extern "C" int atexit(void (*)());
66  extern "C" void exit(int);
67
68_GLIBCXX_END_NAMESPACE
69
70#else
71
72#include <stdlib.h>
73
74// Get rid of those macros defined in <stdlib.h> in lieu of real functions.
75#undef abort
76#undef abs
77#undef atexit
78#undef atof
79#undef atoi
80#undef atol
81#undef bsearch
82#undef calloc
83#undef div
84#undef exit
85#undef free
86#undef getenv
87#undef labs
88#undef ldiv
89#undef malloc
90#undef mblen
91#undef mbstowcs
92#undef mbtowc
93#undef qsort
94#undef rand
95#undef realloc
96#undef srand
97#undef strtod
98#undef strtol
99#undef strtoul
100#undef system
101#undef wcstombs
102#undef wctomb
103
104_GLIBCXX_BEGIN_NAMESPACE(std)
105
106  using ::div_t;
107  using ::ldiv_t;
108
109  using ::abort;
110  using ::abs;
111  using ::atexit;
112  using ::atof;
113  using ::atoi;
114  using ::atol;
115  using ::bsearch;
116  using ::calloc;
117  using ::div;
118  using ::exit;
119  using ::free;
120  using ::getenv;
121  using ::labs;
122  using ::ldiv;
123  using ::malloc;
124#ifdef _GLIBCXX_HAVE_MBSTATE_T
125  using ::mblen;
126  using ::mbstowcs;
127  using ::mbtowc;
128#endif // _GLIBCXX_HAVE_MBSTATE_T
129  using ::qsort;
130  using ::rand;
131  using ::realloc;
132  using ::srand;
133  using ::strtod;
134  using ::strtol;
135  using ::strtoul;
136  using ::system;
137#ifdef _GLIBCXX_USE_WCHAR_T
138  using ::wcstombs;
139  using ::wctomb;
140#endif // _GLIBCXX_USE_WCHAR_T
141
142  inline long
143  abs(long __i) { return labs(__i); }
144
145  inline ldiv_t
146  div(long __i, long __j) { return ldiv(__i, __j); }
147
148_GLIBCXX_END_NAMESPACE
149
150#if _GLIBCXX_USE_C99
151
152#undef _Exit
153#undef llabs
154#undef lldiv
155#undef atoll
156#undef strtoll
157#undef strtoull
158#undef strtof
159#undef strtold
160
161_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
162
163#if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC
164  using ::lldiv_t;
165#endif
166#if _GLIBCXX_USE_C99_CHECK || _GLIBCXX_USE_C99_DYNAMIC
167  extern "C" void (_Exit)(int);
168#endif
169#if !_GLIBCXX_USE_C99_DYNAMIC
170  using ::_Exit;
171#endif
172
173  inline long long
174  abs(long long __x) { return __x >= 0 ? __x : -__x; }
175
176#if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC
177  using ::llabs;
178
179  inline lldiv_t
180  div(long long __n, long long __d)
181  { lldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; }
182
183  using ::lldiv;
184#endif
185
186#if _GLIBCXX_USE_C99_LONG_LONG_CHECK || _GLIBCXX_USE_C99_LONG_LONG_DYNAMIC
187  extern "C" long long int (atoll)(const char *);
188  extern "C" long long int
189    (strtoll)(const char * restrict, char ** restrict, int);
190  extern "C" unsigned long long int
191    (strtoull)(const char * restrict, char ** restrict, int);
192#endif
193#if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC
194  using ::atoll;
195  using ::strtoll;
196  using ::strtoull;
197#endif
198  using ::strtof;
199  using ::strtold;
200
201_GLIBCXX_END_NAMESPACE
202
203_GLIBCXX_BEGIN_NAMESPACE(std)
204
205#if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC
206  using ::__gnu_cxx::lldiv_t;
207#endif
208  using ::__gnu_cxx::_Exit;
209  using ::__gnu_cxx::abs;
210#if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC
211  using ::__gnu_cxx::llabs;
212  using ::__gnu_cxx::div;
213  using ::__gnu_cxx::lldiv;
214#endif
215  using ::__gnu_cxx::atoll;
216  using ::__gnu_cxx::strtof;
217  using ::__gnu_cxx::strtoll;
218  using ::__gnu_cxx::strtoull;
219  using ::__gnu_cxx::strtold;
220
221_GLIBCXX_END_NAMESPACE
222
223#endif // _GLIBCXX_USE_C99
224
225#endif // !_GLIBCXX_HOSTED
226
227#endif
228