[syslinux:master] strreplace: clean up and simplify
syslinux-bot for H. Peter Anvin
hpa at zytor.com
Mon Feb 6 11:12:06 PST 2012
Commit-ID: 9fe49d0aab0e6366f38d81b8559c308825f9a4e2
Gitweb: http://www.syslinux.org/commit/9fe49d0aab0e6366f38d81b8559c308825f9a4e2
Author: H. Peter Anvin <hpa at zytor.com>
AuthorDate: Mon, 6 Feb 2012 11:08:45 -0800
Committer: H. Peter Anvin <hpa at zytor.com>
CommitDate: Mon, 6 Feb 2012 11:08:45 -0800
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 at zytor.com>
---
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 292b11d..bbe6d9e 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;
}
More information about the Syslinux-commits
mailing list