Update of /cvsroot/pure-data/externals/moocow/pdstring/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23251/src
Modified Files: Makefile.am any2string.c pdstring-help.pd pdstring.c string2any.c Added Files: any2string-help.pd any2string_static.c string2any-help.pd Log Message: pdstring v0.05 + added persistent string buffer to any2string + added initial buffer size and eos-character arguments to any2string, string2any - defaults are backwards-compatible but ugly + added --enable-object-externals option to configure
Index: pdstring-help.pd =================================================================== RCS file: /cvsroot/pure-data/externals/moocow/pdstring/src/pdstring-help.pd,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** pdstring-help.pd 2 Feb 2006 12:46:01 -0000 1.1 --- pdstring-help.pd 26 Jul 2007 12:20:50 -0000 1.2 *************** *** 1,3 **** ! #N canvas 381 42 563 311 10; #X text 258 284 Bryan Jurish moocow@ling.uni-potsdam.de; #X floatatom 56 81 8 0 0 0 - - -; --- 1,3 ---- ! #N canvas 191 76 563 311 10; #X text 258 284 Bryan Jurish moocow@ling.uni-potsdam.de; #X floatatom 56 81 8 0 0 0 - - -; *************** *** 5,10 **** #X text 201 59 ... no special handling for symbols; #X text 200 37 anything can be converted to a list...; - #X obj 383 3 pdstring; - #X text 54 3 any2string , string2any : ASCII conversions in; #X obj 37 108 any2string; #X obj 37 230 string2any; --- 5,8 ---- *************** *** 49,59 **** #X msg 37 38 A B C; #X msg 55 199 list 49 50 51; ! #X connect 1 0 7 0; ! #X connect 2 0 7 0; ! #X connect 7 0 15 0; ! #X connect 7 0 8 0; ! #X connect 8 0 16 0; ! #X connect 9 0 8 0; ! #X connect 13 0 12 0; ! #X connect 17 0 7 0; ! #X connect 18 0 8 0; --- 47,59 ---- #X msg 37 38 A B C; #X msg 55 199 list 49 50 51; ! #X text 54 3 any2string , string2any : ASCII conversions in [pdstring] ! lib; ! #X connect 1 0 5 0; ! #X connect 2 0 5 0; ! #X connect 5 0 13 0; ! #X connect 5 0 6 0; ! #X connect 6 0 14 0; ! #X connect 7 0 6 0; ! #X connect 11 0 10 0; ! #X connect 15 0 5 0; ! #X connect 16 0 6 0;
Index: any2string.c =================================================================== RCS file: /cvsroot/pure-data/externals/moocow/pdstring/src/any2string.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** any2string.c 24 Jul 2007 22:59:32 -0000 1.3 --- any2string.c 26 Jul 2007 12:20:49 -0000 1.4 *************** *** 1,7 **** /* -*- Mode: C -*- */ /*=============================================================================*\ ! * File: any2string.c * Author: Bryan Jurish moocow@ling.uni-potsdam.de ! * Description: convert pd messages to strings * * Copyright (c) 2004 - 2007 Bryan Jurish. --- 1,7 ---- /* -*- Mode: C -*- */ /*=============================================================================*\ ! * File: any2string_dynamic.c * Author: Bryan Jurish moocow@ling.uni-potsdam.de ! * Description: convert pd messages to strings (dynamic allocation) * * Copyright (c) 2004 - 2007 Bryan Jurish. *************** *** 26,32 ****
#include <string.h> - #include <m_pd.h>
/* black magic */ #ifdef NT --- 26,35 ----
#include <string.h> #include <m_pd.h>
+ #ifdef HAVE_CONFIG_H + # include "config.h" + #endif + /* black magic */ #ifdef NT *************** *** 46,50 **** #endif
! #define ANY2STRING_INITIAL_BUFLEN 32
--- 49,53 ---- #endif
! #define ANY2STRING_DEFAULT_BUFLEN 256
*************** *** 59,64 **** --- 62,70 ---- int x_alloc; int x_argc; + t_float x_eos; //-- EOS character to add (<0 for none) + char *x_text; t_atom *x_argv; t_binbuf *x_binbuf; + t_inlet *x_eos_in; t_outlet *x_outlet; } t_any2string; *************** *** 68,71 **** --- 74,78 ---- * Constants *=====================================================================*/ + static char *any2string_banner = "any2string: pdstring version " PACKAGE_VERSION " by Bryan Jurish";
/*===================================================================== *************** *** 79,151 **** { t_atom *a; ! char *text=NULL, *s, *s_max; int len;
! A2SDEBUG(post("-------any2string_anything()---------"));
/*-- set up binbuf --*/ ! A2SDEBUG(post("any2string: binbuf_clear()")); binbuf_clear(x->x_binbuf); ! A2SDEBUG(post("any2string: binbuf_add()")); binbuf_add(x->x_binbuf, argc, argv); ! A2SDEBUG(startpost("any2string: binbuf_print: ")); A2SDEBUG(binbuf_print(x->x_binbuf));
! A2SDEBUG(post("any2string: binbuf_gettext()")); ! binbuf_gettext(x->x_binbuf, &text, &len); ! A2SDEBUG(post("any2string: binbuf_gettext() = "%s" ; len=%d", text, len)); ! /*text[len] = 0;*/ /*-- ? avoid errors: free(): invalid next size(fast): [HEX_ADDRESS] */
! /*-- get string length --*/ ! x->x_argc = len+1; ! if (sel != &s_float && sel != &s_list && sel != &s_) { ! x->x_argc += strlen(sel->s_name); ! if (argc > 0) x->x_argc++; ! } ! A2SDEBUG(post("any2string: argc=%d", x->x_argc));
! /*-- (re-)allocate --*/ if (x->x_alloc < x->x_argc) { ! A2SDEBUG(post("any2string: reallocate(%d->%d)", x->x_alloc, x->x_argc)); ! freebytes(x->x_argv, x->x_alloc * sizeof(t_atom)); ! x->x_argv = (t_atom *)getbytes(x->x_argc * sizeof(t_atom)); x->x_alloc = x->x_argc; }
! /*-- add selector (maybe) --*/ ! a=x->x_argv; ! if (sel != &s_float && sel != &s_list && sel != &s_) { ! A2SDEBUG(post("any2string: for {...} //sel")); ! for (s=sel->s_name; *s; s++, a++) { ! A2SDEBUG(post("any2string: for: SETFLOAT(a,'%c'=%d) //sel", *s, *s)); ! SETFLOAT(a,*s); ! } ! A2SDEBUG(post("any2string: /for {...} //sel")); ! ! if (argc > 0) { ! SETFLOAT(a,' '); ! a++; ! } ! } ! ! /*-- add binbuf text --*/ ! A2SDEBUG(post("any2string: for {...}")); ! s_max = text+len; ! for (s=text; s < s_max; s++, a++) { ! A2SDEBUG(post("any2string: for: //SETFLOAT(a,'%c'=%d)", *s, *s)); SETFLOAT(a,*s); } ! A2SDEBUG(post("any2string: /for {...}")); ! ! /*-- add terminating NUL --*/ ! SETFLOAT(a,0); ! ! A2SDEBUG(post("any2string: freebytes()")); ! freebytes(text, len);
! /* ! A2SDEBUG(post("any2string: binbuf_free()")); ! binbuf_free(x->x_binbuf); ! */
A2SDEBUG(post("any2string: outlet_list(..., %d, ...)", x->x_argc)); --- 86,143 ---- { t_atom *a; ! char *s, *s_max; int len;
! A2SDEBUG(post("-------any2string_anything(%p,...)---------", x));
/*-- set up binbuf --*/ ! A2SDEBUG(post("any2string[%p]: binbuf_clear()", x)); binbuf_clear(x->x_binbuf); ! ! /*-- binbuf_add(): selector --*/ ! if (sel != &s_float && sel != &s_list && sel != &s_) { ! t_atom a; ! A2SDEBUG(post("any2string[%p]: binbuf_add(): selector: '%s'", x, sel->s_name)); ! SETSYMBOL((&a), sel); ! binbuf_add(x->x_binbuf, 1, &a); ! } ! A2SDEBUG(else { post("any2string[%p]: selector: '%s': IGNORED", x, sel->s_name); }); ! ! /*-- binbuf_add(): arg list --*/ ! A2SDEBUG(post("any2string[%p]: binbuf_add(): arg list", x)); binbuf_add(x->x_binbuf, argc, argv); ! A2SDEBUG(post("any2string[%p]: binbuf_print: ", x)); A2SDEBUG(binbuf_print(x->x_binbuf));
! A2SDEBUG(post("any2string[%p]: binbuf_gettext()", x)); ! binbuf_gettext(x->x_binbuf, &(x->x_text), &len); ! A2SDEBUG(post("any2string[%p]: binbuf_gettext() = "%s" ; len=%d", x, x->x_text, len)); ! /*text[len] = 0;*/ /*-- ? avoid errors: "free(): invalid next size(fast): 0x..." */
! /*-- get output atom-list length --*/ ! x->x_argc = len; ! if (x->x_eos >= 0) { x->x_argc++; } ! A2SDEBUG(post("any2string[%p]: argc=%d", x, x->x_argc));
! /*-- (re-)allocate (maybe) --*/ if (x->x_alloc < x->x_argc) { ! A2SDEBUG(post("any2string[%p]: reallocate(%d->%d)", x, x->x_alloc, x->x_argc)); ! freebytes(x->x_argv, x->x_alloc*sizeof(t_atom)); ! x->x_argv = (t_atom*)getbytes(x->x_argc * sizeof(t_atom)); x->x_alloc = x->x_argc; }
! /*-- atom buffer: binbuf text --*/ ! A2SDEBUG(post("any2string[%p]: atom buffer: for {...}", x)); ! a = x->x_argv; ! s_max = x->x_text+len; ! for (s=x->x_text; s < s_max; s++, a++) { ! A2SDEBUG(post("any2string[%p]: atom buffer[%d]: SETFLOAT(a,%d='%c')", x, (a-x->x_argv), *s, *s)); SETFLOAT(a,*s); } ! A2SDEBUG(post("any2string: atom buffer: DONE"));
! /*-- add EOS character (maybe) --*/ ! if (x->x_eos >= 0) { SETFLOAT(a, ((int)x->x_eos)); }
A2SDEBUG(post("any2string: outlet_list(..., %d, ...)", x->x_argc)); *************** *** 157,173 **** * new */ ! static void *any2string_new(void) { t_any2string *x = (t_any2string *)pd_new(any2string_class);
//-- defaults ! x->x_alloc = ANY2STRING_INITIAL_BUFLEN; ! x->x_argc = 0; ! x->x_argv = (t_atom *)getbytes(x->x_alloc * sizeof(t_atom)); x->x_binbuf = binbuf_new();
//-- outlets x->x_outlet = outlet_new(&x->x_obj, &s_list);
return (void *)x; } --- 149,185 ---- * new */ ! static void *any2string_new(t_symbol *sel, int argc, t_atom *argv) { t_any2string *x = (t_any2string *)pd_new(any2string_class);
//-- defaults ! x->x_eos = 0; ! x->x_alloc = ANY2STRING_DEFAULT_BUFLEN; ! ! //-- args: 0: bufsize ! if (argc > 0) { ! int bufsize = atom_getintarg(0, argc, argv); ! if (bufsize > 0) { x->x_alloc = bufsize; } ! } ! //-- args: 1: eos ! if (argc > 1) { ! x->x_eos = atom_getfloatarg(1, argc, argv); ! } ! ! //-- allocate ! x->x_text = (char *)getbytes(x->x_alloc*sizeof(char)); ! x->x_argc = 0; ! x->x_argv = (t_atom *)getbytes(x->x_alloc*sizeof(t_atom)); x->x_binbuf = binbuf_new();
+ //-- inlets + x->x_eos_in = floatinlet_new(&x->x_obj, &x->x_eos); + //-- outlets x->x_outlet = outlet_new(&x->x_obj, &s_list);
+ //-- report + A2SDEBUG(post("any2string_new(): x=%p, alloc=%d, eos=%d, text=%p, argv=%p, binbuf=%p", x, x->x_alloc, x->x_eos, x->x_text, x->x_argv, x->x_binbuf)); + return (void *)x; } *************** *** 178,186 **** static void any2string_free(t_any2string *x) { if (x->x_argv) { ! freebytes(x->x_argv, x->x_alloc * sizeof(t_atom)); x->x_argv = NULL; } binbuf_free(x->x_binbuf); outlet_free(x->x_outlet); return; --- 190,203 ---- static void any2string_free(t_any2string *x) { + if (x->x_text) { + freebytes(x->x_text, x->x_alloc*sizeof(char)); + x->x_text = NULL; + } if (x->x_argv) { ! freebytes(x->x_argv, x->x_alloc*sizeof(t_atom)); x->x_argv = NULL; } binbuf_free(x->x_binbuf); + inlet_free(x->x_eos_in); outlet_free(x->x_outlet); return; *************** *** 188,212 ****
/*-------------------------------------------------------------------- ! * setup */ ! void any2string_setup(void) { //-- class any2string_class = class_new(gensym("any2string"), ! (t_newmethod)any2string_new, ! (t_method)any2string_free, ! sizeof(t_any2string), ! CLASS_DEFAULT, ! 0);
//-- methods ! /*class_addmethod(any2string_class, (t_method)any2string_symbol, &s_symbol, ! A_DEFSYMBOL, 0); ! */ ! class_addanything(any2string_class, ! (t_method)any2string_anything);
//-- help symbol ! class_sethelpsymbol(any2string_class, gensym("pdstring-help.pd")); } --- 205,235 ----
/*-------------------------------------------------------------------- ! * setup (guts) */ ! void any2string_setup_guts(void) { //-- class any2string_class = class_new(gensym("any2string"), ! (t_newmethod)any2string_new, ! (t_method)any2string_free, ! sizeof(t_any2string), ! CLASS_DEFAULT, ! A_GIMME, //-- initial_bufsize, eos_char ! 0);
//-- methods ! class_addanything(any2string_class, (t_method)any2string_anything);
//-- help symbol ! class_sethelpsymbol(any2string_class, gensym("any2string-help.pd")); ! } ! ! /*-------------------------------------------------------------------- ! * setup ! */ ! void any2string_setup(void) ! { ! post(any2string_banner); ! any2string_setup_guts(); }
--- NEW FILE: any2string-help.pd --- #N canvas 90 20 636 478 10; #X obj 25 400 print any2string-help; #X obj 25 314 any2string 128 -1; #X msg 109 197 0; #X msg 77 197 -1; #X text 19 47 INLETS:; #X text 31 61 1 - pd messages; #X text 247 49 OUTLETS:; #X text 263 63 1 - lists of ASCII-valued floats; #X floatatom 44 147 8 0 0 0 - - -; #X symbolatom 34 125 10 0 0 0 - - -; #X text 189 125 ... no special handling for symbols; #X text 188 103 anything can be converted to a list...; #X text 190 147 ... but "float" selector is silently dropped; #X msg 25 104 A B C; #X text 193 312 First argument: initial buffer size (length of object-local text buffer). This should get re-allocated when necessary. Specify 0 (zero) to use the default value.; #X text 195 367 Second argument: initial EOS character. See above. ; #X text 320 458 Bryan Jurish moocow@ling.uni-potsdam.de; #X text 19 439 SEE ALSO:; #X msg 139 197 42; #X text 21 29 SYNTAX: any2string [INITIAL_BUFSIZE [EOS_CHAR]]; #X text 184 194 The second inlet sets the terminating EOS ("end-of-string") character. This value gets implicitly appended to all output lists. Specify a negative value here to avoid implicit EOS characters entirely. For backwards compatibility , the default EOS character is 0 (zero). ; #X text 51 5 any2string : convert pd messages to a list of floats; #X text 31 75 2 - EOS character (float); #X obj 100 438 pdstring-help; #X connect 1 0 0 0; #X connect 2 0 1 1; #X connect 3 0 1 1; #X connect 8 0 1 0; #X connect 9 0 1 0; #X connect 13 0 1 0; #X connect 18 0 1 1;
Index: pdstring.c =================================================================== RCS file: /cvsroot/pure-data/externals/moocow/pdstring/src/pdstring.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** pdstring.c 2 Feb 2006 12:46:01 -0000 1.1 --- pdstring.c 26 Jul 2007 12:20:50 -0000 1.2 *************** *** 55,60 **** * External declarations *=====================================================================*/ ! extern void any2string_setup(void); ! extern void string2any_setup(void);
/*-------------------------------------------------------------------- --- 55,67 ---- * External declarations *=====================================================================*/ ! #ifndef PDSTRING_OBJECT_EXTERNALS ! /* ! extern void any2string_setup_guts(void); ! extern void string2any_setup_guts(void); ! */ ! #include "any2string.c" ! #include "string2any.c" ! ! #endif
/*-------------------------------------------------------------------- *************** *** 82,87 **** post(pdstring_version);
! any2string_setup(); ! string2any_setup();
pdstring_class = class_new(gensym("pdstring"), --- 89,96 ---- post(pdstring_version);
! #ifndef PDSTRING_OBJECT_EXTERNALS ! any2string_setup_guts(); ! string2any_setup_guts(); ! #endif
pdstring_class = class_new(gensym("pdstring"),
--- NEW FILE: any2string_static.c --- /* -*- Mode: C -*- */ /*=============================================================================*\ * File: any2string_static.c * Author: Bryan Jurish moocow@ling.uni-potsdam.de * Description: convert pd messages to strings (static buffer allocation) * * Copyright (c) 2004 - 2007 Bryan Jurish. * * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file "COPYING", in this distribution. * * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *=============================================================================*/
#include <string.h> #include <stdio.h>
#include <m_pd.h>
#ifdef HAVE_CONFIG_H # include "config.h" #endif
/* black magic */ #ifdef NT #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif
/*-------------------------------------------------------------------- * DEBUG *--------------------------------------------------------------------*/ /*#define ANY2STRING_DEBUG 1*/ /*#undef ANY2STRING_DEBUG*/
#ifdef ANY2STRING_DEBUG # define A2SDEBUG(x) x #else # define A2SDEBUG(x) #endif
#define ANY2STRING_DEFAULT_BUFLEN 512
/*===================================================================== * Structures and Types: any2string *=====================================================================*/ static t_class *any2string_class;
typedef struct _any2string { t_object x_obj; int x_alloc; //-- buffer size (text, x_argv) int x_argc; //-- current number of atoms to outlet t_atom *x_argv; //-- float-list to outlet t_outlet *x_outlet; //-- outlet } t_any2string;
/*===================================================================== * Utilities *=====================================================================*/
/*-------------------------------------------------------------------- * append_string */ static void any2string_append_string(t_any2string *x, char *s, unsigned int maxlen, int doescape) { char *sp; char *ep = s+maxlen;
for (sp=s; *sp && sp<ep && *sp && x->x_argc<x->x_alloc; sp++, x->x_argc++) { if (doescape && (*sp==';' || *sp==',' || *sp=='\' || (*sp == '$' && sp<(ep-1) && sp[1] >= '0' && sp[1] <= '9'))) { A2SDEBUG(post("any2string_append_string: ESCAPE: x_argv[%d] = '%c' = %d", x->x_argc, '\', '\')); x->x_argv[x->x_argc++].a_w.w_float = '\'; if (x->x_argc >= x->x_alloc) break; } A2SDEBUG(post("any2string_append_string: x_argv[%d] = '%c' = %d", x->x_argc, *sp, *sp)); x->x_argv[x->x_argc].a_w.w_float = *sp; } }
/*-------------------------------------------------------------------- * append_atom */ #define ANY2STRING_APPEND_BUFSIZE 30 static void any2string_append_atom(t_any2string *x, t_atom *a) { char buf[ANY2STRING_APPEND_BUFSIZE]; A2SDEBUG(post("~~ any2string_append_atom(%p,...) ~~", x));
if (x->x_argc >= x->x_alloc) { return; }
/*-- stringify a single atom (inspired by atom_string() from m_atom.c) --*/ switch (a->a_type) { case A_SEMI: any2string_append_string(x, ";", 1, 0); break; case A_COMMA: any2string_append_string(x, ",", 1, 0); break; case A_POINTER: any2string_append_string(x, "(pointer)", 9, 0); break; case A_FLOAT: snprintf(buf, ANY2STRING_APPEND_BUFSIZE, "%g", a->a_w.w_float); any2string_append_string(x, buf, ANY2STRING_APPEND_BUFSIZE, 0); break; case A_SYMBOL: any2string_append_string(x, a->a_w.w_symbol->s_name, strlen(a->a_w.w_symbol->s_name), 1); break; case A_DOLLAR: snprintf(buf, ANY2STRING_APPEND_BUFSIZE, "$%d", a->a_w.w_index); any2string_append_string(x, buf, ANY2STRING_APPEND_BUFSIZE, 0); break; case A_DOLLSYM: any2string_append_string(x, a->a_w.w_symbol->s_name, strlen(a->a_w.w_symbol->s_name), 0); break; default: pd_error(x,"any2string_append_atom: unknown atom type '%d'", a->a_type); break; }
if (x->x_argc < x->x_alloc) { A2SDEBUG(post("any2string_append_atom[%p]: x_argv[%d] = '%c' = %d", x, x->x_argc, ' ', ' ')); x->x_argv[x->x_argc++].a_w.w_float = ' '; } }
/*===================================================================== * Methods *=====================================================================*/
/*-------------------------------------------------------------------- * anything */ static void any2string_anything(t_any2string *x, t_symbol *sel, int argc, t_atom *argv) { t_atom *argv_end = argv+argc; x->x_argc=0;
A2SDEBUG(post("-------any2string_anything(%p,...) ---------", x));
/*-- stringify selector (maybe) --*/ if (sel != &s_float && sel != &s_list && sel != &s_) { t_atom a; SETSYMBOL(&a,sel); any2string_append_atom(x, &a); }
/*-- stringify arg list --*/ for ( ; argv<argv_end && x->x_argc<x->x_alloc; argv++) { any2string_append_atom(x, argv); }
/*-- add terminating NUL (if we can) --*/ A2SDEBUG(post("any2string[%p]: terminating NUL: x_argv[%d]=0", x, x->x_argc-1)); if (x->x_argc >= x->x_alloc) { pd_error(x, "any2string: input length exceeds buffer size!"); x->x_argc = x->x_alloc; x->x_argv[x->x_argc-1].a_w.w_float = '*'; //-- simulate atom_string() behavior } else if (x->x_argc > 0) { x->x_argv[x->x_argc-1].a_w.w_float = 0; }
A2SDEBUG(post("any2string[%p]: outlet_list(..., %d, ...)", x, x->x_argc)); outlet_list(x->x_outlet, &s_list, x->x_argc, x->x_argv); }
/*-------------------------------------------------------------------- * new */ static void *any2string_new(t_floatarg bufsize) { t_any2string *x = (t_any2string *)pd_new(any2string_class); int i;
//-- bufsize if (bufsize <= 0) { x->x_alloc = ANY2STRING_DEFAULT_BUFLEN; } else { x->x_alloc = bufsize; } A2SDEBUG(post("any2string_new: buf_req=%g, alloc=%d", bufsize, x->x_alloc));
//-- defaults x->x_argc = 0; x->x_argv = (t_atom*)getbytes(x->x_alloc*sizeof(t_atom));
//-- initialize (set a_type) for (i=0; i < x->x_alloc; i++) { SETFLOAT((x->x_argv+i),0); }
//-- outlets x->x_outlet = outlet_new(&x->x_obj, &s_list); A2SDEBUG(post("any2string_new: x=%p, alloc=%d, argv=%p, nbytes=%d", x, x->x_alloc,x->x_argv,x->x_alloc*sizeof(t_atom))); return (void *)x; }
/*-------------------------------------------------------------------- * free */ static void any2string_free(t_any2string *x) { A2SDEBUG(post("any2string_free(x=%p)", x)); if (x->x_argv) { A2SDEBUG(post("any2string_free(x=%p): x_argv=%p (size=%d)", x, x->x_argv, x->x_alloc*sizeof(t_atom))); freebytes(x->x_argv, x->x_alloc*sizeof(t_atom)); } A2SDEBUG(post("any2string_free(x=%p): x_outlet=%p", x, x->x_outlet)); outlet_free(x->x_outlet); return; }
/*-------------------------------------------------------------------- * setup */ void any2string_setup(void) { //-- class any2string_class = class_new(gensym("any2string"), (t_newmethod)any2string_new, (t_method)any2string_free, sizeof(t_any2string), CLASS_DEFAULT, A_DEFFLOAT, 0);
//-- methods class_addanything(any2string_class, (t_method)any2string_anything);
//-- help symbol class_sethelpsymbol(any2string_class, gensym("pdstring-help.pd")); }
Index: Makefile.am =================================================================== RCS file: /cvsroot/pure-data/externals/moocow/pdstring/src/Makefile.am,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Makefile.am 2 Feb 2006 12:46:01 -0000 1.1 --- Makefile.am 26 Jul 2007 12:20:49 -0000 1.2 *************** *** 40,44 ****
## --- documentation ! pddoc_DATA = pdstring-help.pd
--- 40,47 ----
## --- documentation ! pddoc_DATA = \ ! pdstring-help.pd \ ! any2string-help.pd \ ! string2any-help.pd
*************** *** 47,54 **** #-----------------------------------------------------------------------
! pdstring_SOURCES = \ ! any2string.c \ ! string2any.c \ ! pdstring.c
any2string_SOURCES = any2string.c --- 50,54 ---- #-----------------------------------------------------------------------
! pdstring_SOURCES = pdstring.c
any2string_SOURCES = any2string.c
Index: string2any.c =================================================================== RCS file: /cvsroot/pure-data/externals/moocow/pdstring/src/string2any.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** string2any.c 2 Feb 2006 12:46:01 -0000 1.1 --- string2any.c 26 Jul 2007 12:20:50 -0000 1.2 *************** *** 29,32 **** --- 29,36 ---- #include <m_pd.h>
+ #ifdef HAVE_CONFIG_H + # include "config.h" + #endif + /* black magic */ #ifdef NT *************** *** 38,42 **** * DEBUG *--------------------------------------------------------------------*/ ! //#define STRING2ANY_DEBUG 1
#ifdef STRING2ANY_DEBUG --- 42,47 ---- * DEBUG *--------------------------------------------------------------------*/ ! /*#define STRING2ANY_DEBUG 1*/ ! /*#undef STRING2ANY_DEBUG*/
#ifdef STRING2ANY_DEBUG *************** *** 46,50 **** #endif
! #define STRING2ANY_INITIAL_BUFLEN 32
--- 51,55 ---- #endif
! #define STRING2ANY_DEFAULT_BUFLEN 256
*************** *** 52,55 **** --- 57,61 ---- * Constants *=====================================================================*/ + static char *string2any_banner = "string2any: pdstring version " PACKAGE_VERSION " by Bryan Jurish";
/*===================================================================== *************** *** 63,94 **** t_object x_obj; size_t x_size; char *x_text; t_binbuf *x_binbuf; t_outlet *x_outlet; } t_string2any;
/*===================================================================== ! * Constants ! *=====================================================================*/ ! ! /*===================================================================== ! * Methods *=====================================================================*/
/*-------------------------------------------------------------------- ! * anything */ ! static void string2any_anything(t_string2any *x, t_symbol *sel, int argc, t_atom *argv) { char *s; ! int x_argc; t_atom *x_argv;
/*-- allocate --*/ ! if (x->x_size <= argc) { freebytes(x->x_text, x->x_size*sizeof(char)); x->x_size = argc+1; ! x->x_text = (char *)getbytes(x->x_size * sizeof(char)); }
--- 69,99 ---- t_object x_obj; size_t x_size; + t_float x_eos; //-- eos character char *x_text; t_binbuf *x_binbuf; + t_inlet *x_eos_in; t_outlet *x_outlet; + t_outlet *x_outlet_done; } t_string2any;
/*===================================================================== ! * Utilities *=====================================================================*/
/*-------------------------------------------------------------------- ! * string2any_atoms() */ ! static void string2any_atoms(t_string2any *x, int argc, t_atom *argv) { char *s; ! int x_argc, a_argc=argc; t_atom *x_argv;
/*-- allocate --*/ ! if (x->x_size <= (argc+1)) { freebytes(x->x_text, x->x_size*sizeof(char)); x->x_size = argc+1; ! x->x_text = (char *)getbytes(x->x_size*sizeof(char)); }
*************** *** 98,107 **** } *s = 0; ! S2ADEBUG(post("string2any: text: "%s"", x->x_text));
/*-- clear and fill binbuf --*/ binbuf_clear(x->x_binbuf); ! binbuf_text(x->x_binbuf, x->x_text, strlen(x->x_text)); ! S2ADEBUG(startpost("string2any: buf: ")); S2ADEBUG(binbuf_print(x->x_binbuf));
--- 103,112 ---- } *s = 0; ! S2ADEBUG(post("string2any[%p]: text: "%s", strlen=%d, argc=%d", x, x->x_text, strlen(x->x_text), a_argc));
/*-- clear and fill binbuf --*/ binbuf_clear(x->x_binbuf); ! binbuf_text(x->x_binbuf, x->x_text, a_argc); //-- handle NULs if binbuf will (but it won't) ? ! S2ADEBUG(post("string2any[%p]: binbuf_print: ", x)); S2ADEBUG(binbuf_print(x->x_binbuf));
*************** *** 124,131 ****
/*-------------------------------------------------------------------- * new */ ! static void *string2any_new(void) { t_string2any *x = (t_string2any *)pd_new(string2any_class); --- 129,165 ----
+ /*===================================================================== + * Methods + *=====================================================================*/ + + /*-------------------------------------------------------------------- + * anything + */ + static void string2any_anything(t_string2any *x, t_symbol *sel, int argc, t_atom *argv) + { + int i0=0, i; + + /*-- scan & output --*/ + if (x->x_eos >= 0) { + for (i=i0; i < argc; i++) { + if (((int)atom_getfloatarg(i,argc,argv))==((int)x->x_eos)) { + string2any_atoms(x, i-i0, argv+i0); + i0=i+1; + } + } + } + + if (i0 < argc) { + string2any_atoms(x, argc-i0, argv+i0); + } + + outlet_bang(x->x_outlet_done); + } + + /*-------------------------------------------------------------------- * new */ ! static void *string2any_new(t_symbol *sel, int argc, t_atom *argv) { t_string2any *x = (t_string2any *)pd_new(string2any_class); *************** *** 133,141 **** //-- defaults x->x_binbuf = binbuf_new(); ! x->x_size = STRING2ANY_INITIAL_BUFLEN; ! x->x_text = (char *)getbytes(x->x_size * sizeof(char));
//-- outlets ! x->x_outlet = outlet_new(&x->x_obj, &s_list);
return (void *)x; --- 167,196 ---- //-- defaults x->x_binbuf = binbuf_new(); ! x->x_size = STRING2ANY_DEFAULT_BUFLEN; ! x->x_eos = -1; ! ! //-- args: 0: bufsize ! if (argc > 0) { ! int initial_bufsize = atom_getintarg(0,argc,argv); ! if (initial_bufsize > 0) x->x_size = initial_bufsize; ! x->x_eos = -1; //-- backwards-compatibility hack: no default eos character if only bufsize is specified ! } ! //-- args: 1: separator ! if (argc > 1) { ! x->x_eos = atom_getfloatarg(1,argc,argv); ! } ! ! //-- allocate ! x->x_text = (char *)getbytes(x->x_size*sizeof(char)); ! ! //-- inlets ! x->x_eos_in = floatinlet_new(&x->x_obj, &x->x_eos);
//-- outlets ! x->x_outlet = outlet_new(&x->x_obj, &s_list); ! x->x_outlet_done = outlet_new(&x->x_obj, &s_bang); ! ! //-- debug ! S2ADEBUG(post("string2any_new: x=%p, size=%d, eos=%d, binbuf=%p, text=%p", x, x->x_size, x->x_eos, x->x_binbuf, x->x_text));
return (void *)x; *************** *** 148,155 **** { if (x->x_text) { ! freebytes(x->x_text, x->x_size * sizeof(char)); x->x_text = NULL; } binbuf_free(x->x_binbuf); outlet_free(x->x_outlet); return; --- 203,212 ---- { if (x->x_text) { ! freebytes(x->x_text, x->x_size*sizeof(char)); x->x_text = NULL; } binbuf_free(x->x_binbuf); + inlet_free(x->x_eos_in); + outlet_free(x->x_outlet_done); outlet_free(x->x_outlet); return; *************** *** 157,181 ****
/*-------------------------------------------------------------------- ! * setup */ ! void string2any_setup(void) { //-- class string2any_class = class_new(gensym("string2any"), ! (t_newmethod)string2any_new, ! (t_method)string2any_free, ! sizeof(t_string2any), ! CLASS_DEFAULT, ! 0);
//-- methods ! /*class_addmethod(string2any_class, (t_method)string2any_symbol, &s_symbol, ! A_DEFSYMBOL, 0); ! */ ! class_addanything(string2any_class, ! (t_method)string2any_anything);
//-- help symbol ! class_sethelpsymbol(string2any_class, gensym("pdstring-help.pd")); } --- 214,244 ----
/*-------------------------------------------------------------------- ! * setup: guts */ ! void string2any_setup_guts(void) { //-- class string2any_class = class_new(gensym("string2any"), ! (t_newmethod)string2any_new, ! (t_method)string2any_free, ! sizeof(t_string2any), ! CLASS_DEFAULT, ! A_GIMME, //-- initial_bufsize, eos_char ! 0);
//-- methods ! class_addanything(string2any_class, (t_method)string2any_anything);
//-- help symbol ! class_sethelpsymbol(string2any_class, gensym("string2any-help.pd")); ! } ! ! /*-------------------------------------------------------------------- ! * setup ! */ ! void string2any_setup(void) ! { ! post(string2any_banner); ! string2any_setup_guts(); }
--- NEW FILE: string2any-help.pd --- #N canvas 121 48 612 604 10; #X text 59 7 string2any : convert lists of floats to pd messages; #X text 13 30 SYNTAX: string2any [INITIAL_BUFSIZE [EOS_CHAR]]; #X text 13 52 INLETS:; #X text 27 68 1 - ASCII-valued float lists; #X text 309 54 OUTLETS:; #X text 325 68 1 - pd messages; #X text 325 82 2 - bang on done; #X obj 24 350 string2any 128 0; #X obj 24 529 print string2any-help; #X obj 131 454 print string2any-help-done; #X msg 24 113 97 32 98 32 99; #X msg 39 135 97 0 98 0 99; #X msg 99 206 0; #X msg 67 206 -1; #X msg 131 206 32; #X text 166 202 The second inlet sets the message-separating EOS ("end-of-string") character. If this character is encountered in an input list , the list is "split" at that point , and two separate messages are output at the leftmost outlet. You can specify a negative value here to avoid implicit input splitting entirely. For backwards compatibility , the default EOS character is -1 , which results in truncation of input messages whenever a 0 (zero) is encountered.; #X text 163 350 First argument: initial buffer size (length of object-local text buffer). This should get re-allocated when necessary. Specify 0 (zero) to use the default value.; #X text 165 405 Second argument: initial EOS character. See above. ; #X text 159 477 Right outlet gives a bang after the entire input list has been processed.; #X text 189 531 Parsed pd messages are sent to the left outlet.; #X text 306 580 Bryan Jurish moocow@ling.uni-potsdam.de; #X text 27 83 2 - EOS character (float); #X text 161 121 lists of floats are converted to pd messages.; #X msg 54 161 StringThing 97; #X text 168 161 ... selector is ignored ...; #X text 21 571 SEE ALSO:; #X obj 102 570 pdstring-help; #X connect 7 0 8 0; #X connect 10 0 7 0; #X connect 11 0 7 0; #X connect 23 0 7 0;