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) */
24struct 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
34struct 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
44extern "C" {
45#endif
46
47/* memory allocation (see malloc.h for additional defines & prototypes) */
48extern void		*calloc(size_t numElements, size_t size);
49extern void		free(void *pointer);
50extern void		*malloc(size_t size);
51extern int		posix_memalign(void **_pointer, size_t alignment, size_t size);
52extern void 	*aligned_alloc(size_t alignment, size_t size) _ALIGNED_BY_ARG(1);
53extern void		*realloc(void *oldPointer, size_t newSize);
54
55/* process termination */
56extern void		abort(void) __attribute__((noreturn));
57extern int		atexit(void (*func)(void));
58extern int		atfork(void (*func)(void));
59extern void		exit(int) __attribute__((noreturn));
60extern void		_Exit(int) __attribute__((noreturn));
61
62/* misc functions */
63extern char		*realpath(const char *path, char *resolved);
64
65extern int		system(const char *command);
66
67extern char		*mktemp(char *name);
68extern char		*mkdtemp(char *templat);
69extern int		mkstemp(char *templat);
70
71extern char		*ecvt(double value, int digits, int *_decimalPoint, int *_sign);
72extern char		*fcvt(double value, int precision, int *_decimalPoint,
73					int *_sign);
74extern char		*gcvt(double value, int digits, char *buffer);
75
76extern char		*l64a(long n);
77extern long		a64l(const char *string);
78
79/* environment variables */
80extern char		**environ;
81extern int		clearenv(void);
82extern char		*getenv(const char *name);
83extern int		putenv(char *string);
84extern int		setenv(char const *name, char const *value, int rewrite);
85extern int		unsetenv(const char *name);
86
87/* ASCII string to number conversion */
88extern double			atof(const char *string);
89extern int				atoi(const char *string);
90extern long				atol(const char *string);
91extern long long int	atoll(const char *string);
92extern unsigned int 	atoui(const char *string);
93extern unsigned long	atoul(const char *string);
94
95extern double			strtod(const char *string, char **end);
96extern long double		strtold(const char *string, char **end);
97extern float			strtof(const char *string, char **end);
98extern long				strtol(const char *string, char **end, int base);
99extern unsigned long	strtoul(const char *string, char **end, int base);
100extern long long		strtoll(const char *string, char **end, int base);
101extern unsigned long long strtoull(const char *string, char **end, int base);
102
103/* random number generation */
104extern void		srand(unsigned int seed);
105extern int		rand(void);
106extern int		random(void);
107extern void		srandom(unsigned int seed);
108extern int		rand_r(unsigned int *seed);
109extern int		random_r(struct random_data *data, int *result);
110extern int		srandom_r(unsigned int seed, struct random_data *data);
111extern char		*initstate(unsigned int seed, char *state, size_t size);
112extern char		*setstate(char *state);
113extern int		initstate_r(unsigned int seed, void *stateBuffer,
114					size_t stateLength, struct random_data *data);
115extern int		setstate_r(void *stateBuffer, struct random_data *data);
116
117extern double	drand48(void);
118extern double	erand48(unsigned short int xsubi[3]);
119extern long		lrand48(void);
120extern long		nrand48(unsigned short int xsubi[3]);
121extern long 	mrand48(void);
122extern long		jrand48(unsigned short int xsubi[3]);
123extern void		srand48(long int seed);
124extern unsigned short *seed48(unsigned short int seed16v[3]);
125extern void		lcong48(unsigned short int param[7]);
126
127extern int		drand48_r(struct drand48_data *data, double *result);
128extern int		erand48_r(unsigned short int xsubi[3],
129					struct drand48_data *data, double *result);
130extern int		lrand48_r(struct drand48_data *data, long int *result);
131extern int		nrand48_r(unsigned short int xsubi[3],
132					struct drand48_data *data, long int *result);
133extern int		mrand48_r(struct drand48_data *data, long int *result);
134extern int		jrand48_r(unsigned short int xsubi[3],
135					struct drand48_data *data, long int *result);
136extern int		srand48_r(long int seed, struct drand48_data *data);
137extern int		seed48_r(unsigned short int seed16v[3],
138					struct drand48_data *data);
139extern int		lcong48_r(unsigned short int param[7],
140					struct drand48_data *data);
141
142/* search and sort functions */
143typedef int (*_compare_function)(const void *, const void *);
144
145extern void		*bsearch(const void *key, const void *base, size_t numElements,
146					size_t sizeOfElement, _compare_function);
147extern int		heapsort(void *base, size_t numElements, size_t sizeOfElement,
148					_compare_function);
149extern int		mergesort(void *base, size_t numElements, size_t sizeOfElement,
150					_compare_function);
151extern void		qsort(void *base, size_t numElements, size_t sizeOfElement,
152					_compare_function);
153extern int		radixsort(u_char const **base, int numElements,
154					u_char const *table, u_int endByte);
155extern int		sradixsort(u_char const **base, int numElements,
156					u_char const *table, u_int endByte);
157
158/* misc math functions */
159extern int		abs(int number);
160extern long		labs(long number);
161extern long long llabs(long long number);
162
163extern div_t	div(int numerator,  int denominator);
164extern ldiv_t	ldiv(long numerator, long denominator);
165extern lldiv_t	lldiv(long long numerator, long long denominator);
166
167/* wide & multibyte string functions */
168extern int		mblen(const char *string, size_t maxSize);
169extern int		mbtowc(wchar_t *pwc, const char *string, size_t maxSize);
170extern int		wctomb(char *string, wchar_t wchar);
171extern size_t	mbstowcs(wchar_t *pwcs, const char *string, size_t maxSize);
172extern size_t	wcstombs(char *string, const wchar_t *pwcs, size_t maxSize);
173
174/* crypt */
175extern void 	setkey(const char *key);
176
177/* sub-option parsing */
178extern int		getsubopt(char **optionp, char * const *keylistp,
179					char **valuep);
180
181/* pty functions */
182extern int		posix_openpt(int openFlags);
183extern int		grantpt(int masterFD);
184extern char*	ptsname(int masterFD);
185extern int		unlockpt(int masterFD);
186
187/* internal accessor to value for MB_CUR_MAX */
188extern unsigned short __ctype_get_mb_cur_max(void);
189
190#ifdef __cplusplus
191} /* extern "C" */
192#endif
193
194#endif /* _STDLIB_H_ */
195