/* nrciChat.c formats symbols from [keyname] PD object into strings also accepts "Enter" and "BackSpace" keys removes all other "Name" keys for use in NRCI 4.5.2008 copyleft greg surges - updated to deal with "keyname" object change - 8.10.2008 gs */ #include "m_pd.h" #include #include static t_class *nrciChat_class; static t_int MAX_SIZE = 200; typedef struct _nrciChat { t_object x_obj; char *text; t_int drop; t_outlet *progress; } t_nrciChat; void nrciChat_symbol(t_nrciChat *x, t_symbol *s, int argc, t_atom *argv); void nrciChat_Return(t_nrciChat *x); void nrciChat_BackSpace(t_nrciChat *x); void nrciChat_setup(void); void *nrciChat_new(void); void nrciChat_symbol(t_nrciChat *x, t_symbol *s, int argc, t_atom *argv) { //if(x->drop % 2 == 0) //{ char *input; input = (char *)malloc(MAX_SIZE); atom_string(argv, input, MAX_SIZE); if(strcmp(input, "Return") == 0) { nrciChat_Return(x); } else { if(strcmp(input, "BackSpace") == 0) { nrciChat_BackSpace(x); } else { if(strcmp(input, "Space") == 0) { strncat(x->text, " ", MAX_SIZE); } else { if(strlen(input) == 1) { strncat(x->text, input, MAX_SIZE); outlet_symbol(x->progress, gensym(x->text)); } } } } //} //is a free(input); necessary here? //++x->drop; } void nrciChat_Return(t_nrciChat *x) { if(strlen(x->text) != 0) { outlet_symbol(x->x_obj.ob_outlet, gensym(x->text)); stpcpy(x->text, ""); outlet_symbol(x->progress, gensym(" ")); } } void nrciChat_BackSpace(t_nrciChat *x) { char *newString; newString = (char *)malloc(MAX_SIZE); t_int length = strlen(x->text); if(length != 0) { strncpy(newString, x->text, length - 1); free(x->text); x->text = (char *)malloc(MAX_SIZE); strncpy(x->text, newString, MAX_SIZE); outlet_symbol(x->progress, gensym(x->text)); free(newString); } } void *nrciChat_new(void) { t_nrciChat *x = (t_nrciChat *)pd_new(nrciChat_class); x->text = (char *)malloc(MAX_SIZE); x->drop = 0; outlet_new(&x->x_obj, &s_symbol); x->progress = outlet_new(&x->x_obj, &s_symbol); return (void *) x; } void nrciChat_setup() { nrciChat_class = class_new(gensym("nrciChat"), (t_newmethod)nrciChat_new, 0, sizeof(t_nrciChat), CLASS_DEFAULT, 0); class_addanything(nrciChat_class, nrciChat_symbol); }