aboutsummaryrefslogtreecommitdiff
path: root/src/z_strings.c
diff options
context:
space:
mode:
authorIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2004-07-22 12:19:20 +0000
committerIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2004-07-22 12:19:20 +0000
commit4b76cd922db22e0fac65d26b49882c140a4a18b5 (patch)
tree848e46c834a1043f843c3cdf7e05167f4f900906 /src/z_strings.c
parentfa488f42379478792e62b66bd17d595f921e807e (diff)
fixed a memory-leak in [l2s] (thanks to ix@replic.net)
svn path=/trunk/externals/zexy/; revision=1883
Diffstat (limited to 'src/z_strings.c')
-rw-r--r--src/z_strings.c78
1 files changed, 48 insertions, 30 deletions
diff --git a/src/z_strings.c b/src/z_strings.c
index e2f8e21..7ec8d40 100644
--- a/src/z_strings.c
+++ b/src/z_strings.c
@@ -3,12 +3,12 @@
#include <string.h>
#ifdef NT
-#pragma warning( disable : 4244 )
-#pragma warning( disable : 4305 )
-#define sqrtf sqrt
-#define STATIC_INLINE
-#else
-#define STATIC_INLINE static
+# pragma warning( disable : 4244 )
+# pragma warning( disable : 4305 )
+# define sqrtf sqrt
+# define STATIC_INLINE
+#else
+# define STATIC_INLINE static
#endif
/*
@@ -191,39 +191,54 @@ static void list2symbol_bang(t_list2symbol *x)
t_atom *argv=x->ap;
int argc=x->ac;
char *result = 0;
- char string[MAXPDSTRING];
- int length = 0;
+ int length = 0, len=0;
int i= argc;
+ char *connector=0;
+ char connlen=0;
+ if(x->connector)connector=x->connector->s_name;
+ if(connector)connlen=strlen(connector);
+ /* 1st get the length of the symbol */
+ if(x->s)length+=strlen(x->s->s_name);
+ else length-=connlen;
+
+ length+=i*connlen;
+
+ while(i--){
+ char buffer[MAXPDSTRING];
+ atom_string(argv++, buffer, MAXPDSTRING);
+ length+=strlen(buffer);
+ }
+
+ if (length<0){
+ outlet_symbol(x->x_obj.ob_outlet, gensym(""));
+ return;
+ }
+
+ result = (char*)getbytes((length+1)*sizeof(char));
+
+ /* 2nd create the symbol */
if (x->s){
char *buf = x->s->s_name;
- int newlen = length + strlen(buf);
- strcpy(string+length, buf);
- length = newlen;
- if(i && x->connector){
- char *buf = x->connector->s_name;
- newlen = length + strlen(buf);
- strcpy(string+length, buf);
- length = newlen;
+ strcpy(result+len, buf);
+ len+=strlen(buf);
+ if(i && connector){
+ strcpy(result+len, connector);
+ len += connlen;
}
}
+ i=argc;
+ argv=x->ap;
while(i--){
char buffer[MAXPDSTRING];
- int newlen;
atom_string(argv++, buffer, MAXPDSTRING);
- newlen = length + strlen(buffer);
- strcpy(string+length, buffer);
- length = newlen;
- if(i && x->connector){
- char *buf = x->connector->s_name;
- newlen = length + strlen(buf);
- strcpy(string+length, buf);
- length = newlen;
+ strcpy(result+len, buffer);
+ len += strlen(buffer);
+ if(i && connector){
+ strcpy(result+len, connector);
+ len += connlen;
}
}
- length = strlen(string);
- result = (char*)getbytes((length+1)*sizeof(char));
- strcpy(result, string);
result[length]=0;
outlet_symbol(x->x_obj.ob_outlet, gensym(result));
freebytes(result, (length+1)*sizeof(char));
@@ -335,12 +350,15 @@ static void symbol2list_process(t_symbol2list *x)
deli=x->delimiter->s_name;
dell=strlen(deli);
+
/* get the number of tokens */
while((d=strstr(cp, deli))){
- if (d!=NULL && d!=cp)i++;
+ if (d!=NULL && d!=cp){
+ i++;
+ }
cp=d+dell;
}
-
+
/* resize the list-buffer if necessary */
if(x->argnum<i){
freebytes(x->argv, x->argnum*sizeof(t_atom));