xref: /haiku/headers/posix/stdlib.h (revision 344ded80d400028c8f561b4b876257b94c12db4a)
1 /*
2  * Copyright 2002-2021 Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _STDLIB_H_
6 #define _STDLIB_H_
7 
8 
9 #include <alloca.h>
10 #include <div_t.h>
11 #include <limits.h>
12 #include <stddef.h>
13 #include <sys/types.h>
14 #include <sys/wait.h>
15 #include <wchar_t.h>
16 
17 #define RAND_MAX      0x7fffffff
18 #define MB_CUR_MAX    (__ctype_get_mb_cur_max())
19 
20 #define EXIT_SUCCESS  0
21 #define EXIT_FAILURE  1
22 
23 /* random data structures (for thread-safe random numbers) */
24 struct random_data  {
25     int *fptr;
26     int *rptr;
27     int *state;
28     int rand_type;
29     int rand_deg;
30     int rand_sep;
31     int *end_ptr;
32 };
33 
34 struct drand48_data  {
35     unsigned short int x[3];
36     unsigned short int a[3];
37     unsigned short int c;
38     unsigned short int old_x[3];
39     int init;
40 };
41 
42 
43 #ifdef  __cplusplus
44 extern "C" {
45 #endif
46 
47 /* memory allocation (see malloc.h for additional defines & prototypes) */
48 extern void		*calloc(size_t numElements, size_t size);
49 extern void		free(void *pointer);
50 extern void		*malloc(size_t size);
51 extern int		posix_memalign(void **_pointer, size_t alignment, size_t size);
52 extern void 	*aligned_alloc(size_t alignment, size_t size) _ALIGNED_BY_ARG(1);
53 extern void		*realloc(void *oldPointer, size_t newSize);
54 extern void		*reallocarray(void *ptr, size_t nelem, size_t elsize);
55 
56 /* process termination */
57 extern void		abort(void) __attribute__((noreturn));
58 extern int		atexit(void (*func)(void));
59 extern int		atfork(void (*func)(void));
60 extern void		exit(int) __attribute__((noreturn));
61 extern void		_Exit(int) __attribute__((noreturn));
62 
63 /* misc functions */
64 extern char		*realpath(const char *path, char *resolved);
65 
66 extern int		system(const char *command);
67 
68 extern char		*mktemp(char *name);
69 extern char		*mkdtemp(char *templat);
70 extern int		mkstemp(char *templat);
71 
72 extern char		*ecvt(double value, int digits, int *_decimalPoint, int *_sign);
73 extern char		*fcvt(double value, int precision, int *_decimalPoint,
74 					int *_sign);
75 extern char		*gcvt(double value, int digits, char *buffer);
76 
77 extern char		*l64a(long n);
78 extern long		a64l(const char *string);
79 
80 /* environment variables */
81 extern char		**environ;
82 extern int		clearenv(void);
83 extern char		*getenv(const char *name);
84 extern int		putenv(char *string);
85 extern int		setenv(char const *name, char const *value, int rewrite);
86 extern int		unsetenv(const char *name);
87 
88 /* ASCII string to number conversion */
89 extern double			atof(const char *string);
90 extern int				atoi(const char *string);
91 extern long				atol(const char *string);
92 extern long long int	atoll(const char *string);
93 extern unsigned int 	atoui(const char *string);
94 extern unsigned long	atoul(const char *string);
95 
96 extern double			strtod(const char *string, char **end);
97 extern long double		strtold(const char *string, char **end);
98 extern float			strtof(const char *string, char **end);
99 extern long				strtol(const char *string, char **end, int base);
100 extern unsigned long	strtoul(const char *string, char **end, int base);
101 extern long long		strtoll(const char *string, char **end, int base);
102 extern unsigned long long strtoull(const char *string, char **end, int base);
103 
104 /* random number generation */
105 extern void		srand(unsigned int seed);
106 extern int		rand(void);
107 extern int		random(void);
108 extern void		srandom(unsigned int seed);
109 extern int		rand_r(unsigned int *seed);
110 extern int		random_r(struct random_data *data, int *result);
111 extern int		srandom_r(unsigned int seed, struct random_data *data);
112 extern char		*initstate(unsigned int seed, char *state, size_t size);
113 extern char		*setstate(char *state);
114 extern int		initstate_r(unsigned int seed, void *stateBuffer,
115 					size_t stateLength, struct random_data *data);
116 extern int		setstate_r(void *stateBuffer, struct random_data *data);
117 
118 extern double	drand48(void);
119 extern double	erand48(unsigned short int xsubi[3]);
120 extern long		lrand48(void);
121 extern long		nrand48(unsigned short int xsubi[3]);
122 extern long 	mrand48(void);
123 extern long		jrand48(unsigned short int xsubi[3]);
124 extern void		srand48(long int seed);
125 extern unsigned short *seed48(unsigned short int seed16v[3]);
126 extern void		lcong48(unsigned short int param[7]);
127 
128 extern int		drand48_r(struct drand48_data *data, double *result);
129 extern int		erand48_r(unsigned short int xsubi[3],
130 					struct drand48_data *data, double *result);
131 extern int		lrand48_r(struct drand48_data *data, long int *result);
132 extern int		nrand48_r(unsigned short int xsubi[3],
133 					struct drand48_data *data, long int *result);
134 extern int		mrand48_r(struct drand48_data *data, long int *result);
135 extern int		jrand48_r(unsigned short int xsubi[3],
136 					struct drand48_data *data, long int *result);
137 extern int		srand48_r(long int seed, struct drand48_data *data);
138 extern int		seed48_r(unsigned short int seed16v[3],
139 					struct drand48_data *data);
140 extern int		lcong48_r(unsigned short int param[7],
141 					struct drand48_data *data);
142 
143 /* search and sort functions */
144 typedef int (*_compare_function)(const void *, const void *);
145 
146 extern void		*bsearch(const void *key, const void *base, size_t numElements,
147 					size_t sizeOfElement, _compare_function);
148 extern int		heapsort(void *base, size_t numElements, size_t sizeOfElement,
149 					_compare_function);
150 extern int		mergesort(void *base, size_t numElements, size_t sizeOfElement,
151 					_compare_function);
152 extern void		qsort(void *base, size_t numElements, size_t sizeOfElement,
153 					_compare_function);
154 extern int		radixsort(u_char const **base, int numElements,
155 					u_char const *table, u_int endByte);
156 extern int		sradixsort(u_char const **base, int numElements,
157 					u_char const *table, u_int endByte);
158 
159 /* misc math functions */
160 extern int		abs(int number);
161 extern long		labs(long number);
162 extern long long llabs(long long number);
163 
164 extern div_t	div(int numerator,  int denominator);
165 extern ldiv_t	ldiv(long numerator, long denominator);
166 extern lldiv_t	lldiv(long long numerator, long long denominator);
167 
168 /* wide & multibyte string functions */
169 extern int		mblen(const char *string, size_t maxSize);
170 extern int		mbtowc(wchar_t *pwc, const char *string, size_t maxSize);
171 extern int		wctomb(char *string, wchar_t wchar);
172 extern size_t	mbstowcs(wchar_t *pwcs, const char *string, size_t maxSize);
173 extern size_t	wcstombs(char *string, const wchar_t *pwcs, size_t maxSize);
174 
175 /* crypt */
176 extern void 	setkey(const char *key);
177 
178 /* sub-option parsing */
179 extern int		getsubopt(char **optionp, char * const *keylistp,
180 					char **valuep);
181 
182 /* pty functions */
183 extern int		posix_openpt(int openFlags);
184 extern int		grantpt(int masterFD);
185 extern char*	ptsname(int masterFD);
186 extern int		ptsname_r(int masterFD, char *path, size_t maxSize);
187 extern int		unlockpt(int masterFD);
188 
189 /* internal accessor to value for MB_CUR_MAX */
190 extern unsigned short __ctype_get_mb_cur_max(void);
191 
192 #ifdef __cplusplus
193 } /* extern "C" */
194 #endif
195 
196 #endif /* _STDLIB_H_ */
197