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 }