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
******************************************************/
22
* strcmp : compare 2 lists as if they were strings
25
/* ------------------------- strcmp ------------------------------- */
27
/* compare 2 lists ( == for lists) */
29
static t_class *strcmp_class;
30
static t_class *strcmp_proxy_class;
33
typedef struct _strcmp
36
struct _strcmp_proxy *x_proxy;
38
t_binbuf *bbuf1, *bbuf2;
43
typedef struct _strcmp_proxy
50
static void strcmp_bang(t_strcmp *x)
55
result = strcmp(x->str1, x->str2);
65
outlet_float(x->x_obj.ob_outlet, result);
68
static void list2binbuf(t_binbuf**bbuf, int *n, char**str, int argc, t_atom*argv)
72
if(*str&&*n)freebytes(*str, *n);
75
binbuf_add(*bbuf, argc, argv);
76
binbuf_gettext(*bbuf, str, n);
83
static void strcmp_list(t_strcmp *x, t_symbol *s, int argc, t_atom *argv)
86
list2binbuf(&x->bbuf1, &x->n1, &x->str1, argc, argv);
89
static void strcmp_symbol(t_strcmp *x, t_symbol *s)
91
if(x->str1&&x->n1)freebytes(x->str1, x->n1);
97
static void strcmp_secondlist(t_strcmp *x, t_symbol *s, int argc, t_atom *argv)
100
list2binbuf(&x->bbuf2, &x->n2, &x->str2, argc, argv);
102
static void strcmp_secondsymbol(t_strcmp *x, t_symbol *s)
104
if(x->str2&&x->n2)freebytes(x->str2, x->n2);
109
static void strcmp_proxy_list(t_strcmp_proxy *y, t_symbol *s, int argc, t_atom *argv)
111
strcmp_secondlist(y->p_master, s, argc, argv);
113
static void strcmp_proxy_symbol(t_strcmp_proxy *y, t_symbol *s)
115
if(s)strcmp_secondsymbol(y->p_master, s);
118
static void *strcmp_new(t_symbol *s, int argc, t_atom *argv)
120
t_strcmp *x = (t_strcmp *)pd_new(strcmp_class);
123
x->x_proxy=(t_strcmp_proxy*)pd_new(strcmp_proxy_class);
124
x->x_proxy->p_master = x;
125
x->x_proxy->p_in = inlet_new ((t_object*)x, (t_pd*)x->x_proxy, 0,0);
127
outlet_new(&x->x_obj, 0);
129
x->bbuf1 = binbuf_new();
130
x->bbuf2 = binbuf_new();
137
if(argc)strcmp_secondlist(x, gensym("list"), argc, argv);
142
static void strcmp_free(t_strcmp *x)
144
binbuf_free(x->bbuf1);
145
binbuf_free(x->bbuf2);
146
if(x->str1&&x->n1)freebytes(x->str1, x->n1);
147
if(x->str2&&x->n2)freebytes(x->str2, x->n2);
149
inlet_free(x->x_proxy->p_in);
150
x->x_proxy->p_master=0;
151
pd_free(&x->x_proxy->p_pd);
155
static void strcmp_help(t_strcmp*x)
157
post("\n%c strcmp\t\t:: compare to lists as strings", HEARTSYMBOL);
161
void strcmp_setup(void)
163
strcmp_class = class_new(gensym("strcmp"), (t_newmethod)strcmp_new,
164
(t_method)strcmp_free, sizeof(t_strcmp), 0, A_GIMME, 0);
166
class_addbang (strcmp_class, strcmp_bang);
167
class_addsymbol (strcmp_class, strcmp_symbol);
168
class_addlist (strcmp_class, strcmp_list);
170
strcmp_proxy_class = class_new(gensym("strcmp proxy"), 0, 0,
171
sizeof(t_strcmp_proxy),
172
CLASS_PD | CLASS_NOINLET, 0);
173
class_addsymbol(strcmp_proxy_class, strcmp_proxy_symbol);
174
class_addlist(strcmp_proxy_class, strcmp_proxy_list);
175
class_addmethod(strcmp_class, (t_method)strcmp_help, gensym("help"), A_NULL);
176
zexy_register("strcmp");