1 module stdlow..string;
2 import core.stdc.string;
3 
4 @trusted H memccpy(T, H)(H dest, const H src, T needle, size_t size) {
5     char* to_needle_ptr;
6     auto dest_size = memchr(to_needle_ptr, cast(char*) src, needle, size);
7     cast(void) memcpy(dest, src, dest_size);
8     if (dest_size == size) {
9         return null;
10     }
11     
12     return to_needle_ptr++;
13 }
14 
15 @trusted H memchr(T, H)(const H s, T needle, size_t size) {
16 	H return_ptr;
17 	memchr(return_ptr, s, needle, size);
18 	return return_ptr;
19 }
20 
21 @trusted size_t memchr(T, H)(out H return_ptr, const H s, T needle, size_t size) {
22 	if (size) {
23 		auto str_ptr = cast(const char*) s;
24 		for(int i = 0; i < size; i++) {
25 			if (str_ptr[i] == cast(char) needle) {
26 				return_ptr = cast(H) (&str_ptr[i]);
27 				return i;
28 			}
29 		}
30 	}
31 	
32 	return size;
33 }
34 
35 @trusted H memrchr(T, H)(const H s, T needle, size_t size) {
36 	H return_ptr;
37 	memrchr(return_ptr, s, needle, size);
38 	return return_ptr;
39 }
40 
41 @trusted size_t memrchr(T, H)(out H return_ptr, const H s, T needle, size_t size) {
42     	if (size) {
43 		auto str_ptr = cast(char*) s + size;
44 		
45 		for(int i = 0; i < size; i++) {
46             if(*str_ptr == cast(char) needle) {
47                 return_ptr = cast(H) (str_ptr);
48                 return size - i;
49             }
50             str_ptr--;
51 		}
52 	}
53 	
54 	return size;
55 }
56 
57 @trusted int memcmp(T)(const T s1, const T s2, size_t size) {
58 	if(size) {
59 		auto s1_str = cast(char*) s1;
60 		auto s2_str = cast(char*) s2;
61 		
62 		while(size-- > 0) {
63 			if(*s1_str++ != *s2_str++) {
64 				return s1_str[-1] < s2_str[-1] ? -1 : 1;
65 			}
66 		}
67 	}
68 
69 	return 0;	
70 }
71 
72 @trusted H memcpy(H)(H dest, const H src, size_t len) {
73     auto return_ptr = core.stdc..string.memcpy(cast(void*) dest, cast(void*) src, len);
74     return cast(H) return_ptr;
75 }
76 
77 @trusted H memmem(T, H)(H haystack_ptr, size_t size, const T needle) {
78 	H return_ptr;
79 	memmem(return_ptr, haystack_ptr, size, needle);
80 	return return_ptr;
81 }
82 
83 @trusted size_t memmem(T, H)(out H return_ptr, const H haystack_ptr, size_t size, const T needle) {
84 	auto haystack = cast(char*) haystack_ptr;
85 	auto haystack_last = haystack_ptr + size;
86 	char* current_ptr;
87 	auto last_ptr = haystack + size - needle.length;
88 	
89 	if (size == 0) {
90 		return 0;
91 	}
92 	
93 	if (needle.length == 0) {
94 		return 0;
95 	}
96 	
97 	if (size < needle.length) {
98 		return 0;
99 	}
100 	
101 	if (needle.length == 1) {
102 		return_ptr = cast(H) memchr(haystack_ptr, cast(int) needle[0], size);
103 		auto before_size = haystack_last - return_ptr;
104 		return size - before_size;
105 	}
106 	
107 	for(current_ptr = haystack; current_ptr < last_ptr; current_ptr++) {
108 		if(current_ptr[0] == needle[0] && memcmp(current_ptr, cast(void*) needle, needle[0].sizeof * needle.length) == 0) {
109 			return_ptr = current_ptr;
110 			auto before_size = haystack_last - return_ptr;
111 			return size - before_size; 
112 		}
113 	}
114 	
115 	return size;
116 }
117 
118 
119 @trusted H memmove(H)(H dest, const H src, size_t len) {
120     auto return_ptr = core.stdc..string.memmove(cast(void*) dest, cast(void*) src, len);
121     return cast(H) return_ptr;
122 } 
123 
124 @trusted H memset(H)(H dest, const H src, size_t len) {
125     auto return_ptr = core.stdc..string.memset(cast(void*) dest, cast(void*) src, len);
126     return cast(H) return_ptr;
127 }