diff options
author | Erwan Velu <erwanaliasr1@gmail.com> | 2012-02-24 20:56:32 +0100 |
---|---|---|
committer | Erwan Velu <erwanaliasr1@gmail.com> | 2012-02-24 20:56:32 +0100 |
commit | 02055a8310be4faf56040fee5713d24235d9786e (patch) | |
tree | 76f96a1f109a0c9614b877e5d06109e9f5c685a1 /com32 | |
parent | 442c60166a9165e4253fd091aba92c04c699017d (diff) | |
parent | d0564771471d41dce35d4c8b37ab6845930c3354 (diff) | |
download | syslinux-02055a8310be4faf56040fee5713d24235d9786e.tar.gz |
Merge remote-tracking branch 'hpa/master'
Diffstat (limited to 'com32')
-rw-r--r-- | com32/include/string.h | 2 | ||||
-rw-r--r-- | com32/lib/strreplace.c | 44 |
2 files changed, 25 insertions, 21 deletions
diff --git a/com32/include/string.h b/com32/include/string.h index 014b8de9..d847440d 100644 --- a/com32/include/string.h +++ b/com32/include/string.h @@ -42,6 +42,6 @@ __extern char *strsep(char **, const char *); __extern size_t strspn(const char *, const char *); __extern char *strstr(const char *, const char *); __extern char *strtok(char *, const char *); -__extern char *strreplace( const char *string, const char *string_to_replace, const char *string_to_insert ); +__extern char *strreplace(const char *, const char *, const char *); #endif /* _STRING_H */ 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; } |