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(a)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(a)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(a)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(a)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(a)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(a)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(a)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;