diff options
Diffstat (limited to 'com32/lib')
-rw-r--r-- | com32/lib/strreplace.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/com32/lib/strreplace.c b/com32/lib/strreplace.c index 292b11da..d59efe0e 100644 --- a/com32/lib/strreplace.c +++ b/com32/lib/strreplace.c @@ -29,26 +29,30 @@ #include <string.h> #include <stdlib.h> -char *strreplace( const char *string, const char *string_to_replace, const char *string_to_insert ){ - char *token = NULL; - char *output_buffer = NULL; - - token = strstr(string, string_to_replace); - - if(token == NULL) - return strdup( string ); - - output_buffer = malloc(strlen( string )-strlen( string_to_replace )+strlen(string_to_insert )+ 1); - - if(output_buffer == NULL) +char *strreplace(const char *string, const char *string_to_replace, + const char *string_to_insert) +{ + char *token = NULL; + char *out = NULL; + + size_t slen, srlen, silen; + + token = strstr(string, string_to_replace); + if (!token) + return strdup(string); + + slen = strlen(string); + srlen = strlen(string_to_replace); + silen = strlen(string_to_insert); + + out = malloc(slen - srlen + silen + 1); + if (!out) return NULL; + + memcpy(out, string, token - string); + memcpy(out + (token - string), string_to_insert, silen); + memcpy(out + (token - string) + silen, token + srlen, + slen - srlen - (token - string) + 1); - memcpy(output_buffer, string, token-string); - memcpy(output_buffer + (token - string), string_to_insert, strlen(string_to_insert)); - memcpy(output_buffer + (token - string) + strlen(string_to_insert), - token + strlen(string_to_replace), - strlen(string) - strlen(string_to_replace) - (token - string)); - memset(output_buffer + strlen(string) - strlen(string_to_replace) + strlen(string_to_insert), 0, 1 ); - - return output_buffer; + return out; } |