Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 2 Jul 2010 00:21:55 GMT
From:      Benjamin Fiedler <bfiedler@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 180399 for review
Message-ID:  <201007020021.o620LtdW000670@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@180399?ac=10

Change 180399 by bfiedler@freebsd-7803 on 2010/07/02 00:21:46

	Fix bugs in strrep()

Affected files ...

.. //depot/projects/soc2010/bsdtextproc/gabor_diff/diff.c#8 edit
.. //depot/projects/soc2010/bsdtextproc/gabor_diff/diffreg.c#9 edit

Differences ...

==== //depot/projects/soc2010/bsdtextproc/gabor_diff/diff.c#8 (text+ko) ====


==== //depot/projects/soc2010/bsdtextproc/gabor_diff/diffreg.c#9 (text+ko) ====

@@ -1573,12 +1573,12 @@
 
 /*
  * Replaces all occurences of substring 'old' with substring 'new',
- * realloc()'ing base ptr as necessary
+ * realloc()'ing base ptr if more characters necessary
  */
 char *
 strrep(char *base, char *old, char *new)
 {
-        char    *ptr, *tmp, *end;
+        char    *ptr, *tmp;
         int     occ, len1, len2, newlen;
 
         occ = 0;  
@@ -1592,45 +1592,36 @@
                 return base;
         }
 
-        while( (ptr = strstr(ptr, old)) )
+        for(; (ptr = strstr(ptr, old)); occ++ )
         {
-                occ++;   
                 ptr+=len1;
         }
 
-        if( occ == 0){
+        if( occ == 0)
+	{
                 return base;
         }
 
+        newlen = strlen(base) + occ * (len2 - len1);
 
-        newlen = strlen(base) + occ * (len2 - len1);
-        end = base + newlen -1;
         if( len2 > len1)
         {
-                base = realloc(base, sizeof(char) * newlen );
+                base = erealloc(base, sizeof(char) * newlen +1);
         }
 
-        tmp = malloc( sizeof(char) * strlen(base));
+        tmp = emalloc( sizeof(char) * strlen(base) +1);
 
-        if( len2 > 0 )
-	{
-        	len2 = 1;
-        }
-        for (ptr = base; (ptr = strstr(base, old)) != NULL; )
+        for (ptr = base; (ptr = strstr(ptr, old)) != NULL; )
         {
-                strncpy(tmp, ptr+len1, strlen(base) );
+                strncpy(tmp, ptr+len1, strlen(base)+1 );
                 strncpy(ptr, new, len2);
-                strncpy(ptr+len2, tmp, end - ptr );
-                ptr+=len2;
+                strncpy(ptr+len2, tmp, strlen(tmp)+1);
+                ptr+= len2 > 0 ? len2 : 1;
         }
 
-        if(len2 < len1)
-	{
-                *(end + occ*(len2 - len1) ) = '\0';
-        }
+	*(base + newlen) = '\0';
 
         free(tmp);
-
         return base;
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201007020021.o620LtdW000670>