1
/******************************************************
3
* zexy - implementation file
5
* copyleft (c) IOhannes m zm�lnig
7
* 1999:forum::f�r::uml�ute:2004
9
* institute of electronic music and acoustics (iem)
11
******************************************************
13
* license: GNU General Public License v.2
15
******************************************************/
21
* list2symbol: convert a list into a single symbol
24
/* ------------------------- list2symbol ------------------------------- */
26
static t_class *list2symbol_class;
28
typedef struct _list2symbol
33
t_symbol *s,*connector;
38
static void list2symbol_connector(t_list2symbol *x, t_symbol *s){
42
static void list2symbol_bang(t_list2symbol *x)
47
int length = 0, len=0;
51
char*buffer = (char*)getbytes(MAXPDSTRING*sizeof(char));
53
connector=x->connector->s_name;
54
connlen=strlen(connector);
57
/* 1st get the length of the symbol */
58
if(x->s)length+=strlen(x->s->s_name);
65
if(A_SYMBOL==argv->a_type){
66
len2=strlen(argv->a_w.w_symbol->s_name);
68
atom_string(argv, buffer, MAXPDSTRING);
76
outlet_symbol(x->x_obj.ob_outlet, gensym(""));
80
result = (char*)getbytes((length+1)*sizeof(char));
82
/* 2nd create the symbol */
84
char *buf = x->s->s_name;
85
int buflen=strlen(buf);
86
strncpy(result+len, buf, length-len);
89
strncpy(result+len, connector, length-len);
96
if(A_SYMBOL==argv->a_type){
97
strncpy(result+len, argv->a_w.w_symbol->s_name, length-len);
98
len+= strlen(argv->a_w.w_symbol->s_name);
100
atom_string(argv, buffer, MAXPDSTRING);
101
strncpy(result+len, buffer, length-len);
102
len += strlen(buffer);
106
strncpy(result+len, connector, length-len);
110
freebytes(buffer, MAXPDSTRING*sizeof(char));
113
outlet_symbol(x->x_obj.ob_outlet, gensym(result));
114
freebytes(result, (length+1)*sizeof(char));
117
static void list2symbol_anything(t_list2symbol *x, t_symbol *s, int argc, t_atom *argv)
120
freebytes(x->ap, x->ac*sizeof(t_atom));
128
x->ap=(t_atom*)getbytes(x->ac*sizeof(t_atom));
139
static void list2symbol_list(t_list2symbol *x, t_symbol *s, int argc, t_atom *argv)
141
list2symbol_anything(x, 0, argc, argv);
143
static void *list2symbol_new(t_symbol *s, int argc, t_atom *argv)
145
t_list2symbol *x = (t_list2symbol *)pd_new(list2symbol_class);
147
x->x_outlet=outlet_new(&x->x_obj, 0);
148
x->x_inlet2=inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("symbol"), gensym(""));
151
/* old behaviour: the argument list is used as the list-to-be-converted */
152
x->connector = gensym(" ");
153
list2symbol_anything(x, 0, argc, argv);
155
/* new behaviour: set the delimiter with the argument */
156
list2symbol_connector(x, (argc)?atom_getsymbol(argv):gensym(" "));
163
static void list2symbol_free(t_list2symbol *x)
166
freebytes(x->ap, x->ac*sizeof(t_atom));
169
outlet_free(x->x_outlet);
170
inlet_free(x->x_inlet2);
174
void list2symbol_setup(void)
176
list2symbol_class = class_new(gensym("list2symbol"), (t_newmethod)list2symbol_new,
177
(t_method)list2symbol_free, sizeof(t_list2symbol), 0,
180
class_addcreator((t_newmethod)list2symbol_new, gensym("l2s"), A_GIMME, 0);
181
class_addbang (list2symbol_class, list2symbol_bang);
182
class_addlist (list2symbol_class, list2symbol_list);
183
class_addanything(list2symbol_class, list2symbol_anything);
184
class_addmethod (list2symbol_class, (t_method)list2symbol_connector, gensym(""), A_SYMBOL, 0);
186
zexy_register("list2symbol");