diff options
author | H. Peter Anvin <hpa@zytor.com> | 2012-02-06 11:08:45 -0800 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2012-02-06 11:08:45 -0800 |
commit | 9fe49d0aab0e6366f38d81b8559c308825f9a4e2 (patch) | |
tree | eacfb46015ec9992e17192059786886a6a7d3bc0 | |
parent | c0c25b4826950162517896c5039c6d62d07115be (diff) | |
download | syslinux-9fe49d0aab0e6366f38d81b8559c308825f9a4e2.tar.gz syslinux-9fe49d0aab0e6366f38d81b8559c308825f9a4e2.tar.xz syslinux-9fe49d0aab0e6366f38d81b8559c308825f9a4e2.zip |
strreplace: clean up and simplify
Clean up and simplify strreplace(); in particular there is no need to
call strlen() repeatedly on the same strings.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-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..bbe6d9eb 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; } |