PERFORCE change 180399 for review
Benjamin Fiedler
bfiedler at FreeBSD.org
Fri Jul 2 00:21:56 UTC 2010
http://p4web.freebsd.org/@@180399?ac=10
Change 180399 by bfiedler at 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;
}
More information about the p4-projects
mailing list