/* * makesymbol: yet another (formatted) symbol creation mechanism * * (c) 1999-2011 IOhannes m zmölnig, forum::für::umläute, institute of electronic music and acoustics (iem) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ /* (l) 1210:forum::für::umläute:1999 "makesymbol" is something between "symbol" and "makefilename", thus storing and creating (formatted) symbols... TODO: the use of only "%s" is really not very satisfying LATER: split the entire format string into subformats with only one format-placeholder ("%[^%]*[diufFgGxXoscpn]") . split the entire format string into subformats with only one format-placeholder, store the types when a list comes in, evaluate each subformat (with prior type-conversion) */ #include "zexy.h" #include #include #define MAXSTRINGARGS 10 #define MAXSTRINGLENG MAXPDSTRING /* ----------------------- makesymbol --------------------- */ static t_class *makesymbol_class; typedef struct _makesymbol { t_object x_obj; t_symbol *x_sym; char* mask; char* buf; } t_makesymbol; static void reset_mask(t_makesymbol *x, t_symbol *s) { if (*s->s_name) { x->mask = s->s_name; x->x_sym = s; } else { x->mask = "%s%s%s%s%s%s%s%s%s%s"; x->x_sym = gensym(""); } } typedef char cstring[MAXSTRINGLENG]; static t_symbol* list2symbol(char *masque, int argc, t_atom *argv) { cstring*buf=(cstring*)getbytes(MAXSTRINGARGS*sizeof(cstring)); cstring buffer; int i; for(i=0; ix_sym = list2symbol(x->mask, argc, argv); outlet_symbol(x->x_obj.ob_outlet, x->x_sym); } static void makesymbol_bang(t_makesymbol *x) { outlet_symbol(x->x_obj.ob_outlet, x->x_sym); } static void *makesymbol_new(t_symbol* UNUSED(s), int argc, t_atom *argv) { t_makesymbol *x = (t_makesymbol *)pd_new(makesymbol_class); x->buf = (char *)getbytes(MAXSTRINGLENG * sizeof(char)); x->mask = x->buf; if (argc) { atom_string(argv, x->buf, MAXSTRINGLENG); x->x_sym = gensym(x->buf); } else { x->mask = "%s%s%s%s%s%s%s%s%s%s"; x->x_sym = gensym(""); } outlet_new(&x->x_obj, gensym("symbol")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("symbol"), gensym("sym1")); return (x); } static void makesymbol_free(t_makesymbol *x) { freebytes(x->buf, MAXSTRINGLENG*sizeof(char)); } static void makesymbol_helper(t_makesymbol* UNUSED(x)) { post("\n"HEARTSYMBOL" makesymbol :: create a formatted symbol"); post("\t: glue up to 10 list-elements to 1 formatted symbol\n" "'bang'\t\t\t: re-output\n" "'help'\t\t\t: view this" "\ninlet2 : : new format-string (symbol !)" "\noutlet : \t: formatted concatenation"); post("\ncreation:\"makesymbol []\": C-style format-string (%s only)", "%s"); } void makesymbol_setup(void) { makesymbol_class = class_new(gensym("makesymbol"), (t_newmethod)makesymbol_new, (t_method)makesymbol_free, sizeof(t_makesymbol), 0, A_GIMME, 0); class_addlist(makesymbol_class, makesymbol_list); class_addbang(makesymbol_class, makesymbol_bang); class_addmethod(makesymbol_class, (t_method)reset_mask, gensym("sym1"), A_SYMBOL, 0); class_addmethod(makesymbol_class, (t_method)makesymbol_helper, gensym("help"), 0); zexy_register("makesymbol"); }