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