summaryrefslogtreecommitdiff
path: root/com32
diff options
context:
space:
mode:
authorErwan Velu <erwanaliasr1@gmail.com>2012-02-24 20:56:32 +0100
committerErwan Velu <erwanaliasr1@gmail.com>2012-02-24 20:56:32 +0100
commit02055a8310be4faf56040fee5713d24235d9786e (patch)
tree76f96a1f109a0c9614b877e5d06109e9f5c685a1 /com32
parent442c60166a9165e4253fd091aba92c04c699017d (diff)
parentd0564771471d41dce35d4c8b37ab6845930c3354 (diff)
downloadsyslinux-02055a8310be4faf56040fee5713d24235d9786e.tar.gz
Merge remote-tracking branch 'hpa/master'
Diffstat (limited to 'com32')
-rw-r--r--com32/include/string.h2
-rw-r--r--com32/lib/strreplace.c44
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;
}