strcat+strcat+strcat == baaad
Francois Gouget
fgouget at free.fr
Sat Nov 30 00:11:27 CST 2002
I don't like pieces of code that go:
strcpy(foo, bar1);
strcat(foo, bar2);
strcat(foo, bar3);
strcat(foo, bar4);
strcat(foo, bar5);
strcat(foo, bar6);
It's really inefficient: the cost increases quadratically with the size
of the resulting string. It's more efficient to do:
sprintf(foo, "%s%s%s%s%s%s", bar1,bar2,bar3,bar4,bar5,bar6);
Here the cost is proportional to the size of the resulting string.
For for various reasons I came accross a couple of instances of
strcat+strcat badness and replaced them with a sprintf. So here's the
patch.
Changelog:
* memory/environ.c,
tools/makedep.c
Use sprintf rather than calling strcat over and over
Index: memory/environ.c
===================================================================
RCS file: /home/wine/wine/memory/environ.c,v
retrieving revision 1.38
diff -u -r1.38 environ.c
--- memory/environ.c 9 Oct 2002 18:35:02 -0000 1.38
+++ memory/environ.c 30 Nov 2002 05:20:12 -0000
@@ -641,12 +641,7 @@
/* Set the new string */
- if (value)
- {
- strcpy( p, name );
- strcat( p, "=" );
- strcat( p, value );
- }
+ if (value) sprintf( p, "%s=%s", name, value );
current_envdb.env = new_env;
ret = TRUE;
Index: tools/makedep.c
===================================================================
RCS file: /home/wine/wine/tools/makedep.c,v
retrieving revision 1.13
diff -u -r1.13 makedep.c
--- tools/makedep.c 17 Aug 2002 18:28:43 -0000 1.13
+++ tools/makedep.c 30 Nov 2002 06:10:17 -0000
@@ -192,9 +192,7 @@
if (SrcDir)
{
pFile->filename = xmalloc( strlen(SrcDir) + strlen(pFile->name) + 2 );
- strcpy( pFile->filename, SrcDir );
- strcat( pFile->filename, "/" );
- strcat( pFile->filename, pFile->name );
+ sprintf( pFile->filename, "%s/%s", SrcDir, pFile->name );
}
else pFile->filename = xstrdup( pFile->name );
@@ -218,9 +216,7 @@
for (path = firstPath; path; path = path->next)
{
char *filename = xmalloc(strlen(path->name) + strlen(pFile->name) + 2);
- strcpy( filename, path->name );
- strcat( filename, "/" );
- strcat( filename, pFile->name );
+ sprintf( filename, "%s/%s", path->name, pFile->name );
if ((file = fopen( filename, "r" )))
{
pFile->filename = filename;
--
Francois Gouget fgouget at free.fr http://fgouget.free.fr/
Linux: It is now safe to turn on your computer.
More information about the wine-patches
mailing list