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 }