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