[PD-cvs] externals/moocow/pdstring/src any2string-help.pd, NONE, 1.1 any2string_static.c, NONE, 1.1 string2any-help.pd, NONE, 1.1 Makefile.am, 1.1, 1.2 any2string.c, 1.3, 1.4 pdstring-help.pd, 1.1, 1.2 pdstring.c, 1.1, 1.2 string2any.c, 1.1, 1.2

Bryan Jurish mukau at users.sourceforge.net
Thu Jul 26 14:20:52 CEST 2007


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 at 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 at 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 at 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 at 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 at 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 at 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 at 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;





More information about the Pd-cvs mailing list