1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
|
/**
* 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 {}
extern (C):
@system:
/* 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_UClibc) 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
{
/// 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);
}
|