1 /* 2 * Public domain 3 * string.h compatibility shim 4 */ 5 module libressl_d.compat..string; 6 7 8 private static import core.sys.windows.winsock2; 9 public import core.stdc.string; 10 public import core.sys.posix.string; 11 public import core.sys.posix.strings; 12 public import libressl_d.compat.sys.types; 13 14 version (Windows) { 15 public import core.stdc.errno; 16 } 17 18 extern (C): 19 nothrow @nogc: 20 21 //#if defined(__sun) || defined(_AIX) || defined(__hpux) 22 /* 23 * Some functions historically defined in string.h were placed in strings.h by 24 * SUS. Use the same hack as OS X and FreeBSD use to work around on AIX, 25 * Solaris, and HPUX. 26 */ 27 //#include <strings.h> 28 //#endif 29 30 static if (!__traits(compiles, strcasecmp)) { 31 int strcasecmp(const (char)* s1, const (char)* s2); 32 } 33 34 static if (!__traits(compiles, strncasecmp)) { 35 int strncasecmp(const (char)* s1, const (char)* s2, size_t len); 36 } 37 38 static if (!__traits(compiles, strlcpy)) { 39 size_t strlcpy(char* dst, const (char)* src, size_t siz); 40 } 41 42 static if (!__traits(compiles, strlcat)) { 43 size_t strlcat(char* dst, const (char)* src, size_t siz); 44 } 45 46 static if (!__traits(compiles, strndup)) { 47 char* strndup(const (char)* str, size_t maxlen); 48 49 /* the only user of strnlen is strndup, so only build it if needed */ 50 static if (!__traits(compiles, strnlen)) { 51 size_t strnlen(const (char)* str, size_t maxlen); 52 } 53 } 54 55 static if (!__traits(compiles, strsep)) { 56 char* strsep(char** stringp, const (char)* delim); 57 } 58 59 static if (!__traits(compiles, explicit_bzero)) { 60 void explicit_bzero(void*, size_t); 61 } 62 63 static if (!__traits(compiles, timingsafe_bcmp)) { 64 int timingsafe_bcmp(const (void)* b1, const (void)* b2, size_t n); 65 } 66 67 static if (!__traits(compiles, timingsafe_memcmp)) { 68 int timingsafe_memcmp(const (void)* b1, const (void)* b2, size_t len); 69 } 70 71 static if (!__traits(compiles, memmem)) { 72 void* memmem(const (void)* big, size_t big_len, const (void)* little, size_t little_len); 73 } 74 75 version (Windows) { 76 pragma(inline, true) 77 nothrow @nogc 78 private char* posix_strerror(int errnum) 79 80 do 81 { 82 if (errnum == core.sys.windows.winsock2.ECONNREFUSED) { 83 return cast(char*)(&("Connection refused\0"[0])); 84 } 85 86 return core.stdc..string.strerror(errnum); 87 } 88 89 alias strerror = .posix_strerror; 90 }