1*53ee8cc1Swenshuai.xi /* Copyright (C) 1991-2003,2004,2005,2006,2007 Free Software Foundation, Inc.
2*53ee8cc1Swenshuai.xi This file is part of the GNU C Library.
3*53ee8cc1Swenshuai.xi
4*53ee8cc1Swenshuai.xi The GNU C Library is free software; you can redistribute it and/or
5*53ee8cc1Swenshuai.xi modify it under the terms of the GNU Lesser General Public
6*53ee8cc1Swenshuai.xi License as published by the Free Software Foundation; either
7*53ee8cc1Swenshuai.xi version 2.1 of the License, or (at your option) any later version.
8*53ee8cc1Swenshuai.xi
9*53ee8cc1Swenshuai.xi The GNU C Library is distributed in the hope that it will be useful,
10*53ee8cc1Swenshuai.xi but WITHOUT ANY WARRANTY; without even the implied warranty of
11*53ee8cc1Swenshuai.xi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12*53ee8cc1Swenshuai.xi Lesser General Public License for more details.
13*53ee8cc1Swenshuai.xi
14*53ee8cc1Swenshuai.xi You should have received a copy of the GNU Lesser General Public
15*53ee8cc1Swenshuai.xi License along with the GNU C Library; if not, write to the Free
16*53ee8cc1Swenshuai.xi Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17*53ee8cc1Swenshuai.xi 02111-1307 USA. */
18*53ee8cc1Swenshuai.xi
19*53ee8cc1Swenshuai.xi /*
20*53ee8cc1Swenshuai.xi * ISO C99 Standard: 7.20 General utilities <stdlib.h>
21*53ee8cc1Swenshuai.xi */
22*53ee8cc1Swenshuai.xi
23*53ee8cc1Swenshuai.xi #ifndef _STDLIB_H
24*53ee8cc1Swenshuai.xi
25*53ee8cc1Swenshuai.xi #include <features.h>
26*53ee8cc1Swenshuai.xi
27*53ee8cc1Swenshuai.xi /* Get size_t, wchar_t and NULL from <stddef.h>. */
28*53ee8cc1Swenshuai.xi #define __need_size_t
29*53ee8cc1Swenshuai.xi #ifndef __need_malloc_and_calloc
30*53ee8cc1Swenshuai.xi # define __need_wchar_t
31*53ee8cc1Swenshuai.xi # define __need_NULL
32*53ee8cc1Swenshuai.xi #endif
33*53ee8cc1Swenshuai.xi #include <stddef.h>
34*53ee8cc1Swenshuai.xi
35*53ee8cc1Swenshuai.xi __BEGIN_DECLS
36*53ee8cc1Swenshuai.xi
37*53ee8cc1Swenshuai.xi #ifndef __need_malloc_and_calloc
38*53ee8cc1Swenshuai.xi #define _STDLIB_H 1
39*53ee8cc1Swenshuai.xi
40*53ee8cc1Swenshuai.xi #if defined __USE_XOPEN && !defined _SYS_WAIT_H
41*53ee8cc1Swenshuai.xi /* XPG requires a few symbols from <sys/wait.h> being defined. */
42*53ee8cc1Swenshuai.xi # include <bits/waitflags.h>
43*53ee8cc1Swenshuai.xi # include <bits/waitstatus.h>
44*53ee8cc1Swenshuai.xi
45*53ee8cc1Swenshuai.xi # ifdef __USE_BSD
46*53ee8cc1Swenshuai.xi
47*53ee8cc1Swenshuai.xi /* Lots of hair to allow traditional BSD use of `union wait'
48*53ee8cc1Swenshuai.xi as well as POSIX.1 use of `int' for the status word. */
49*53ee8cc1Swenshuai.xi
50*53ee8cc1Swenshuai.xi # if defined __GNUC__ && !defined __cplusplus
51*53ee8cc1Swenshuai.xi # define __WAIT_INT(status) \
52*53ee8cc1Swenshuai.xi (__extension__ ({ union { __typeof(status) __in; int __i; } __u; \
53*53ee8cc1Swenshuai.xi __u.__in = (status); __u.__i; }))
54*53ee8cc1Swenshuai.xi # else
55*53ee8cc1Swenshuai.xi # define __WAIT_INT(status) (*(int *) &(status))
56*53ee8cc1Swenshuai.xi # endif
57*53ee8cc1Swenshuai.xi
58*53ee8cc1Swenshuai.xi /* This is the type of the argument to `wait'. The funky union
59*53ee8cc1Swenshuai.xi causes redeclarations with ether `int *' or `union wait *' to be
60*53ee8cc1Swenshuai.xi allowed without complaint. __WAIT_STATUS_DEFN is the type used in
61*53ee8cc1Swenshuai.xi the actual function definitions. */
62*53ee8cc1Swenshuai.xi
63*53ee8cc1Swenshuai.xi # if !defined __GNUC__ || __GNUC__ < 2 || defined __cplusplus
64*53ee8cc1Swenshuai.xi # define __WAIT_STATUS void *
65*53ee8cc1Swenshuai.xi # define __WAIT_STATUS_DEFN void *
66*53ee8cc1Swenshuai.xi # else
67*53ee8cc1Swenshuai.xi /* This works in GCC 2.6.1 and later. */
68*53ee8cc1Swenshuai.xi typedef union
69*53ee8cc1Swenshuai.xi {
70*53ee8cc1Swenshuai.xi union wait *__uptr;
71*53ee8cc1Swenshuai.xi int *__iptr;
72*53ee8cc1Swenshuai.xi } __WAIT_STATUS __attribute__ ((__transparent_union__));
73*53ee8cc1Swenshuai.xi # define __WAIT_STATUS_DEFN int *
74*53ee8cc1Swenshuai.xi # endif
75*53ee8cc1Swenshuai.xi
76*53ee8cc1Swenshuai.xi # else /* Don't use BSD. */
77*53ee8cc1Swenshuai.xi
78*53ee8cc1Swenshuai.xi # define __WAIT_INT(status) (status)
79*53ee8cc1Swenshuai.xi # define __WAIT_STATUS int *
80*53ee8cc1Swenshuai.xi # define __WAIT_STATUS_DEFN int *
81*53ee8cc1Swenshuai.xi
82*53ee8cc1Swenshuai.xi # endif /* Use BSD. */
83*53ee8cc1Swenshuai.xi
84*53ee8cc1Swenshuai.xi /* Define the macros <sys/wait.h> also would define this way. */
85*53ee8cc1Swenshuai.xi # define WEXITSTATUS(status) __WEXITSTATUS(__WAIT_INT(status))
86*53ee8cc1Swenshuai.xi # define WTERMSIG(status) __WTERMSIG(__WAIT_INT(status))
87*53ee8cc1Swenshuai.xi # define WSTOPSIG(status) __WSTOPSIG(__WAIT_INT(status))
88*53ee8cc1Swenshuai.xi # define WIFEXITED(status) __WIFEXITED(__WAIT_INT(status))
89*53ee8cc1Swenshuai.xi # define WIFSIGNALED(status) __WIFSIGNALED(__WAIT_INT(status))
90*53ee8cc1Swenshuai.xi # define WIFSTOPPED(status) __WIFSTOPPED(__WAIT_INT(status))
91*53ee8cc1Swenshuai.xi # ifdef __WIFCONTINUED
92*53ee8cc1Swenshuai.xi # define WIFCONTINUED(status) __WIFCONTINUED(__WAIT_INT(status))
93*53ee8cc1Swenshuai.xi # endif
94*53ee8cc1Swenshuai.xi #endif /* X/Open and <sys/wait.h> not included. */
95*53ee8cc1Swenshuai.xi
96*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
97*53ee8cc1Swenshuai.xi /* Returned by `div'. */
98*53ee8cc1Swenshuai.xi typedef struct
99*53ee8cc1Swenshuai.xi {
100*53ee8cc1Swenshuai.xi int quot; /* Quotient. */
101*53ee8cc1Swenshuai.xi int rem; /* Remainder. */
102*53ee8cc1Swenshuai.xi } div_t;
103*53ee8cc1Swenshuai.xi
104*53ee8cc1Swenshuai.xi /* Returned by `ldiv'. */
105*53ee8cc1Swenshuai.xi #ifndef __ldiv_t_defined
106*53ee8cc1Swenshuai.xi typedef struct
107*53ee8cc1Swenshuai.xi {
108*53ee8cc1Swenshuai.xi long int quot; /* Quotient. */
109*53ee8cc1Swenshuai.xi long int rem; /* Remainder. */
110*53ee8cc1Swenshuai.xi } ldiv_t;
111*53ee8cc1Swenshuai.xi # define __ldiv_t_defined 1
112*53ee8cc1Swenshuai.xi #endif
113*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
114*53ee8cc1Swenshuai.xi
115*53ee8cc1Swenshuai.xi #if defined __USE_ISOC99 && !defined __lldiv_t_defined
116*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_C99
117*53ee8cc1Swenshuai.xi /* Returned by `lldiv'. */
118*53ee8cc1Swenshuai.xi __extension__ typedef struct
119*53ee8cc1Swenshuai.xi {
120*53ee8cc1Swenshuai.xi long long int quot; /* Quotient. */
121*53ee8cc1Swenshuai.xi long long int rem; /* Remainder. */
122*53ee8cc1Swenshuai.xi } lldiv_t;
123*53ee8cc1Swenshuai.xi # define __lldiv_t_defined 1
124*53ee8cc1Swenshuai.xi __END_NAMESPACE_C99
125*53ee8cc1Swenshuai.xi #endif
126*53ee8cc1Swenshuai.xi
127*53ee8cc1Swenshuai.xi
128*53ee8cc1Swenshuai.xi /* The largest number rand will return (same as INT_MAX). */
129*53ee8cc1Swenshuai.xi #define RAND_MAX 2147483647
130*53ee8cc1Swenshuai.xi
131*53ee8cc1Swenshuai.xi
132*53ee8cc1Swenshuai.xi /* We define these the same for all machines.
133*53ee8cc1Swenshuai.xi Changes from this to the outside world should be done in `_exit'. */
134*53ee8cc1Swenshuai.xi #define EXIT_FAILURE 1 /* Failing exit status. */
135*53ee8cc1Swenshuai.xi #define EXIT_SUCCESS 0 /* Successful exit status. */
136*53ee8cc1Swenshuai.xi
137*53ee8cc1Swenshuai.xi
138*53ee8cc1Swenshuai.xi /* Maximum length of a multibyte character in the current locale. */
139*53ee8cc1Swenshuai.xi #define MB_CUR_MAX (__ctype_get_mb_cur_max ())
140*53ee8cc1Swenshuai.xi extern size_t __ctype_get_mb_cur_max (void) __THROW __wur;
141*53ee8cc1Swenshuai.xi
142*53ee8cc1Swenshuai.xi
143*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
144*53ee8cc1Swenshuai.xi /* Convert a string to a floating-point number. */
145*53ee8cc1Swenshuai.xi extern double atof (__const char *__nptr)
146*53ee8cc1Swenshuai.xi __THROW __attribute_pure__ __nonnull ((1)) __wur;
147*53ee8cc1Swenshuai.xi /* Convert a string to an integer. */
148*53ee8cc1Swenshuai.xi extern int atoi (__const char *__nptr)
149*53ee8cc1Swenshuai.xi __THROW __attribute_pure__ __nonnull ((1)) __wur;
150*53ee8cc1Swenshuai.xi /* Convert a string to a long integer. */
151*53ee8cc1Swenshuai.xi extern long int atol (__const char *__nptr)
152*53ee8cc1Swenshuai.xi __THROW __attribute_pure__ __nonnull ((1)) __wur;
153*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
154*53ee8cc1Swenshuai.xi
155*53ee8cc1Swenshuai.xi #if defined __USE_ISOC99 || (defined __GLIBC_HAVE_LONG_LONG && defined __USE_MISC)
156*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_C99
157*53ee8cc1Swenshuai.xi /* Convert a string to a long long integer. */
158*53ee8cc1Swenshuai.xi __extension__ extern long long int atoll (__const char *__nptr)
159*53ee8cc1Swenshuai.xi __THROW __attribute_pure__ __nonnull ((1)) __wur;
160*53ee8cc1Swenshuai.xi __END_NAMESPACE_C99
161*53ee8cc1Swenshuai.xi #endif
162*53ee8cc1Swenshuai.xi
163*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
164*53ee8cc1Swenshuai.xi /* Convert a string to a floating-point number. */
165*53ee8cc1Swenshuai.xi extern double strtod (__const char *__restrict __nptr,
166*53ee8cc1Swenshuai.xi char **__restrict __endptr)
167*53ee8cc1Swenshuai.xi __THROW __nonnull ((1)) __wur;
168*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
169*53ee8cc1Swenshuai.xi
170*53ee8cc1Swenshuai.xi #ifdef __USE_ISOC99
171*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_C99
172*53ee8cc1Swenshuai.xi /* Likewise for `float' and `long double' sizes of floating-point numbers. */
173*53ee8cc1Swenshuai.xi extern float strtof (__const char *__restrict __nptr,
174*53ee8cc1Swenshuai.xi char **__restrict __endptr) __THROW __nonnull ((1)) __wur;
175*53ee8cc1Swenshuai.xi
176*53ee8cc1Swenshuai.xi extern long double strtold (__const char *__restrict __nptr,
177*53ee8cc1Swenshuai.xi char **__restrict __endptr)
178*53ee8cc1Swenshuai.xi __THROW __nonnull ((1)) __wur;
179*53ee8cc1Swenshuai.xi __END_NAMESPACE_C99
180*53ee8cc1Swenshuai.xi #endif
181*53ee8cc1Swenshuai.xi
182*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
183*53ee8cc1Swenshuai.xi /* Convert a string to a long integer. */
184*53ee8cc1Swenshuai.xi extern long int strtol (__const char *__restrict __nptr,
185*53ee8cc1Swenshuai.xi char **__restrict __endptr, int __base)
186*53ee8cc1Swenshuai.xi __THROW __nonnull ((1)) __wur;
187*53ee8cc1Swenshuai.xi /* Convert a string to an unsigned long integer. */
188*53ee8cc1Swenshuai.xi extern unsigned long int strtoul (__const char *__restrict __nptr,
189*53ee8cc1Swenshuai.xi char **__restrict __endptr, int __base)
190*53ee8cc1Swenshuai.xi __THROW __nonnull ((1)) __wur;
191*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
192*53ee8cc1Swenshuai.xi
193*53ee8cc1Swenshuai.xi #if defined __GLIBC_HAVE_LONG_LONG && defined __USE_BSD
194*53ee8cc1Swenshuai.xi /* Convert a string to a quadword integer. */
195*53ee8cc1Swenshuai.xi __extension__
196*53ee8cc1Swenshuai.xi extern long long int strtoq (__const char *__restrict __nptr,
197*53ee8cc1Swenshuai.xi char **__restrict __endptr, int __base)
198*53ee8cc1Swenshuai.xi __THROW __nonnull ((1)) __wur;
199*53ee8cc1Swenshuai.xi /* Convert a string to an unsigned quadword integer. */
200*53ee8cc1Swenshuai.xi __extension__
201*53ee8cc1Swenshuai.xi extern unsigned long long int strtouq (__const char *__restrict __nptr,
202*53ee8cc1Swenshuai.xi char **__restrict __endptr, int __base)
203*53ee8cc1Swenshuai.xi __THROW __nonnull ((1)) __wur;
204*53ee8cc1Swenshuai.xi #endif /* GCC and use BSD. */
205*53ee8cc1Swenshuai.xi
206*53ee8cc1Swenshuai.xi #if defined __USE_ISOC99 || (defined __GLIBC_HAVE_LONG_LONG && defined __USE_MISC)
207*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_C99
208*53ee8cc1Swenshuai.xi /* Convert a string to a quadword integer. */
209*53ee8cc1Swenshuai.xi __extension__
210*53ee8cc1Swenshuai.xi extern long long int strtoll (__const char *__restrict __nptr,
211*53ee8cc1Swenshuai.xi char **__restrict __endptr, int __base)
212*53ee8cc1Swenshuai.xi __THROW __nonnull ((1)) __wur;
213*53ee8cc1Swenshuai.xi /* Convert a string to an unsigned quadword integer. */
214*53ee8cc1Swenshuai.xi __extension__
215*53ee8cc1Swenshuai.xi extern unsigned long long int strtoull (__const char *__restrict __nptr,
216*53ee8cc1Swenshuai.xi char **__restrict __endptr, int __base)
217*53ee8cc1Swenshuai.xi __THROW __nonnull ((1)) __wur;
218*53ee8cc1Swenshuai.xi __END_NAMESPACE_C99
219*53ee8cc1Swenshuai.xi #endif /* ISO C99 or GCC and use MISC. */
220*53ee8cc1Swenshuai.xi
221*53ee8cc1Swenshuai.xi
222*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
223*53ee8cc1Swenshuai.xi /* The concept of one static locale per category is not very well
224*53ee8cc1Swenshuai.xi thought out. Many applications will need to process its data using
225*53ee8cc1Swenshuai.xi information from several different locales. Another application is
226*53ee8cc1Swenshuai.xi the implementation of the internationalization handling in the
227*53ee8cc1Swenshuai.xi upcoming ISO C++ standard library. To support this another set of
228*53ee8cc1Swenshuai.xi the functions using locale data exist which have an additional
229*53ee8cc1Swenshuai.xi argument.
230*53ee8cc1Swenshuai.xi
231*53ee8cc1Swenshuai.xi Attention: all these functions are *not* standardized in any form.
232*53ee8cc1Swenshuai.xi This is a proof-of-concept implementation. */
233*53ee8cc1Swenshuai.xi
234*53ee8cc1Swenshuai.xi /* Structure for reentrant locale using functions. This is an
235*53ee8cc1Swenshuai.xi (almost) opaque type for the user level programs. */
236*53ee8cc1Swenshuai.xi # include <xlocale.h>
237*53ee8cc1Swenshuai.xi
238*53ee8cc1Swenshuai.xi /* Special versions of the functions above which take the locale to
239*53ee8cc1Swenshuai.xi use as an additional parameter. */
240*53ee8cc1Swenshuai.xi extern long int strtol_l (__const char *__restrict __nptr,
241*53ee8cc1Swenshuai.xi char **__restrict __endptr, int __base,
242*53ee8cc1Swenshuai.xi __locale_t __loc) __THROW __nonnull ((1, 4)) __wur;
243*53ee8cc1Swenshuai.xi
244*53ee8cc1Swenshuai.xi extern unsigned long int strtoul_l (__const char *__restrict __nptr,
245*53ee8cc1Swenshuai.xi char **__restrict __endptr,
246*53ee8cc1Swenshuai.xi int __base, __locale_t __loc)
247*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 4)) __wur;
248*53ee8cc1Swenshuai.xi
249*53ee8cc1Swenshuai.xi __extension__
250*53ee8cc1Swenshuai.xi extern long long int strtoll_l (__const char *__restrict __nptr,
251*53ee8cc1Swenshuai.xi char **__restrict __endptr, int __base,
252*53ee8cc1Swenshuai.xi __locale_t __loc)
253*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 4)) __wur;
254*53ee8cc1Swenshuai.xi
255*53ee8cc1Swenshuai.xi __extension__
256*53ee8cc1Swenshuai.xi extern unsigned long long int strtoull_l (__const char *__restrict __nptr,
257*53ee8cc1Swenshuai.xi char **__restrict __endptr,
258*53ee8cc1Swenshuai.xi int __base, __locale_t __loc)
259*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 4)) __wur;
260*53ee8cc1Swenshuai.xi
261*53ee8cc1Swenshuai.xi extern double strtod_l (__const char *__restrict __nptr,
262*53ee8cc1Swenshuai.xi char **__restrict __endptr, __locale_t __loc)
263*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 3)) __wur;
264*53ee8cc1Swenshuai.xi
265*53ee8cc1Swenshuai.xi extern float strtof_l (__const char *__restrict __nptr,
266*53ee8cc1Swenshuai.xi char **__restrict __endptr, __locale_t __loc)
267*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 3)) __wur;
268*53ee8cc1Swenshuai.xi
269*53ee8cc1Swenshuai.xi extern long double strtold_l (__const char *__restrict __nptr,
270*53ee8cc1Swenshuai.xi char **__restrict __endptr,
271*53ee8cc1Swenshuai.xi __locale_t __loc)
272*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 3)) __wur;
273*53ee8cc1Swenshuai.xi #endif /* GNU */
274*53ee8cc1Swenshuai.xi
275*53ee8cc1Swenshuai.xi
276*53ee8cc1Swenshuai.xi #ifdef __USE_EXTERN_INLINES
277*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
278*53ee8cc1Swenshuai.xi __extern_inline double
__NTH(atof (__const char * __nptr))279*53ee8cc1Swenshuai.xi __NTH (atof (__const char *__nptr))
280*53ee8cc1Swenshuai.xi {
281*53ee8cc1Swenshuai.xi return strtod (__nptr, (char **) NULL);
282*53ee8cc1Swenshuai.xi }
283*53ee8cc1Swenshuai.xi __extern_inline int
__NTH(atoi (__const char * __nptr))284*53ee8cc1Swenshuai.xi __NTH (atoi (__const char *__nptr))
285*53ee8cc1Swenshuai.xi {
286*53ee8cc1Swenshuai.xi return (int) strtol (__nptr, (char **) NULL, 10);
287*53ee8cc1Swenshuai.xi }
288*53ee8cc1Swenshuai.xi __extern_inline long int
__NTH(atol (__const char * __nptr))289*53ee8cc1Swenshuai.xi __NTH (atol (__const char *__nptr))
290*53ee8cc1Swenshuai.xi {
291*53ee8cc1Swenshuai.xi return strtol (__nptr, (char **) NULL, 10);
292*53ee8cc1Swenshuai.xi }
293*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
294*53ee8cc1Swenshuai.xi
295*53ee8cc1Swenshuai.xi # if defined __USE_MISC || defined __USE_ISOC99
296*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_C99
297*53ee8cc1Swenshuai.xi __extension__ __extern_inline long long int
__NTH(atoll (__const char * __nptr))298*53ee8cc1Swenshuai.xi __NTH (atoll (__const char *__nptr))
299*53ee8cc1Swenshuai.xi {
300*53ee8cc1Swenshuai.xi return strtoll (__nptr, (char **) NULL, 10);
301*53ee8cc1Swenshuai.xi }
302*53ee8cc1Swenshuai.xi __END_NAMESPACE_C99
303*53ee8cc1Swenshuai.xi # endif
304*53ee8cc1Swenshuai.xi #endif /* Optimizing and Inlining. */
305*53ee8cc1Swenshuai.xi
306*53ee8cc1Swenshuai.xi
307*53ee8cc1Swenshuai.xi #if defined __USE_SVID || defined __USE_XOPEN_EXTENDED
308*53ee8cc1Swenshuai.xi /* Convert N to base 64 using the digits "./0-9A-Za-z", least-significant
309*53ee8cc1Swenshuai.xi digit first. Returns a pointer to static storage overwritten by the
310*53ee8cc1Swenshuai.xi next call. */
311*53ee8cc1Swenshuai.xi extern char *l64a (long int __n) __THROW __wur;
312*53ee8cc1Swenshuai.xi
313*53ee8cc1Swenshuai.xi /* Read a number from a string S in base 64 as above. */
314*53ee8cc1Swenshuai.xi extern long int a64l (__const char *__s)
315*53ee8cc1Swenshuai.xi __THROW __attribute_pure__ __nonnull ((1)) __wur;
316*53ee8cc1Swenshuai.xi
317*53ee8cc1Swenshuai.xi #endif /* Use SVID || extended X/Open. */
318*53ee8cc1Swenshuai.xi
319*53ee8cc1Swenshuai.xi #if defined __USE_SVID || defined __USE_XOPEN_EXTENDED || defined __USE_BSD
320*53ee8cc1Swenshuai.xi # include <sys/types.h> /* we need int32_t... */
321*53ee8cc1Swenshuai.xi
322*53ee8cc1Swenshuai.xi /* These are the functions that actually do things. The `random', `srandom',
323*53ee8cc1Swenshuai.xi `initstate' and `setstate' functions are those from BSD Unices.
324*53ee8cc1Swenshuai.xi The `rand' and `srand' functions are required by the ANSI standard.
325*53ee8cc1Swenshuai.xi We provide both interfaces to the same random number generator. */
326*53ee8cc1Swenshuai.xi /* Return a random long integer between 0 and RAND_MAX inclusive. */
327*53ee8cc1Swenshuai.xi extern long int random (void) __THROW;
328*53ee8cc1Swenshuai.xi
329*53ee8cc1Swenshuai.xi /* Seed the random number generator with the given number. */
330*53ee8cc1Swenshuai.xi extern void srandom (unsigned int __seed) __THROW;
331*53ee8cc1Swenshuai.xi
332*53ee8cc1Swenshuai.xi /* Initialize the random number generator to use state buffer STATEBUF,
333*53ee8cc1Swenshuai.xi of length STATELEN, and seed it with SEED. Optimal lengths are 8, 16,
334*53ee8cc1Swenshuai.xi 32, 64, 128 and 256, the bigger the better; values less than 8 will
335*53ee8cc1Swenshuai.xi cause an error and values greater than 256 will be rounded down. */
336*53ee8cc1Swenshuai.xi extern char *initstate (unsigned int __seed, char *__statebuf,
337*53ee8cc1Swenshuai.xi size_t __statelen) __THROW __nonnull ((2));
338*53ee8cc1Swenshuai.xi
339*53ee8cc1Swenshuai.xi /* Switch the random number generator to state buffer STATEBUF,
340*53ee8cc1Swenshuai.xi which should have been previously initialized by `initstate'. */
341*53ee8cc1Swenshuai.xi extern char *setstate (char *__statebuf) __THROW __nonnull ((1));
342*53ee8cc1Swenshuai.xi
343*53ee8cc1Swenshuai.xi
344*53ee8cc1Swenshuai.xi # ifdef __USE_MISC
345*53ee8cc1Swenshuai.xi /* Reentrant versions of the `random' family of functions.
346*53ee8cc1Swenshuai.xi These functions all use the following data structure to contain
347*53ee8cc1Swenshuai.xi state, rather than global state variables. */
348*53ee8cc1Swenshuai.xi
349*53ee8cc1Swenshuai.xi struct random_data
350*53ee8cc1Swenshuai.xi {
351*53ee8cc1Swenshuai.xi int32_t *fptr; /* Front pointer. */
352*53ee8cc1Swenshuai.xi int32_t *rptr; /* Rear pointer. */
353*53ee8cc1Swenshuai.xi int32_t *state; /* Array of state values. */
354*53ee8cc1Swenshuai.xi int rand_type; /* Type of random number generator. */
355*53ee8cc1Swenshuai.xi int rand_deg; /* Degree of random number generator. */
356*53ee8cc1Swenshuai.xi int rand_sep; /* Distance between front and rear. */
357*53ee8cc1Swenshuai.xi int32_t *end_ptr; /* Pointer behind state table. */
358*53ee8cc1Swenshuai.xi };
359*53ee8cc1Swenshuai.xi
360*53ee8cc1Swenshuai.xi extern int random_r (struct random_data *__restrict __buf,
361*53ee8cc1Swenshuai.xi int32_t *__restrict __result) __THROW __nonnull ((1, 2));
362*53ee8cc1Swenshuai.xi
363*53ee8cc1Swenshuai.xi extern int srandom_r (unsigned int __seed, struct random_data *__buf)
364*53ee8cc1Swenshuai.xi __THROW __nonnull ((2));
365*53ee8cc1Swenshuai.xi
366*53ee8cc1Swenshuai.xi extern int initstate_r (unsigned int __seed, char *__restrict __statebuf,
367*53ee8cc1Swenshuai.xi size_t __statelen,
368*53ee8cc1Swenshuai.xi struct random_data *__restrict __buf)
369*53ee8cc1Swenshuai.xi __THROW __nonnull ((2, 4));
370*53ee8cc1Swenshuai.xi
371*53ee8cc1Swenshuai.xi extern int setstate_r (char *__restrict __statebuf,
372*53ee8cc1Swenshuai.xi struct random_data *__restrict __buf)
373*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 2));
374*53ee8cc1Swenshuai.xi # endif /* Use misc. */
375*53ee8cc1Swenshuai.xi #endif /* Use SVID || extended X/Open || BSD. */
376*53ee8cc1Swenshuai.xi
377*53ee8cc1Swenshuai.xi
378*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
379*53ee8cc1Swenshuai.xi /* Return a random integer between 0 and RAND_MAX inclusive. */
380*53ee8cc1Swenshuai.xi extern int rand (void) __THROW;
381*53ee8cc1Swenshuai.xi /* Seed the random number generator with the given number. */
382*53ee8cc1Swenshuai.xi extern void srand (unsigned int __seed) __THROW;
383*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
384*53ee8cc1Swenshuai.xi
385*53ee8cc1Swenshuai.xi #ifdef __USE_POSIX
386*53ee8cc1Swenshuai.xi /* Reentrant interface according to POSIX.1. */
387*53ee8cc1Swenshuai.xi extern int rand_r (unsigned int *__seed) __THROW;
388*53ee8cc1Swenshuai.xi #endif
389*53ee8cc1Swenshuai.xi
390*53ee8cc1Swenshuai.xi
391*53ee8cc1Swenshuai.xi #if defined __USE_SVID || defined __USE_XOPEN
392*53ee8cc1Swenshuai.xi /* System V style 48-bit random number generator functions. */
393*53ee8cc1Swenshuai.xi
394*53ee8cc1Swenshuai.xi /* Return non-negative, double-precision floating-point value in [0.0,1.0). */
395*53ee8cc1Swenshuai.xi extern double drand48 (void) __THROW;
396*53ee8cc1Swenshuai.xi extern double erand48 (unsigned short int __xsubi[3]) __THROW __nonnull ((1));
397*53ee8cc1Swenshuai.xi
398*53ee8cc1Swenshuai.xi /* Return non-negative, long integer in [0,2^31). */
399*53ee8cc1Swenshuai.xi extern long int lrand48 (void) __THROW;
400*53ee8cc1Swenshuai.xi extern long int nrand48 (unsigned short int __xsubi[3])
401*53ee8cc1Swenshuai.xi __THROW __nonnull ((1));
402*53ee8cc1Swenshuai.xi
403*53ee8cc1Swenshuai.xi /* Return signed, long integers in [-2^31,2^31). */
404*53ee8cc1Swenshuai.xi extern long int mrand48 (void) __THROW;
405*53ee8cc1Swenshuai.xi extern long int jrand48 (unsigned short int __xsubi[3])
406*53ee8cc1Swenshuai.xi __THROW __nonnull ((1));
407*53ee8cc1Swenshuai.xi
408*53ee8cc1Swenshuai.xi /* Seed random number generator. */
409*53ee8cc1Swenshuai.xi extern void srand48 (long int __seedval) __THROW;
410*53ee8cc1Swenshuai.xi extern unsigned short int *seed48 (unsigned short int __seed16v[3])
411*53ee8cc1Swenshuai.xi __THROW __nonnull ((1));
412*53ee8cc1Swenshuai.xi extern void lcong48 (unsigned short int __param[7]) __THROW __nonnull ((1));
413*53ee8cc1Swenshuai.xi
414*53ee8cc1Swenshuai.xi # ifdef __USE_MISC
415*53ee8cc1Swenshuai.xi /* Data structure for communication with thread safe versions. This
416*53ee8cc1Swenshuai.xi type is to be regarded as opaque. It's only exported because users
417*53ee8cc1Swenshuai.xi have to allocate objects of this type. */
418*53ee8cc1Swenshuai.xi struct drand48_data
419*53ee8cc1Swenshuai.xi {
420*53ee8cc1Swenshuai.xi unsigned short int __x[3]; /* Current state. */
421*53ee8cc1Swenshuai.xi unsigned short int __old_x[3]; /* Old state. */
422*53ee8cc1Swenshuai.xi unsigned short int __c; /* Additive const. in congruential formula. */
423*53ee8cc1Swenshuai.xi unsigned short int __init; /* Flag for initializing. */
424*53ee8cc1Swenshuai.xi unsigned long long int __a; /* Factor in congruential formula. */
425*53ee8cc1Swenshuai.xi };
426*53ee8cc1Swenshuai.xi
427*53ee8cc1Swenshuai.xi /* Return non-negative, double-precision floating-point value in [0.0,1.0). */
428*53ee8cc1Swenshuai.xi extern int drand48_r (struct drand48_data *__restrict __buffer,
429*53ee8cc1Swenshuai.xi double *__restrict __result) __THROW __nonnull ((1, 2));
430*53ee8cc1Swenshuai.xi extern int erand48_r (unsigned short int __xsubi[3],
431*53ee8cc1Swenshuai.xi struct drand48_data *__restrict __buffer,
432*53ee8cc1Swenshuai.xi double *__restrict __result) __THROW __nonnull ((1, 2));
433*53ee8cc1Swenshuai.xi
434*53ee8cc1Swenshuai.xi /* Return non-negative, long integer in [0,2^31). */
435*53ee8cc1Swenshuai.xi extern int lrand48_r (struct drand48_data *__restrict __buffer,
436*53ee8cc1Swenshuai.xi long int *__restrict __result)
437*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 2));
438*53ee8cc1Swenshuai.xi extern int nrand48_r (unsigned short int __xsubi[3],
439*53ee8cc1Swenshuai.xi struct drand48_data *__restrict __buffer,
440*53ee8cc1Swenshuai.xi long int *__restrict __result)
441*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 2));
442*53ee8cc1Swenshuai.xi
443*53ee8cc1Swenshuai.xi /* Return signed, long integers in [-2^31,2^31). */
444*53ee8cc1Swenshuai.xi extern int mrand48_r (struct drand48_data *__restrict __buffer,
445*53ee8cc1Swenshuai.xi long int *__restrict __result)
446*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 2));
447*53ee8cc1Swenshuai.xi extern int jrand48_r (unsigned short int __xsubi[3],
448*53ee8cc1Swenshuai.xi struct drand48_data *__restrict __buffer,
449*53ee8cc1Swenshuai.xi long int *__restrict __result)
450*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 2));
451*53ee8cc1Swenshuai.xi
452*53ee8cc1Swenshuai.xi /* Seed random number generator. */
453*53ee8cc1Swenshuai.xi extern int srand48_r (long int __seedval, struct drand48_data *__buffer)
454*53ee8cc1Swenshuai.xi __THROW __nonnull ((2));
455*53ee8cc1Swenshuai.xi
456*53ee8cc1Swenshuai.xi extern int seed48_r (unsigned short int __seed16v[3],
457*53ee8cc1Swenshuai.xi struct drand48_data *__buffer) __THROW __nonnull ((1, 2));
458*53ee8cc1Swenshuai.xi
459*53ee8cc1Swenshuai.xi extern int lcong48_r (unsigned short int __param[7],
460*53ee8cc1Swenshuai.xi struct drand48_data *__buffer)
461*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 2));
462*53ee8cc1Swenshuai.xi # endif /* Use misc. */
463*53ee8cc1Swenshuai.xi #endif /* Use SVID or X/Open. */
464*53ee8cc1Swenshuai.xi
465*53ee8cc1Swenshuai.xi #endif /* don't just need malloc and calloc */
466*53ee8cc1Swenshuai.xi
467*53ee8cc1Swenshuai.xi #ifndef __malloc_and_calloc_defined
468*53ee8cc1Swenshuai.xi # define __malloc_and_calloc_defined
469*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
470*53ee8cc1Swenshuai.xi /* Allocate SIZE bytes of memory. */
471*53ee8cc1Swenshuai.xi extern void *malloc (size_t __size) __THROW __attribute_malloc__ __wur;
472*53ee8cc1Swenshuai.xi /* Allocate NMEMB elements of SIZE bytes each, all initialized to 0. */
473*53ee8cc1Swenshuai.xi extern void *calloc (size_t __nmemb, size_t __size)
474*53ee8cc1Swenshuai.xi __THROW __attribute_malloc__ __wur;
475*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
476*53ee8cc1Swenshuai.xi #endif
477*53ee8cc1Swenshuai.xi
478*53ee8cc1Swenshuai.xi #ifndef __need_malloc_and_calloc
479*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
480*53ee8cc1Swenshuai.xi /* Re-allocate the previously allocated block
481*53ee8cc1Swenshuai.xi in PTR, making the new block SIZE bytes long. */
482*53ee8cc1Swenshuai.xi /* __attribute_malloc__ is not used, because if realloc returns
483*53ee8cc1Swenshuai.xi the same pointer that was passed to it, aliasing needs to be allowed
484*53ee8cc1Swenshuai.xi between objects pointed by the old and new pointers. */
485*53ee8cc1Swenshuai.xi extern void *realloc (void *__ptr, size_t __size)
486*53ee8cc1Swenshuai.xi __THROW __attribute_warn_unused_result__;
487*53ee8cc1Swenshuai.xi /* Free a block allocated by `malloc', `realloc' or `calloc'. */
488*53ee8cc1Swenshuai.xi extern void free (void *__ptr) __THROW;
489*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
490*53ee8cc1Swenshuai.xi
491*53ee8cc1Swenshuai.xi #ifdef __USE_MISC
492*53ee8cc1Swenshuai.xi /* Free a block. An alias for `free'. (Sun Unices). */
493*53ee8cc1Swenshuai.xi extern void cfree (void *__ptr) __THROW;
494*53ee8cc1Swenshuai.xi #endif /* Use misc. */
495*53ee8cc1Swenshuai.xi
496*53ee8cc1Swenshuai.xi #if defined __USE_GNU || defined __USE_BSD || defined __USE_MISC
497*53ee8cc1Swenshuai.xi # include <alloca.h>
498*53ee8cc1Swenshuai.xi #endif /* Use GNU, BSD, or misc. */
499*53ee8cc1Swenshuai.xi
500*53ee8cc1Swenshuai.xi #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
501*53ee8cc1Swenshuai.xi /* Allocate SIZE bytes on a page boundary. The storage cannot be freed. */
502*53ee8cc1Swenshuai.xi extern void *valloc (size_t __size) __THROW __attribute_malloc__ __wur;
503*53ee8cc1Swenshuai.xi #endif
504*53ee8cc1Swenshuai.xi
505*53ee8cc1Swenshuai.xi #ifdef __USE_XOPEN2K
506*53ee8cc1Swenshuai.xi /* Allocate memory of SIZE bytes with an alignment of ALIGNMENT. */
507*53ee8cc1Swenshuai.xi extern int posix_memalign (void **__memptr, size_t __alignment, size_t __size)
508*53ee8cc1Swenshuai.xi __THROW __nonnull ((1)) __wur;
509*53ee8cc1Swenshuai.xi #endif
510*53ee8cc1Swenshuai.xi
511*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
512*53ee8cc1Swenshuai.xi /* Abort execution and generate a core-dump. */
513*53ee8cc1Swenshuai.xi extern void abort (void) __THROW __attribute__ ((__noreturn__));
514*53ee8cc1Swenshuai.xi
515*53ee8cc1Swenshuai.xi
516*53ee8cc1Swenshuai.xi /* Register a function to be called when `exit' is called. */
517*53ee8cc1Swenshuai.xi extern int atexit (void (*__func) (void)) __THROW __nonnull ((1));
518*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
519*53ee8cc1Swenshuai.xi
520*53ee8cc1Swenshuai.xi #ifdef __USE_MISC
521*53ee8cc1Swenshuai.xi /* Register a function to be called with the status
522*53ee8cc1Swenshuai.xi given to `exit' and the given argument. */
523*53ee8cc1Swenshuai.xi extern int on_exit (void (*__func) (int __status, void *__arg), void *__arg)
524*53ee8cc1Swenshuai.xi __THROW __nonnull ((1));
525*53ee8cc1Swenshuai.xi #endif
526*53ee8cc1Swenshuai.xi
527*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
528*53ee8cc1Swenshuai.xi /* Call all functions registered with `atexit' and `on_exit',
529*53ee8cc1Swenshuai.xi in the reverse of the order in which they were registered
530*53ee8cc1Swenshuai.xi perform stdio cleanup, and terminate program execution with STATUS. */
531*53ee8cc1Swenshuai.xi extern void exit (int __status) __THROW __attribute__ ((__noreturn__));
532*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
533*53ee8cc1Swenshuai.xi
534*53ee8cc1Swenshuai.xi #ifdef __USE_ISOC99
535*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_C99
536*53ee8cc1Swenshuai.xi /* Terminate the program with STATUS without calling any of the
537*53ee8cc1Swenshuai.xi functions registered with `atexit' or `on_exit'. */
538*53ee8cc1Swenshuai.xi extern void _Exit (int __status) __THROW __attribute__ ((__noreturn__));
539*53ee8cc1Swenshuai.xi __END_NAMESPACE_C99
540*53ee8cc1Swenshuai.xi #endif
541*53ee8cc1Swenshuai.xi
542*53ee8cc1Swenshuai.xi
543*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
544*53ee8cc1Swenshuai.xi /* Return the value of envariable NAME, or NULL if it doesn't exist. */
545*53ee8cc1Swenshuai.xi extern char *getenv (__const char *__name) __THROW __nonnull ((1)) __wur;
546*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
547*53ee8cc1Swenshuai.xi
548*53ee8cc1Swenshuai.xi /* This function is similar to the above but returns NULL if the
549*53ee8cc1Swenshuai.xi programs is running with SUID or SGID enabled. */
550*53ee8cc1Swenshuai.xi extern char *__secure_getenv (__const char *__name)
551*53ee8cc1Swenshuai.xi __THROW __nonnull ((1)) __wur;
552*53ee8cc1Swenshuai.xi
553*53ee8cc1Swenshuai.xi #if defined __USE_SVID || defined __USE_XOPEN
554*53ee8cc1Swenshuai.xi /* The SVID says this is in <stdio.h>, but this seems a better place. */
555*53ee8cc1Swenshuai.xi /* Put STRING, which is of the form "NAME=VALUE", in the environment.
556*53ee8cc1Swenshuai.xi If there is no `=', remove NAME from the environment. */
557*53ee8cc1Swenshuai.xi extern int putenv (char *__string) __THROW __nonnull ((1));
558*53ee8cc1Swenshuai.xi #endif
559*53ee8cc1Swenshuai.xi
560*53ee8cc1Swenshuai.xi #if defined __USE_BSD || defined __USE_XOPEN2K
561*53ee8cc1Swenshuai.xi /* Set NAME to VALUE in the environment.
562*53ee8cc1Swenshuai.xi If REPLACE is nonzero, overwrite an existing value. */
563*53ee8cc1Swenshuai.xi extern int setenv (__const char *__name, __const char *__value, int __replace)
564*53ee8cc1Swenshuai.xi __THROW __nonnull ((2));
565*53ee8cc1Swenshuai.xi
566*53ee8cc1Swenshuai.xi /* Remove the variable NAME from the environment. */
567*53ee8cc1Swenshuai.xi extern int unsetenv (__const char *__name) __THROW;
568*53ee8cc1Swenshuai.xi #endif
569*53ee8cc1Swenshuai.xi
570*53ee8cc1Swenshuai.xi #ifdef __USE_MISC
571*53ee8cc1Swenshuai.xi /* The `clearenv' was planned to be added to POSIX.1 but probably
572*53ee8cc1Swenshuai.xi never made it. Nevertheless the POSIX.9 standard (POSIX bindings
573*53ee8cc1Swenshuai.xi for Fortran 77) requires this function. */
574*53ee8cc1Swenshuai.xi extern int clearenv (void) __THROW;
575*53ee8cc1Swenshuai.xi #endif
576*53ee8cc1Swenshuai.xi
577*53ee8cc1Swenshuai.xi
578*53ee8cc1Swenshuai.xi #if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
579*53ee8cc1Swenshuai.xi /* Generate a unique temporary file name from TEMPLATE.
580*53ee8cc1Swenshuai.xi The last six characters of TEMPLATE must be "XXXXXX";
581*53ee8cc1Swenshuai.xi they are replaced with a string that makes the file name unique.
582*53ee8cc1Swenshuai.xi Returns TEMPLATE, or a null pointer if it cannot get a unique file name. */
583*53ee8cc1Swenshuai.xi extern char *mktemp (char *__template) __THROW __nonnull ((1)) __wur;
584*53ee8cc1Swenshuai.xi
585*53ee8cc1Swenshuai.xi /* Generate a unique temporary file name from TEMPLATE.
586*53ee8cc1Swenshuai.xi The last six characters of TEMPLATE must be "XXXXXX";
587*53ee8cc1Swenshuai.xi they are replaced with a string that makes the filename unique.
588*53ee8cc1Swenshuai.xi Returns a file descriptor open on the file for reading and writing,
589*53ee8cc1Swenshuai.xi or -1 if it cannot create a uniquely-named file.
590*53ee8cc1Swenshuai.xi
591*53ee8cc1Swenshuai.xi This function is a possible cancellation points and therefore not
592*53ee8cc1Swenshuai.xi marked with __THROW. */
593*53ee8cc1Swenshuai.xi # ifndef __USE_FILE_OFFSET64
594*53ee8cc1Swenshuai.xi extern int mkstemp (char *__template) __nonnull ((1)) __wur;
595*53ee8cc1Swenshuai.xi # else
596*53ee8cc1Swenshuai.xi # ifdef __REDIRECT
597*53ee8cc1Swenshuai.xi extern int __REDIRECT (mkstemp, (char *__template), mkstemp64)
598*53ee8cc1Swenshuai.xi __nonnull ((1)) __wur;
599*53ee8cc1Swenshuai.xi # else
600*53ee8cc1Swenshuai.xi # define mkstemp mkstemp64
601*53ee8cc1Swenshuai.xi # endif
602*53ee8cc1Swenshuai.xi # endif
603*53ee8cc1Swenshuai.xi # ifdef __USE_LARGEFILE64
604*53ee8cc1Swenshuai.xi extern int mkstemp64 (char *__template) __nonnull ((1)) __wur;
605*53ee8cc1Swenshuai.xi # endif
606*53ee8cc1Swenshuai.xi #endif
607*53ee8cc1Swenshuai.xi
608*53ee8cc1Swenshuai.xi #ifdef __USE_BSD
609*53ee8cc1Swenshuai.xi /* Create a unique temporary directory from TEMPLATE.
610*53ee8cc1Swenshuai.xi The last six characters of TEMPLATE must be "XXXXXX";
611*53ee8cc1Swenshuai.xi they are replaced with a string that makes the directory name unique.
612*53ee8cc1Swenshuai.xi Returns TEMPLATE, or a null pointer if it cannot get a unique name.
613*53ee8cc1Swenshuai.xi The directory is created mode 700. */
614*53ee8cc1Swenshuai.xi extern char *mkdtemp (char *__template) __THROW __nonnull ((1)) __wur;
615*53ee8cc1Swenshuai.xi #endif
616*53ee8cc1Swenshuai.xi
617*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
618*53ee8cc1Swenshuai.xi /* Generate a unique temporary file name from TEMPLATE similar to
619*53ee8cc1Swenshuai.xi mkstemp. But allow the caller to pass additional flags which are
620*53ee8cc1Swenshuai.xi used in the open call to create the file..
621*53ee8cc1Swenshuai.xi
622*53ee8cc1Swenshuai.xi This function is a possible cancellation points and therefore not
623*53ee8cc1Swenshuai.xi marked with __THROW. */
624*53ee8cc1Swenshuai.xi # ifndef __USE_FILE_OFFSET64
625*53ee8cc1Swenshuai.xi extern int mkostemp (char *__template, int __flags) __nonnull ((1)) __wur;
626*53ee8cc1Swenshuai.xi # else
627*53ee8cc1Swenshuai.xi # ifdef __REDIRECT
628*53ee8cc1Swenshuai.xi extern int __REDIRECT (mkostemp, (char *__template, int __flags), mkostemp64)
629*53ee8cc1Swenshuai.xi __nonnull ((1)) __wur;
630*53ee8cc1Swenshuai.xi # else
631*53ee8cc1Swenshuai.xi # define mkostemp mkostemp64
632*53ee8cc1Swenshuai.xi # endif
633*53ee8cc1Swenshuai.xi # endif
634*53ee8cc1Swenshuai.xi # ifdef __USE_LARGEFILE64
635*53ee8cc1Swenshuai.xi extern int mkostemp64 (char *__template, int __flags) __nonnull ((1)) __wur;
636*53ee8cc1Swenshuai.xi # endif
637*53ee8cc1Swenshuai.xi #endif
638*53ee8cc1Swenshuai.xi
639*53ee8cc1Swenshuai.xi
640*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
641*53ee8cc1Swenshuai.xi /* Execute the given line as a shell command.
642*53ee8cc1Swenshuai.xi
643*53ee8cc1Swenshuai.xi This function is a cancellation point and therefore not marked with
644*53ee8cc1Swenshuai.xi __THROW. */
645*53ee8cc1Swenshuai.xi extern int system (__const char *__command) __wur;
646*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
647*53ee8cc1Swenshuai.xi
648*53ee8cc1Swenshuai.xi
649*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
650*53ee8cc1Swenshuai.xi /* Return a malloc'd string containing the canonical absolute name of the
651*53ee8cc1Swenshuai.xi existing named file. */
652*53ee8cc1Swenshuai.xi extern char *canonicalize_file_name (__const char *__name)
653*53ee8cc1Swenshuai.xi __THROW __nonnull ((1)) __wur;
654*53ee8cc1Swenshuai.xi #endif
655*53ee8cc1Swenshuai.xi
656*53ee8cc1Swenshuai.xi #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
657*53ee8cc1Swenshuai.xi /* Return the canonical absolute name of file NAME. If RESOLVED is
658*53ee8cc1Swenshuai.xi null, the result is malloc'd; otherwise, if the canonical name is
659*53ee8cc1Swenshuai.xi PATH_MAX chars or more, returns null with `errno' set to
660*53ee8cc1Swenshuai.xi ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars,
661*53ee8cc1Swenshuai.xi returns the name in RESOLVED. */
662*53ee8cc1Swenshuai.xi extern char *realpath (__const char *__restrict __name,
663*53ee8cc1Swenshuai.xi char *__restrict __resolved) __THROW __wur;
664*53ee8cc1Swenshuai.xi #endif
665*53ee8cc1Swenshuai.xi
666*53ee8cc1Swenshuai.xi
667*53ee8cc1Swenshuai.xi /* Shorthand for type of comparison functions. */
668*53ee8cc1Swenshuai.xi #ifndef __COMPAR_FN_T
669*53ee8cc1Swenshuai.xi # define __COMPAR_FN_T
670*53ee8cc1Swenshuai.xi typedef int (*__compar_fn_t) (__const void *, __const void *);
671*53ee8cc1Swenshuai.xi
672*53ee8cc1Swenshuai.xi # ifdef __USE_GNU
673*53ee8cc1Swenshuai.xi typedef __compar_fn_t comparison_fn_t;
674*53ee8cc1Swenshuai.xi # endif
675*53ee8cc1Swenshuai.xi #endif
676*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
677*53ee8cc1Swenshuai.xi typedef int (*__compar_d_fn_t) (__const void *, __const void *, void *);
678*53ee8cc1Swenshuai.xi #endif
679*53ee8cc1Swenshuai.xi
680*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
681*53ee8cc1Swenshuai.xi /* Do a binary search for KEY in BASE, which consists of NMEMB elements
682*53ee8cc1Swenshuai.xi of SIZE bytes each, using COMPAR to perform the comparisons. */
683*53ee8cc1Swenshuai.xi extern void *bsearch (__const void *__key, __const void *__base,
684*53ee8cc1Swenshuai.xi size_t __nmemb, size_t __size, __compar_fn_t __compar)
685*53ee8cc1Swenshuai.xi __nonnull ((1, 2, 5)) __wur;
686*53ee8cc1Swenshuai.xi
687*53ee8cc1Swenshuai.xi /* Sort NMEMB elements of BASE, of SIZE bytes each,
688*53ee8cc1Swenshuai.xi using COMPAR to perform the comparisons. */
689*53ee8cc1Swenshuai.xi extern void qsort (void *__base, size_t __nmemb, size_t __size,
690*53ee8cc1Swenshuai.xi __compar_fn_t __compar) __nonnull ((1, 4));
691*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
692*53ee8cc1Swenshuai.xi extern void qsort_r (void *__base, size_t __nmemb, size_t __size,
693*53ee8cc1Swenshuai.xi __compar_d_fn_t __compar, void *__arg)
694*53ee8cc1Swenshuai.xi __nonnull ((1, 4));
695*53ee8cc1Swenshuai.xi #endif
696*53ee8cc1Swenshuai.xi
697*53ee8cc1Swenshuai.xi
698*53ee8cc1Swenshuai.xi /* Return the absolute value of X. */
699*53ee8cc1Swenshuai.xi extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur;
700*53ee8cc1Swenshuai.xi extern long int labs (long int __x) __THROW __attribute__ ((__const__)) __wur;
701*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
702*53ee8cc1Swenshuai.xi
703*53ee8cc1Swenshuai.xi #ifdef __USE_ISOC99
704*53ee8cc1Swenshuai.xi __extension__ extern long long int llabs (long long int __x)
705*53ee8cc1Swenshuai.xi __THROW __attribute__ ((__const__)) __wur;
706*53ee8cc1Swenshuai.xi #endif
707*53ee8cc1Swenshuai.xi
708*53ee8cc1Swenshuai.xi
709*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
710*53ee8cc1Swenshuai.xi /* Return the `div_t', `ldiv_t' or `lldiv_t' representation
711*53ee8cc1Swenshuai.xi of the value of NUMER over DENOM. */
712*53ee8cc1Swenshuai.xi /* GCC may have built-ins for these someday. */
713*53ee8cc1Swenshuai.xi extern div_t div (int __numer, int __denom)
714*53ee8cc1Swenshuai.xi __THROW __attribute__ ((__const__)) __wur;
715*53ee8cc1Swenshuai.xi extern ldiv_t ldiv (long int __numer, long int __denom)
716*53ee8cc1Swenshuai.xi __THROW __attribute__ ((__const__)) __wur;
717*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
718*53ee8cc1Swenshuai.xi
719*53ee8cc1Swenshuai.xi #ifdef __USE_ISOC99
720*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_C99
721*53ee8cc1Swenshuai.xi __extension__ extern lldiv_t lldiv (long long int __numer,
722*53ee8cc1Swenshuai.xi long long int __denom)
723*53ee8cc1Swenshuai.xi __THROW __attribute__ ((__const__)) __wur;
724*53ee8cc1Swenshuai.xi __END_NAMESPACE_C99
725*53ee8cc1Swenshuai.xi #endif
726*53ee8cc1Swenshuai.xi
727*53ee8cc1Swenshuai.xi
728*53ee8cc1Swenshuai.xi #if defined __USE_SVID || defined __USE_XOPEN_EXTENDED
729*53ee8cc1Swenshuai.xi /* Convert floating point numbers to strings. The returned values are
730*53ee8cc1Swenshuai.xi valid only until another call to the same function. */
731*53ee8cc1Swenshuai.xi
732*53ee8cc1Swenshuai.xi /* Convert VALUE to a string with NDIGIT digits and return a pointer to
733*53ee8cc1Swenshuai.xi this. Set *DECPT with the position of the decimal character and *SIGN
734*53ee8cc1Swenshuai.xi with the sign of the number. */
735*53ee8cc1Swenshuai.xi extern char *ecvt (double __value, int __ndigit, int *__restrict __decpt,
736*53ee8cc1Swenshuai.xi int *__restrict __sign) __THROW __nonnull ((3, 4)) __wur;
737*53ee8cc1Swenshuai.xi
738*53ee8cc1Swenshuai.xi /* Convert VALUE to a string rounded to NDIGIT decimal digits. Set *DECPT
739*53ee8cc1Swenshuai.xi with the position of the decimal character and *SIGN with the sign of
740*53ee8cc1Swenshuai.xi the number. */
741*53ee8cc1Swenshuai.xi extern char *fcvt (double __value, int __ndigit, int *__restrict __decpt,
742*53ee8cc1Swenshuai.xi int *__restrict __sign) __THROW __nonnull ((3, 4)) __wur;
743*53ee8cc1Swenshuai.xi
744*53ee8cc1Swenshuai.xi /* If possible convert VALUE to a string with NDIGIT significant digits.
745*53ee8cc1Swenshuai.xi Otherwise use exponential representation. The resulting string will
746*53ee8cc1Swenshuai.xi be written to BUF. */
747*53ee8cc1Swenshuai.xi extern char *gcvt (double __value, int __ndigit, char *__buf)
748*53ee8cc1Swenshuai.xi __THROW __nonnull ((3)) __wur;
749*53ee8cc1Swenshuai.xi
750*53ee8cc1Swenshuai.xi
751*53ee8cc1Swenshuai.xi # ifdef __USE_MISC
752*53ee8cc1Swenshuai.xi /* Long double versions of above functions. */
753*53ee8cc1Swenshuai.xi extern char *qecvt (long double __value, int __ndigit,
754*53ee8cc1Swenshuai.xi int *__restrict __decpt, int *__restrict __sign)
755*53ee8cc1Swenshuai.xi __THROW __nonnull ((3, 4)) __wur;
756*53ee8cc1Swenshuai.xi extern char *qfcvt (long double __value, int __ndigit,
757*53ee8cc1Swenshuai.xi int *__restrict __decpt, int *__restrict __sign)
758*53ee8cc1Swenshuai.xi __THROW __nonnull ((3, 4)) __wur;
759*53ee8cc1Swenshuai.xi extern char *qgcvt (long double __value, int __ndigit, char *__buf)
760*53ee8cc1Swenshuai.xi __THROW __nonnull ((3)) __wur;
761*53ee8cc1Swenshuai.xi
762*53ee8cc1Swenshuai.xi
763*53ee8cc1Swenshuai.xi /* Reentrant version of the functions above which provide their own
764*53ee8cc1Swenshuai.xi buffers. */
765*53ee8cc1Swenshuai.xi extern int ecvt_r (double __value, int __ndigit, int *__restrict __decpt,
766*53ee8cc1Swenshuai.xi int *__restrict __sign, char *__restrict __buf,
767*53ee8cc1Swenshuai.xi size_t __len) __THROW __nonnull ((3, 4, 5));
768*53ee8cc1Swenshuai.xi extern int fcvt_r (double __value, int __ndigit, int *__restrict __decpt,
769*53ee8cc1Swenshuai.xi int *__restrict __sign, char *__restrict __buf,
770*53ee8cc1Swenshuai.xi size_t __len) __THROW __nonnull ((3, 4, 5));
771*53ee8cc1Swenshuai.xi
772*53ee8cc1Swenshuai.xi extern int qecvt_r (long double __value, int __ndigit,
773*53ee8cc1Swenshuai.xi int *__restrict __decpt, int *__restrict __sign,
774*53ee8cc1Swenshuai.xi char *__restrict __buf, size_t __len)
775*53ee8cc1Swenshuai.xi __THROW __nonnull ((3, 4, 5));
776*53ee8cc1Swenshuai.xi extern int qfcvt_r (long double __value, int __ndigit,
777*53ee8cc1Swenshuai.xi int *__restrict __decpt, int *__restrict __sign,
778*53ee8cc1Swenshuai.xi char *__restrict __buf, size_t __len)
779*53ee8cc1Swenshuai.xi __THROW __nonnull ((3, 4, 5));
780*53ee8cc1Swenshuai.xi # endif /* misc */
781*53ee8cc1Swenshuai.xi #endif /* use MISC || use X/Open Unix */
782*53ee8cc1Swenshuai.xi
783*53ee8cc1Swenshuai.xi
784*53ee8cc1Swenshuai.xi __BEGIN_NAMESPACE_STD
785*53ee8cc1Swenshuai.xi /* Return the length of the multibyte character
786*53ee8cc1Swenshuai.xi in S, which is no longer than N. */
787*53ee8cc1Swenshuai.xi extern int mblen (__const char *__s, size_t __n) __THROW __wur;
788*53ee8cc1Swenshuai.xi /* Return the length of the given multibyte character,
789*53ee8cc1Swenshuai.xi putting its `wchar_t' representation in *PWC. */
790*53ee8cc1Swenshuai.xi extern int mbtowc (wchar_t *__restrict __pwc,
791*53ee8cc1Swenshuai.xi __const char *__restrict __s, size_t __n) __THROW __wur;
792*53ee8cc1Swenshuai.xi /* Put the multibyte character represented
793*53ee8cc1Swenshuai.xi by WCHAR in S, returning its length. */
794*53ee8cc1Swenshuai.xi extern int wctomb (char *__s, wchar_t __wchar) __THROW __wur;
795*53ee8cc1Swenshuai.xi
796*53ee8cc1Swenshuai.xi
797*53ee8cc1Swenshuai.xi /* Convert a multibyte string to a wide char string. */
798*53ee8cc1Swenshuai.xi extern size_t mbstowcs (wchar_t *__restrict __pwcs,
799*53ee8cc1Swenshuai.xi __const char *__restrict __s, size_t __n) __THROW;
800*53ee8cc1Swenshuai.xi /* Convert a wide char string to multibyte string. */
801*53ee8cc1Swenshuai.xi extern size_t wcstombs (char *__restrict __s,
802*53ee8cc1Swenshuai.xi __const wchar_t *__restrict __pwcs, size_t __n)
803*53ee8cc1Swenshuai.xi __THROW;
804*53ee8cc1Swenshuai.xi __END_NAMESPACE_STD
805*53ee8cc1Swenshuai.xi
806*53ee8cc1Swenshuai.xi
807*53ee8cc1Swenshuai.xi #ifdef __USE_SVID
808*53ee8cc1Swenshuai.xi /* Determine whether the string value of RESPONSE matches the affirmation
809*53ee8cc1Swenshuai.xi or negative response expression as specified by the LC_MESSAGES category
810*53ee8cc1Swenshuai.xi in the program's current locale. Returns 1 if affirmative, 0 if
811*53ee8cc1Swenshuai.xi negative, and -1 if not matching. */
812*53ee8cc1Swenshuai.xi extern int rpmatch (__const char *__response) __THROW __nonnull ((1)) __wur;
813*53ee8cc1Swenshuai.xi #endif
814*53ee8cc1Swenshuai.xi
815*53ee8cc1Swenshuai.xi
816*53ee8cc1Swenshuai.xi #ifdef __USE_XOPEN_EXTENDED
817*53ee8cc1Swenshuai.xi /* Parse comma separated suboption from *OPTIONP and match against
818*53ee8cc1Swenshuai.xi strings in TOKENS. If found return index and set *VALUEP to
819*53ee8cc1Swenshuai.xi optional value introduced by an equal sign. If the suboption is
820*53ee8cc1Swenshuai.xi not part of TOKENS return in *VALUEP beginning of unknown
821*53ee8cc1Swenshuai.xi suboption. On exit *OPTIONP is set to the beginning of the next
822*53ee8cc1Swenshuai.xi token or at the terminating NUL character. */
823*53ee8cc1Swenshuai.xi extern int getsubopt (char **__restrict __optionp,
824*53ee8cc1Swenshuai.xi char *__const *__restrict __tokens,
825*53ee8cc1Swenshuai.xi char **__restrict __valuep)
826*53ee8cc1Swenshuai.xi __THROW __nonnull ((1, 2, 3)) __wur;
827*53ee8cc1Swenshuai.xi #endif
828*53ee8cc1Swenshuai.xi
829*53ee8cc1Swenshuai.xi
830*53ee8cc1Swenshuai.xi #ifdef __USE_XOPEN
831*53ee8cc1Swenshuai.xi /* Setup DES tables according KEY. */
832*53ee8cc1Swenshuai.xi extern void setkey (__const char *__key) __THROW __nonnull ((1));
833*53ee8cc1Swenshuai.xi #endif
834*53ee8cc1Swenshuai.xi
835*53ee8cc1Swenshuai.xi
836*53ee8cc1Swenshuai.xi /* X/Open pseudo terminal handling. */
837*53ee8cc1Swenshuai.xi
838*53ee8cc1Swenshuai.xi #ifdef __USE_XOPEN2K
839*53ee8cc1Swenshuai.xi /* Return a master pseudo-terminal handle. */
840*53ee8cc1Swenshuai.xi extern int posix_openpt (int __oflag) __wur;
841*53ee8cc1Swenshuai.xi #endif
842*53ee8cc1Swenshuai.xi
843*53ee8cc1Swenshuai.xi #ifdef __USE_XOPEN
844*53ee8cc1Swenshuai.xi /* The next four functions all take a master pseudo-tty fd and
845*53ee8cc1Swenshuai.xi perform an operation on the associated slave: */
846*53ee8cc1Swenshuai.xi
847*53ee8cc1Swenshuai.xi /* Chown the slave to the calling user. */
848*53ee8cc1Swenshuai.xi extern int grantpt (int __fd) __THROW;
849*53ee8cc1Swenshuai.xi
850*53ee8cc1Swenshuai.xi /* Release an internal lock so the slave can be opened.
851*53ee8cc1Swenshuai.xi Call after grantpt(). */
852*53ee8cc1Swenshuai.xi extern int unlockpt (int __fd) __THROW;
853*53ee8cc1Swenshuai.xi
854*53ee8cc1Swenshuai.xi /* Return the pathname of the pseudo terminal slave assoicated with
855*53ee8cc1Swenshuai.xi the master FD is open on, or NULL on errors.
856*53ee8cc1Swenshuai.xi The returned storage is good until the next call to this function. */
857*53ee8cc1Swenshuai.xi extern char *ptsname (int __fd) __THROW __wur;
858*53ee8cc1Swenshuai.xi #endif
859*53ee8cc1Swenshuai.xi
860*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
861*53ee8cc1Swenshuai.xi /* Store at most BUFLEN characters of the pathname of the slave pseudo
862*53ee8cc1Swenshuai.xi terminal associated with the master FD is open on in BUF.
863*53ee8cc1Swenshuai.xi Return 0 on success, otherwise an error number. */
864*53ee8cc1Swenshuai.xi extern int ptsname_r (int __fd, char *__buf, size_t __buflen)
865*53ee8cc1Swenshuai.xi __THROW __nonnull ((2));
866*53ee8cc1Swenshuai.xi
867*53ee8cc1Swenshuai.xi /* Open a master pseudo terminal and return its file descriptor. */
868*53ee8cc1Swenshuai.xi extern int getpt (void);
869*53ee8cc1Swenshuai.xi #endif
870*53ee8cc1Swenshuai.xi
871*53ee8cc1Swenshuai.xi #ifdef __USE_BSD
872*53ee8cc1Swenshuai.xi /* Put the 1 minute, 5 minute and 15 minute load averages into the first
873*53ee8cc1Swenshuai.xi NELEM elements of LOADAVG. Return the number written (never more than
874*53ee8cc1Swenshuai.xi three, but may be less than NELEM), or -1 if an error occurred. */
875*53ee8cc1Swenshuai.xi extern int getloadavg (double __loadavg[], int __nelem)
876*53ee8cc1Swenshuai.xi __THROW __nonnull ((1));
877*53ee8cc1Swenshuai.xi #endif
878*53ee8cc1Swenshuai.xi
879*53ee8cc1Swenshuai.xi
880*53ee8cc1Swenshuai.xi /* Define some macros helping to catch buffer overflows. */
881*53ee8cc1Swenshuai.xi #if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
882*53ee8cc1Swenshuai.xi # include <bits/stdlib.h>
883*53ee8cc1Swenshuai.xi #endif
884*53ee8cc1Swenshuai.xi #ifdef __LDBL_COMPAT
885*53ee8cc1Swenshuai.xi # include <bits/stdlib-ldbl.h>
886*53ee8cc1Swenshuai.xi #endif
887*53ee8cc1Swenshuai.xi
888*53ee8cc1Swenshuai.xi #endif /* don't just need malloc and calloc */
889*53ee8cc1Swenshuai.xi #undef __need_malloc_and_calloc
890*53ee8cc1Swenshuai.xi
891*53ee8cc1Swenshuai.xi __END_DECLS
892*53ee8cc1Swenshuai.xi
893*53ee8cc1Swenshuai.xi #endif /* stdlib.h */
894