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