[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