| /** | |
| * D header file for C99. | |
| * | |
| * $(C_HEADER_DESCRIPTION pubs.opengroup.org/onlinepubs/009695399/basedefs/_stdlib.h.html, _stdlib.h) | |
| * | |
| * Copyright: Copyright Sean Kelly 2005 - 2014. | |
| * License: Distributed under the | |
| * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). | |
| * (See accompanying file LICENSE) | |
| * Authors: Sean Kelly | |
| * Standards: ISO/IEC 9899:1999 (E) | |
| * Source: $(DRUNTIMESRC core/stdc/_stdlib.d) | |
| */ | |
| module core.stdc.stdlib; | |
| import core.stdc.config; | |
| public import core.stdc.stddef; // for wchar_t | |
| version (OSX) | |
| version = Darwin; | |
| else version (iOS) | |
| version = Darwin; | |
| else version (TVOS) | |
| version = Darwin; | |
| else version (WatchOS) | |
| version = Darwin; | |
| version (CRuntime_Glibc) | |
| version = AlignedAllocSupported; | |
| else version (CRuntime_Newlib) | |
| version = AlignedAllocSupported; | |
| else {} | |
| extern (C): | |
| /* Placed outside `nothrow` and `@nogc` in order to not constrain what the callback does. | |
| */ | |
| /// | |
| alias _compare_fp_t = int function(const void*, const void*); | |
| nothrow: | |
| @nogc: | |
| /// | |
| inout(void)* bsearch(const void* key, inout(void)* base, size_t nmemb, size_t size, _compare_fp_t compar); | |
| /// | |
| void qsort(void* base, size_t nmemb, size_t size, _compare_fp_t compar); | |
| // https://issues.dlang.org/show_bug.cgi?id=17188 | |
| @system unittest | |
| { | |
| struct S | |
| { | |
| extern(C) static int cmp(const void*, const void*) { return 0; } | |
| } | |
| int[4] arr; | |
| qsort(arr.ptr, arr[0].sizeof, arr.length, &S.cmp); | |
| int key; | |
| bsearch(&key, arr.ptr, arr[0].sizeof, arr.length, &S.cmp); | |
| } | |
| /// | |
| struct div_t | |
| { | |
| int quot, | |
| rem; | |
| } | |
| /// | |
| struct ldiv_t | |
| { | |
| c_long quot, | |
| rem; | |
| } | |
| /// | |
| struct lldiv_t | |
| { | |
| long quot, | |
| rem; | |
| } | |
| /// | |
| enum EXIT_SUCCESS = 0; | |
| /// | |
| enum EXIT_FAILURE = 1; | |
| /// | |
| enum MB_CUR_MAX = 1; | |
| /// | |
| version (Windows) enum RAND_MAX = 0x7fff; | |
| else version (CRuntime_Glibc) enum RAND_MAX = 0x7fffffff; | |
| else version (Darwin) enum RAND_MAX = 0x7fffffff; | |
| else version (FreeBSD) enum RAND_MAX = 0x7ffffffd; | |
| else version (NetBSD) enum RAND_MAX = 0x7fffffff; | |
| else version (OpenBSD) enum RAND_MAX = 0x7fffffff; | |
| else version (DragonFlyBSD) enum RAND_MAX = 0x7fffffff; | |
| else version (Solaris) enum RAND_MAX = 0x7fff; | |
| else version (CRuntime_Bionic) enum RAND_MAX = 0x7fffffff; | |
| else version (CRuntime_Musl) enum RAND_MAX = 0x7fffffff; | |
| else version (CRuntime_Newlib) enum RAND_MAX = 0x7fffffff; | |
| else version (CRuntime_UClibc) enum RAND_MAX = 0x7fffffff; | |
| else version (WASI) enum RAND_MAX = 0x7fffffff; | |
| else static assert( false, "Unsupported platform" ); | |
| /// | |
| double atof(scope const char* nptr); | |
| /// | |
| int atoi(scope const char* nptr); | |
| /// | |
| c_long atol(scope const char* nptr); | |
| /// | |
| long atoll(scope const char* nptr); | |
| /// | |
| double strtod(scope inout(char)* nptr, scope inout(char)** endptr); | |
| /// | |
| float strtof(scope inout(char)* nptr, scope inout(char)** endptr); | |
| /// | |
| c_long strtol(scope inout(char)* nptr, scope inout(char)** endptr, int base); | |
| /// | |
| long strtoll(scope inout(char)* nptr, scope inout(char)** endptr, int base); | |
| /// | |
| c_ulong strtoul(scope inout(char)* nptr, scope inout(char)** endptr, int base); | |
| /// | |
| ulong strtoull(scope inout(char)* nptr, scope inout(char)** endptr, int base); | |
| version (CRuntime_Microsoft) | |
| { | |
| version (MinGW) | |
| { | |
| /// | |
| real __mingw_strtold(scope inout(char)* nptr, scope inout(char)** endptr); | |
| /// | |
| alias __mingw_strtold strtold; | |
| } | |
| else | |
| { | |
| // strtold exists starting from VS2013, so we give it D linkage to avoid link errors | |
| /// | |
| extern (D) real strtold(scope inout(char)* nptr, inout(char)** endptr) | |
| { // Fake it 'till we make it | |
| return strtod(nptr, endptr); | |
| } | |
| } | |
| } | |
| else | |
| { | |
| static if (PPCUseIEEE128) | |
| { | |
| real __strtoieee128(scope inout(char)* nptr, scope inout(char)** endptr); | |
| alias strtold = __strtoieee128; | |
| } | |
| else | |
| { | |
| /// Added to Bionic since Lollipop. | |
| real strtold(scope inout(char)* nptr, scope inout(char)** endptr); | |
| } | |
| } | |
| // No unsafe pointer manipulation. | |
| @trusted | |
| { | |
| /// These two were added to Bionic in Lollipop. | |
| int rand(); | |
| /// | |
| void srand(uint seed); | |
| } | |
| // We don't mark these @trusted. Given that they return a void*, one has | |
| // to do a pointer cast to do anything sensible with the result. Thus, | |
| // functions using these already have to be @trusted, allowing them to | |
| // call @system stuff anyway. | |
| /// | |
| void* malloc(size_t size); | |
| /// | |
| void* calloc(size_t nmemb, size_t size); | |
| /// | |
| void* realloc(void* ptr, size_t size); | |
| /// | |
| void free(void* ptr); | |
| /// since C11 | |
| version (AlignedAllocSupported) | |
| { | |
| void* aligned_alloc(size_t alignment, size_t size); | |
| } | |
| /// | |
| noreturn abort() @safe; | |
| /// | |
| noreturn exit(int status); | |
| /// | |
| int atexit(void function() func); | |
| /// | |
| noreturn _Exit(int status); | |
| /// | |
| char* getenv(scope const char* name); | |
| /// | |
| int system(scope const char* string); | |
| // These only operate on integer values. | |
| @trusted | |
| { | |
| /// | |
| pure int abs(int j); | |
| /// | |
| pure c_long labs(c_long j); | |
| /// | |
| pure long llabs(long j); | |
| /// | |
| div_t div(int numer, int denom); | |
| /// | |
| ldiv_t ldiv(c_long numer, c_long denom); | |
| /// | |
| lldiv_t lldiv(long numer, long denom); | |
| } | |
| /// | |
| int mblen(scope const char* s, size_t n); | |
| /// | |
| int mbtowc(scope wchar_t* pwc, scope const char* s, size_t n); | |
| /// | |
| int wctomb(scope char* s, wchar_t wc); | |
| /// | |
| size_t mbstowcs(scope wchar_t* pwcs, scope const char* s, size_t n); | |
| /// | |
| size_t wcstombs(scope char* s, scope const wchar_t* pwcs, size_t n); | |
| /// | |
| version (DigitalMars) | |
| { | |
| // See malloc comment about @trusted. | |
| void* alloca(size_t size) pure; // non-standard | |
| } | |
| else version (GNU) | |
| { | |
| void* alloca(size_t size) pure; // compiler intrinsic | |
| } | |
| else version (LDC) | |
| { | |
| pragma(LDC_alloca) | |
| void* alloca(size_t size) pure; | |
| } | |
| version (CRuntime_Microsoft) | |
| { | |
| /// | |
| ulong _strtoui64(scope inout(char)*, scope inout(char)**,int); | |
| /// | |
| ulong _wcstoui64(scope inout(wchar)*, scope inout(wchar)**,int); | |
| /// | |
| long _strtoi64(scope inout(char)*, scope inout(char)**,int); | |
| /// | |
| long _wcstoi64(scope inout(wchar)*, scope inout(wchar)**,int); | |
| } |