diff options
Diffstat (limited to 'src/iemlib2/dollarg.c')
-rw-r--r-- | src/iemlib2/dollarg.c | 220 |
1 files changed, 110 insertions, 110 deletions
diff --git a/src/iemlib2/dollarg.c b/src/iemlib2/dollarg.c index 3e90053..c21d29e 100644 --- a/src/iemlib2/dollarg.c +++ b/src/iemlib2/dollarg.c @@ -1,110 +1,110 @@ -/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
-
-iemlib2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
-
-#include "m_pd.h"
-#include "g_canvas.h"
-#include "iemlib.h"
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <math.h>
-
-EXTERN void canvas_getargs(int *argcp, t_atom **argvp);
-
-/* ------------------------- dollarg ---------------------------- */
-/* --- dollar-arguments, output the initial-arguments and the --- */
-/* ------- number of them of the parent abstraction-patch ------- */
-
-static t_class *dollarg_class;
-
-typedef struct _dollarg
-{
- t_object x_obj;
- void *x_outlet_ac;
- t_atom *x_at;
- int x_ac;
-} t_dollarg;
-
-static void dollarg_float(t_dollarg *x, t_floatarg f)
-{
- int i = (int)f;
-
- if(!i)
- {
- outlet_float(x->x_outlet_ac, x->x_ac);
- if(x->x_ac)
- outlet_list(x->x_obj.ob_outlet, &s_list, x->x_ac, x->x_at);
- }
- else if(i > 0)
- {
- if(i <= x->x_ac)
- {
- outlet_float(x->x_outlet_ac, i);
- if(IS_A_FLOAT(x->x_at, i-1))
- outlet_float(x->x_obj.ob_outlet, atom_getfloatarg(i-1, x->x_ac, x->x_at));
- else if(IS_A_SYMBOL(x->x_at, i-1))
- outlet_symbol(x->x_obj.ob_outlet, atom_getsymbolarg(i-1, x->x_ac, x->x_at));
- }
- else
- outlet_float(x->x_outlet_ac, 0);
- }
- else
- {
- int j = x->x_ac + i;
-
- if(j >= 0)
- {
- outlet_float(x->x_outlet_ac, j+1);
- if(IS_A_FLOAT(x->x_at, j))
- outlet_float(x->x_obj.ob_outlet, atom_getfloatarg(j, x->x_ac, x->x_at));
- else if(IS_A_SYMBOL(x->x_at, j))
- outlet_symbol(x->x_obj.ob_outlet, atom_getsymbolarg(j, x->x_ac, x->x_at));
- }
- else
- outlet_float(x->x_outlet_ac, 0);
- }
-}
-
-static void dollarg_bang(t_dollarg *x)
-{
- dollarg_float(x, 0.0f);
-}
-
-static void dollarg_free(t_dollarg *x)
-{
- if(x->x_ac)
- freebytes(x->x_at, x->x_ac * sizeof(t_atom));
-}
-
-static void *dollarg_new(void)
-{
- t_dollarg *x = (t_dollarg *)pd_new(dollarg_class);
- t_glist *glist=(t_glist *)canvas_getcurrent();
- t_canvas *canvas=glist_getcanvas(glist);
- int pargc;
- t_atom *pargv, *at;
-
- canvas_setcurrent(canvas);
- canvas_getargs(&pargc, &pargv);
- canvas_unsetcurrent(canvas);
- x->x_at = (t_atom *)getbytes(pargc*sizeof(t_atom));
- x->x_ac = pargc;
- at = x->x_at;
- while(pargc--)
- *at++ = *pargv++;
- outlet_new(&x->x_obj, &s_list);
- x->x_outlet_ac = outlet_new(&x->x_obj, &s_float);
- return (x);
-}
-
-void dollarg_setup(void)
-{
- dollarg_class = class_new(gensym("dollarg"), (t_newmethod)dollarg_new,
- (t_method)dollarg_free, sizeof(t_dollarg), 0, 0);
- class_addcreator((t_newmethod)dollarg_new, gensym("$n"), 0);
- class_addbang(dollarg_class, (t_method)dollarg_bang);
- class_addfloat(dollarg_class, (t_method)dollarg_float);
- class_sethelpsymbol(dollarg_class, gensym("iemhelp/help-dollarg"));
-}
+/* For information on usage and redistribution, and for a DISCLAIMER OF ALL +* WARRANTIES, see the file, "LICENSE.txt," in this distribution. + +iemlib2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */ + +#include "m_pd.h" +#include "g_canvas.h" +#include "iemlib.h" +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <math.h> + +EXTERN void canvas_getargs(int *argcp, t_atom **argvp); + +/* ------------------------- dollarg ---------------------------- */ +/* --- dollar-arguments, output the initial-arguments and the --- */ +/* ------- number of them of the parent abstraction-patch ------- */ + +static t_class *dollarg_class; + +typedef struct _dollarg +{ + t_object x_obj; + void *x_outlet_ac; + t_atom *x_at; + int x_ac; +} t_dollarg; + +static void dollarg_float(t_dollarg *x, t_floatarg f) +{ + int i = (int)f; + + if(!i) + { + outlet_float(x->x_outlet_ac, x->x_ac); + if(x->x_ac) + outlet_list(x->x_obj.ob_outlet, &s_list, x->x_ac, x->x_at); + } + else if(i > 0) + { + if(i <= x->x_ac) + { + outlet_float(x->x_outlet_ac, i); + if(IS_A_FLOAT(x->x_at, i-1)) + outlet_float(x->x_obj.ob_outlet, atom_getfloatarg(i-1, x->x_ac, x->x_at)); + else if(IS_A_SYMBOL(x->x_at, i-1)) + outlet_symbol(x->x_obj.ob_outlet, atom_getsymbolarg(i-1, x->x_ac, x->x_at)); + } + else + outlet_float(x->x_outlet_ac, 0); + } + else + { + int j = x->x_ac + i; + + if(j >= 0) + { + outlet_float(x->x_outlet_ac, j+1); + if(IS_A_FLOAT(x->x_at, j)) + outlet_float(x->x_obj.ob_outlet, atom_getfloatarg(j, x->x_ac, x->x_at)); + else if(IS_A_SYMBOL(x->x_at, j)) + outlet_symbol(x->x_obj.ob_outlet, atom_getsymbolarg(j, x->x_ac, x->x_at)); + } + else + outlet_float(x->x_outlet_ac, 0); + } +} + +static void dollarg_bang(t_dollarg *x) +{ + dollarg_float(x, 0.0f); +} + +static void dollarg_free(t_dollarg *x) +{ + if(x->x_ac) + freebytes(x->x_at, x->x_ac * sizeof(t_atom)); +} + +static void *dollarg_new(void) +{ + t_dollarg *x = (t_dollarg *)pd_new(dollarg_class); + t_glist *glist=(t_glist *)canvas_getcurrent(); + t_canvas *canvas=glist_getcanvas(glist); + int pargc; + t_atom *pargv, *at; + + canvas_setcurrent(canvas); + canvas_getargs(&pargc, &pargv); + canvas_unsetcurrent(canvas); + x->x_at = (t_atom *)getbytes(pargc*sizeof(t_atom)); + x->x_ac = pargc; + at = x->x_at; + while(pargc--) + *at++ = *pargv++; + outlet_new(&x->x_obj, &s_list); + x->x_outlet_ac = outlet_new(&x->x_obj, &s_float); + return (x); +} + +void dollarg_setup(void) +{ + dollarg_class = class_new(gensym("dollarg"), (t_newmethod)dollarg_new, + (t_method)dollarg_free, sizeof(t_dollarg), 0, 0); + class_addcreator((t_newmethod)dollarg_new, gensym("$n"), 0); + class_addbang(dollarg_class, (t_method)dollarg_bang); + class_addfloat(dollarg_class, (t_method)dollarg_float); + class_sethelpsymbol(dollarg_class, gensym("iemhelp/help-dollarg")); +} |