From d126e78f7728e131b0617a0318fcf6a45ad40844 Mon Sep 17 00:00:00 2001 From: Bryan Jurish Date: Fri, 23 Jan 2009 22:24:42 +0000 Subject: + did basic renaming 'string' -> 'bytes' svn path=/trunk/externals/moocow/; revision=10607 --- pdstring+wchar/configure | 26 ++-- pdstring+wchar/configure.ac | 12 +- pdstring+wchar/src/Makefile.am | 16 +-- pdstring+wchar/src/Makefile.in | 52 +++---- pdstring+wchar/src/any2bytes-help.pd | 40 ++++++ pdstring+wchar/src/any2bytes.c | 239 +++++++++++++++++++++++++++++++ pdstring+wchar/src/any2string-help.pd | 39 ------ pdstring+wchar/src/any2string.c | 239 ------------------------------- pdstring+wchar/src/any2string_static.c | 246 -------------------------------- pdstring+wchar/src/bytes2any-help.pd | 47 +++++++ pdstring+wchar/src/bytes2any.c | 249 +++++++++++++++++++++++++++++++++ pdstring+wchar/src/config.h.in | 10 +- pdstring+wchar/src/pdstring-help.pd | 52 +++---- pdstring+wchar/src/pdstring.c | 13 +- pdstring+wchar/src/string2any-help.pd | 46 ------ pdstring+wchar/src/string2any.c | 249 --------------------------------- pdstring+wchar/src/unsigned.pd | 52 +++---- 17 files changed, 689 insertions(+), 938 deletions(-) create mode 100644 pdstring+wchar/src/any2bytes-help.pd create mode 100644 pdstring+wchar/src/any2bytes.c delete mode 100644 pdstring+wchar/src/any2string-help.pd delete mode 100644 pdstring+wchar/src/any2string.c delete mode 100644 pdstring+wchar/src/any2string_static.c create mode 100644 pdstring+wchar/src/bytes2any-help.pd create mode 100644 pdstring+wchar/src/bytes2any.c delete mode 100644 pdstring+wchar/src/string2any-help.pd delete mode 100644 pdstring+wchar/src/string2any.c diff --git a/pdstring+wchar/configure b/pdstring+wchar/configure index d9a907c..3a822ed 100755 --- a/pdstring+wchar/configure +++ b/pdstring+wchar/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61 for pdstring 0.07. +# Generated by GNU Autoconf 2.61 for pdstring 0.08. # # Report bugs to . # @@ -574,8 +574,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='pdstring' PACKAGE_TARNAME='pdstring' -PACKAGE_VERSION='0.07' -PACKAGE_STRING='pdstring 0.07' +PACKAGE_VERSION='0.08' +PACKAGE_STRING='pdstring 0.08' PACKAGE_BUGREPORT='moocow@ling.uni-potsdam.de' ac_default_prefix=/usr/local @@ -1181,7 +1181,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures pdstring 0.07 to adapt to many kinds of systems. +\`configure' configures pdstring 0.08 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1247,7 +1247,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of pdstring 0.07:";; + short | recursive ) echo "Configuration of pdstring 0.08:";; esac cat <<\_ACEOF @@ -1341,7 +1341,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -pdstring configure 0.07 +pdstring configure 0.08 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1355,7 +1355,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by pdstring $as_me 0.07, which was +It was created by pdstring $as_me 0.08, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ @@ -2030,7 +2030,7 @@ fi # Define the identity of the package. PACKAGE=pdstring - VERSION=0.07 + VERSION=0.08 cat >>confdefs.h <<_ACEOF @@ -3543,7 +3543,7 @@ esac ##------- PD externals: hack EXEEXT? PD_LIB_EXTERNALS="pdstring" -PD_OBJ_EXTERNALS="any2string string2any" +PD_OBJ_EXTERNALS="any2bytes bytes2any" # Check whether --enable-object-externals was given. if test "${enable_object_externals+set}" = set; then @@ -3687,12 +3687,12 @@ echo "${ECHO_T}yes" >&6; } DEBUG="yes" cat >>confdefs.h <<\_ACEOF -#define ANY2STRING_DEBUG 1 +#define ANY2BYTES_DEBUG 1 _ACEOF cat >>confdefs.h <<\_ACEOF -#define STRING2ANY_DEBUG 1 +#define BYTES2ANY_DEBUG 1 _ACEOF else @@ -4198,7 +4198,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by pdstring $as_me 0.07, which was +This file was extended by pdstring $as_me 0.08, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -4251,7 +4251,7 @@ Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -pdstring config.status 0.07 +pdstring config.status 0.08 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/pdstring+wchar/configure.ac b/pdstring+wchar/configure.ac index dcd55c0..30ca59b 100644 --- a/pdstring+wchar/configure.ac +++ b/pdstring+wchar/configure.ac @@ -4,7 +4,7 @@ AC_PREREQ(2.5) dnl Some handy macros define([THE_PACKAGE_NAME], [pdstring]) -define([THE_PACKAGE_VERSION], [0.07]) +define([THE_PACKAGE_VERSION], [0.08]) define([THE_PACKAGE_AUTHOR], [moocow@ling.uni-potsdam.de]) AC_INIT(THE_PACKAGE_NAME, THE_PACKAGE_VERSION, THE_PACKAGE_AUTHOR) @@ -88,7 +88,7 @@ esac ##------- PD externals: hack EXEEXT? PD_LIB_EXTERNALS="pdstring" -PD_OBJ_EXTERNALS="any2string string2any" +PD_OBJ_EXTERNALS="any2bytes bytes2any" AC_ARG_ENABLE(object-externals, AC_HELP_STRING([--enable-object-externals], [Whether to build single-object externals (default=no)]), @@ -162,10 +162,10 @@ AC_ARG_ENABLE([debug], if test "$enable_debug" = "yes" ; then AC_MSG_RESULT(yes) DEBUG="yes" - AC_DEFINE(ANY2STRING_DEBUG,1, - [Define this to include debugging code for the 'string2any' external.]) - AC_DEFINE(STRING2ANY_DEBUG,1, - [Define this to include debugging code for the 'any2string' external.]) + AC_DEFINE(ANY2BYTES_DEBUG,1, + [Define this to include debugging code for the 'bytes2any' external.]) + AC_DEFINE(BYTES2ANY_DEBUG,1, + [Define this to include debugging code for the 'any2bytes' external.]) else AC_MSG_RESULT(no) DEBUG="no" diff --git a/pdstring+wchar/src/Makefile.am b/pdstring+wchar/src/Makefile.am index 73d1366..69e2efb 100644 --- a/pdstring+wchar/src/Makefile.am +++ b/pdstring+wchar/src/Makefile.am @@ -32,8 +32,8 @@ pdexterns_PROGRAMS = @PD_OBJECT_EXTERNALS@ ## --- possible externals EXTRA_PROGRAMS = \ pdstring \ - any2string \ - string2any + any2bytes \ + bytes2any ## --- patches pdexterns_DATA = @@ -41,8 +41,8 @@ pdexterns_DATA = ## --- documentation pddoc_DATA = \ pdstring-help.pd \ - any2string-help.pd \ - string2any-help.pd + any2bytes-help.pd \ + bytes2any-help.pd #----------------------------------------------------------------------- @@ -51,9 +51,9 @@ pddoc_DATA = \ pdstring_SOURCES = pdstring.c mooPdUtils.h -any2string_SOURCES = any2string.c mooPdUtils.h +any2bytes_SOURCES = any2bytes.c mooPdUtils.h -string2any_SOURCES = string2any.c mooPdUtils.h +bytes2any_SOURCES = bytes2any.c mooPdUtils.h #----------------------------------------------------------------------- # external compilation : flags @@ -74,9 +74,9 @@ AM_CFLAGS = $(OFLAGS) $(WFLAGS) $(AFLAGS) pdstring_LDFLAGS = $(LFLAGS) -string2any_LDFLAGS = $(LFLAGS) +bytes2any_LDFLAGS = $(LFLAGS) -any2string_LDFLAGS = $(LFLAGS) +any2bytes_LDFLAGS = $(LFLAGS) #----------------------------------------------------------------------- # Variables: cleanup diff --git a/pdstring+wchar/src/Makefile.in b/pdstring+wchar/src/Makefile.in index f454607..5f5b1ae 100644 --- a/pdstring+wchar/src/Makefile.in +++ b/pdstring+wchar/src/Makefile.in @@ -50,8 +50,8 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : pdexterns_PROGRAMS = @PD_OBJECT_EXTERNALS@ -EXTRA_PROGRAMS = pdstring$(EXEEXT) any2string$(EXEEXT) \ - string2any$(EXEEXT) +EXTRA_PROGRAMS = pdstring$(EXEEXT) any2bytes$(EXEEXT) \ + bytes2any$(EXEEXT) subdir = src SUBDIRS = DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ @@ -67,15 +67,15 @@ am__installdirs = "$(DESTDIR)$(pdexternsdir)" "$(DESTDIR)$(pddocdir)" \ "$(DESTDIR)$(pdexternsdir)" pdexternsPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(pdexterns_PROGRAMS) -am_any2string_OBJECTS = any2string.$(OBJEXT) -any2string_OBJECTS = $(am_any2string_OBJECTS) -any2string_LDADD = $(LDADD) +am_any2bytes_OBJECTS = any2bytes.$(OBJEXT) +any2bytes_OBJECTS = $(am_any2bytes_OBJECTS) +any2bytes_LDADD = $(LDADD) +am_bytes2any_OBJECTS = bytes2any.$(OBJEXT) +bytes2any_OBJECTS = $(am_bytes2any_OBJECTS) +bytes2any_LDADD = $(LDADD) am_pdstring_OBJECTS = pdstring.$(OBJEXT) pdstring_OBJECTS = $(am_pdstring_OBJECTS) pdstring_LDADD = $(LDADD) -am_string2any_OBJECTS = string2any.$(OBJEXT) -string2any_OBJECTS = $(am_string2any_OBJECTS) -string2any_LDADD = $(LDADD) DEFAULT_INCLUDES = -I. -I$(srcdir) -I. depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles @@ -83,10 +83,10 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(any2string_SOURCES) $(pdstring_SOURCES) \ - $(string2any_SOURCES) -DIST_SOURCES = $(any2string_SOURCES) $(pdstring_SOURCES) \ - $(string2any_SOURCES) +SOURCES = $(any2bytes_SOURCES) $(bytes2any_SOURCES) \ + $(pdstring_SOURCES) +DIST_SOURCES = $(any2bytes_SOURCES) $(bytes2any_SOURCES) \ + $(pdstring_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ @@ -207,24 +207,24 @@ SUFFIXES = .@PDEXT@ pdexterns_DATA = pddoc_DATA = \ pdstring-help.pd \ - any2string-help.pd \ - string2any-help.pd + any2bytes-help.pd \ + bytes2any-help.pd #----------------------------------------------------------------------- # sources #----------------------------------------------------------------------- pdstring_SOURCES = pdstring.c mooPdUtils.h -any2string_SOURCES = any2string.c mooPdUtils.h -string2any_SOURCES = string2any.c mooPdUtils.h +any2bytes_SOURCES = any2bytes.c mooPdUtils.h +bytes2any_SOURCES = bytes2any.c mooPdUtils.h #GLIB_IFLAGS = @GLIB_IFLAGS@ #GLIB_LFLAGS = @GLIB_LFLAGS@ AM_CPPFLAGS = $(IFLAGS) $(GLIB_IFLAGS) $(DFLAGS) AM_CFLAGS = $(OFLAGS) $(WFLAGS) $(AFLAGS) pdstring_LDFLAGS = $(LFLAGS) -string2any_LDFLAGS = $(LFLAGS) -any2string_LDFLAGS = $(LFLAGS) +bytes2any_LDFLAGS = $(LFLAGS) +any2bytes_LDFLAGS = $(LFLAGS) #----------------------------------------------------------------------- # Variables: cleanup @@ -332,15 +332,15 @@ uninstall-pdexternsPROGRAMS: clean-pdexternsPROGRAMS: -test -z "$(pdexterns_PROGRAMS)" || rm -f $(pdexterns_PROGRAMS) -any2string$(EXEEXT): $(any2string_OBJECTS) $(any2string_DEPENDENCIES) - @rm -f any2string$(EXEEXT) - $(LINK) $(any2string_LDFLAGS) $(any2string_OBJECTS) $(any2string_LDADD) $(LIBS) +any2bytes$(EXEEXT): $(any2bytes_OBJECTS) $(any2bytes_DEPENDENCIES) + @rm -f any2bytes$(EXEEXT) + $(LINK) $(any2bytes_LDFLAGS) $(any2bytes_OBJECTS) $(any2bytes_LDADD) $(LIBS) +bytes2any$(EXEEXT): $(bytes2any_OBJECTS) $(bytes2any_DEPENDENCIES) + @rm -f bytes2any$(EXEEXT) + $(LINK) $(bytes2any_LDFLAGS) $(bytes2any_OBJECTS) $(bytes2any_LDADD) $(LIBS) pdstring$(EXEEXT): $(pdstring_OBJECTS) $(pdstring_DEPENDENCIES) @rm -f pdstring$(EXEEXT) $(LINK) $(pdstring_LDFLAGS) $(pdstring_OBJECTS) $(pdstring_LDADD) $(LIBS) -string2any$(EXEEXT): $(string2any_OBJECTS) $(string2any_DEPENDENCIES) - @rm -f string2any$(EXEEXT) - $(LINK) $(string2any_LDFLAGS) $(string2any_OBJECTS) $(string2any_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -348,9 +348,9 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/any2string.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/any2bytes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bytes2any.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdstring.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string2any.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ diff --git a/pdstring+wchar/src/any2bytes-help.pd b/pdstring+wchar/src/any2bytes-help.pd new file mode 100644 index 0000000..215a27f --- /dev/null +++ b/pdstring+wchar/src/any2bytes-help.pd @@ -0,0 +1,40 @@ +#N canvas 90 20 636 478 10; +#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 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 ; +#X text 19 439 SEE ALSO:; +#X msg 139 197 42; +#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 31 75 2 - EOS character (float); +#X obj 100 438 pdstring; +#X obj 25 314 any2bytes 128 -1; +#X obj 25 400 print any2bytes-help; +#X text 21 29 SYNTAX: any2bytes [INITIAL_BUFSIZE [EOS_CHAR]]; +#X text 263 63 1 - lists of byte-valued floats; +#X text 49 5 any2bytes : convert pd messages to a list of byte values +; +#X connect 0 0 19 1; +#X connect 1 0 19 1; +#X connect 5 0 19 0; +#X connect 6 0 19 0; +#X connect 10 0 19 0; +#X connect 15 0 19 1; +#X connect 19 0 20 0; diff --git a/pdstring+wchar/src/any2bytes.c b/pdstring+wchar/src/any2bytes.c new file mode 100644 index 0000000..f765f6f --- /dev/null +++ b/pdstring+wchar/src/any2bytes.c @@ -0,0 +1,239 @@ +/* -*- Mode: C -*- */ +/*=============================================================================*\ + * File: any2bytes.c + * Author: Bryan Jurish + * Description: convert pd messages to strings (dynamic allocation) + * + * Copyright (c) 2004-2009 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 +#include +#include "mooPdUtils.h" + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +/* black magic */ +#ifdef NT +#pragma warning( disable : 4244 ) +#pragma warning( disable : 4305 ) +#endif + +/*-------------------------------------------------------------------- + * DEBUG + *--------------------------------------------------------------------*/ +/*#define ANY2BYTES_DEBUG 1*/ + +#ifdef ANY2BYTES_DEBUG +# define A2SDEBUG(x) x +#else +# define A2SDEBUG(x) +#endif + +#define ANY2BYTES_DEFAULT_BUFLEN 256 + + +/*===================================================================== + * Structures and Types: any2bytes + *=====================================================================*/ +static t_class *any2bytes_class; + +typedef struct _any2bytes +{ + t_object x_obj; + 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_any2bytes; + + +/*===================================================================== + * Constants + *=====================================================================*/ +static char *any2bytes_banner = "any2bytes: pdstring version " PACKAGE_VERSION " by Bryan Jurish"; + +/*===================================================================== + * Methods + *=====================================================================*/ + +/*-------------------------------------------------------------------- + * anything + */ +static void any2bytes_anything(t_any2bytes *x, t_symbol *sel, int argc, t_atom *argv) +{ + t_atom *ap; + unsigned char *s, *s_max; + int len; + + A2SDEBUG(post("-------any2bytes_anything(%p,...)---------", x)); + + /*-- set up binbuf --*/ + A2SDEBUG(post("any2bytes[%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("any2bytes[%p]: binbuf_add(): selector: '%s'", x, sel->s_name)); + SETSYMBOL((&a), sel); + binbuf_add(x->x_binbuf, 1, &a); + } + A2SDEBUG(else { post("any2bytes[%p]: selector: '%s': IGNORED", x, sel->s_name); }); + + /*-- binbuf_add(): arg list --*/ + A2SDEBUG(post("any2bytes[%p]: binbuf_add(): arg list", x)); + binbuf_add(x->x_binbuf, argc, argv); + A2SDEBUG(post("any2bytes[%p]: binbuf_print: ", x)); + A2SDEBUG(binbuf_print(x->x_binbuf)); + + A2SDEBUG(post("any2bytes[%p]: binbuf_gettext()", x)); + binbuf_gettext(x->x_binbuf, &(x->x_text), &len); + A2SDEBUG(post("any2bytes[%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("any2bytes[%p]: argc=%d", x, x->x_argc)); + + /*-- (re-)allocate (maybe) --*/ + if (x->x_alloc < x->x_argc) { + A2SDEBUG(post("any2bytes[%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("any2bytes[%p]: atom buffer: for {...}", x)); + ap = x->x_argv; + s_max = ((unsigned char *)x->x_text)+len; + for (s=((unsigned char *)x->x_text); s < s_max; s++, ap++) { + A2SDEBUG(post("any2bytes[%p]: atom buffer[%d]: SETFLOAT(a,%d='%c')", x, (ap-x->x_argv), *s, *s)); + SETFLOAT(ap,*s); + } + A2SDEBUG(post("any2bytes: atom buffer: DONE")); + + /*-- add EOS character (maybe) --*/ + if (x->x_eos >= 0) { SETFLOAT(ap, ((int)x->x_eos)); } + + A2SDEBUG(post("any2bytes: outlet_list(..., %d, ...)", x->x_argc)); + outlet_list(x->x_outlet, &s_list, x->x_argc, x->x_argv); +} + + +/*-------------------------------------------------------------------- + * new + */ +static void *any2bytes_new(MOO_UNUSED t_symbol *sel, int argc, t_atom *argv) +{ + t_any2bytes *x = (t_any2bytes *)pd_new(any2bytes_class); + + //-- defaults + x->x_eos = 0; + x->x_alloc = ANY2BYTES_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 = 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("any2bytes_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; +} + +/*-------------------------------------------------------------------- + * free + */ +static void any2bytes_free(t_any2bytes *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; +} + +/*-------------------------------------------------------------------- + * setup (guts) + */ +void any2bytes_setup_guts(void) +{ + //-- class + any2bytes_class = class_new(gensym("any2bytes"), + (t_newmethod)any2bytes_new, + (t_method)any2bytes_free, + sizeof(t_any2bytes), + CLASS_DEFAULT, + A_GIMME, //-- initial_bufsize, eos_char + 0); + + //-- alias + class_addcreator((t_newmethod)any2bytes_new, gensym("any2string"), A_GIMME, 0); + + //-- methods + class_addanything(any2bytes_class, (t_method)any2bytes_anything); + + //-- help symbol + //class_sethelpsymbol(any2bytes_class, gensym("any2bytes-help.pd")); //-- breaks pd-extended help lookup +} + + +/*-------------------------------------------------------------------- + * setup + */ +void any2bytes_setup(void) +{ + post(any2bytes_banner); + any2bytes_setup_guts(); +} diff --git a/pdstring+wchar/src/any2string-help.pd b/pdstring+wchar/src/any2string-help.pd deleted file mode 100644 index 873070c..0000000 --- a/pdstring+wchar/src/any2string-help.pd +++ /dev/null @@ -1,39 +0,0 @@ -#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 ; -#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; -#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; diff --git a/pdstring+wchar/src/any2string.c b/pdstring+wchar/src/any2string.c deleted file mode 100644 index deb4b9b..0000000 --- a/pdstring+wchar/src/any2string.c +++ /dev/null @@ -1,239 +0,0 @@ -/* -*- Mode: C -*- */ -/*=============================================================================*\ - * File: any2string.c - * Author: Bryan Jurish - * Description: convert pd messages to strings (dynamic allocation) - * - * Copyright (c) 2004 - 2009 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 -#include -#include "mooPdUtils.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*/ - -#ifdef ANY2STRING_DEBUG -# define A2SDEBUG(x) x -#else -# define A2SDEBUG(x) -#endif - -#define ANY2STRING_DEFAULT_BUFLEN 256 - - -/*===================================================================== - * Structures and Types: any2string - *=====================================================================*/ -static t_class *any2string_class; - -typedef struct _any2string -{ - t_object x_obj; - 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; - - -/*===================================================================== - * Constants - *=====================================================================*/ -static char *any2string_banner = "any2string: pdstring version " PACKAGE_VERSION " by Bryan Jurish"; - -/*===================================================================== - * Methods - *=====================================================================*/ - -/*-------------------------------------------------------------------- - * anything - */ -static void any2string_anything(t_any2string *x, t_symbol *sel, int argc, t_atom *argv) -{ - t_atom *ap; - unsigned 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)); - ap = x->x_argv; - s_max = ((unsigned char *)x->x_text)+len; - for (s=((unsigned char *)x->x_text); s < s_max; s++, ap++) { - A2SDEBUG(post("any2string[%p]: atom buffer[%d]: SETFLOAT(a,%d='%c')", x, (ap-x->x_argv), *s, *s)); - SETFLOAT(ap,*s); - } - A2SDEBUG(post("any2string: atom buffer: DONE")); - - /*-- add EOS character (maybe) --*/ - if (x->x_eos >= 0) { SETFLOAT(ap, ((int)x->x_eos)); } - - A2SDEBUG(post("any2string: outlet_list(..., %d, ...)", x->x_argc)); - outlet_list(x->x_outlet, &s_list, x->x_argc, x->x_argv); -} - - -/*-------------------------------------------------------------------- - * new - */ -static void *any2string_new(MOO_UNUSED 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 = 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; -} - -/*-------------------------------------------------------------------- - * free - */ -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; -} - -/*-------------------------------------------------------------------- - * 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); - - //-- alias - class_addcreator((t_newmethod)any2string_new, gensym("any2bytes"), A_GIMME, 0); - - //-- methods - class_addanything(any2string_class, (t_method)any2string_anything); - - //-- help symbol - //class_sethelpsymbol(any2string_class, gensym("any2string-help.pd")); //-- breaks pd-extended help lookup -} - - -/*-------------------------------------------------------------------- - * setup - */ -void any2string_setup(void) -{ - post(any2string_banner); - any2string_setup_guts(); -} diff --git a/pdstring+wchar/src/any2string_static.c b/pdstring+wchar/src/any2string_static.c deleted file mode 100644 index 50da35d..0000000 --- a/pdstring+wchar/src/any2string_static.c +++ /dev/null @@ -1,246 +0,0 @@ -/* -*- Mode: C -*- */ -/*=============================================================================*\ - * File: any2string_static.c - * Author: Bryan Jurish - * 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 -#include - -#include - -#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 && spx_argcx_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 ( ; argvx_argcx_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")); -} diff --git a/pdstring+wchar/src/bytes2any-help.pd b/pdstring+wchar/src/bytes2any-help.pd new file mode 100644 index 0000000..0a8e138 --- /dev/null +++ b/pdstring+wchar/src/bytes2any-help.pd @@ -0,0 +1,47 @@ +#N canvas 179 42 612 604 10; +#X text 13 52 INLETS:; +#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 ; +#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; +#X text 27 68 1 - byte-valued float lists; +#X text 59 7 bytes2any : convert lists of byte values to pd messages +; +#X text 13 30 SYNTAX: bytes2any [INITIAL_BUFSIZE [EOS_CHAR]]; +#X connect 4 0 5 0; +#X connect 4 1 6 0; +#X connect 7 0 4 0; +#X connect 8 0 4 0; +#X connect 9 0 4 1; +#X connect 10 0 4 1; +#X connect 11 0 4 1; +#X connect 20 0 4 0; diff --git a/pdstring+wchar/src/bytes2any.c b/pdstring+wchar/src/bytes2any.c new file mode 100644 index 0000000..f4cb9d1 --- /dev/null +++ b/pdstring+wchar/src/bytes2any.c @@ -0,0 +1,249 @@ +/* -*- Mode: C -*- */ +/*=============================================================================*\ + * File: bytes2any.c + * Author: Bryan Jurish + * Description: convert strings to pd messages + * + * Copyright (c) 2004-2009 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 +#include +#include "mooPdUtils.h" + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +/* black magic */ +#ifdef NT +#pragma warning( disable : 4244 ) +#pragma warning( disable : 4305 ) +#endif + +/*-------------------------------------------------------------------- + * DEBUG + *--------------------------------------------------------------------*/ +/*#define BYTES2ANY_DEBUG 1*/ +/*#undef BYTES2ANY_DEBUG*/ + +#ifdef BYTES2ANY_DEBUG +# define S2ADEBUG(x) x +#else +# define S2ADEBUG(x) +#endif + +#define BYTES2ANY_DEFAULT_BUFLEN 256 + + +/*===================================================================== + * Constants + *=====================================================================*/ +static char *bytes2any_banner = "bytes2any: pdstring version " PACKAGE_VERSION " by Bryan Jurish"; + +/*===================================================================== + * Structures and Types: any2string + *=====================================================================*/ + +static t_class *bytes2any_class; + +typedef struct _bytes2any +{ + 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_bytes2any; + + +/*===================================================================== + * Utilities + *=====================================================================*/ + +/*-------------------------------------------------------------------- + * bytes2any_atoms() + */ +static void bytes2any_atoms(t_bytes2any *x, int argc, t_atom *argv) +{ + char *s; + int x_argc, a_argc=0; + t_atom *x_argv; + + /*-- allocate --*/ + if ( ((int)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)); + } + + /*-- get text --*/ + for (s=x->x_text; argc > 0; argc--, a_argc++, argv++, s++) { + *s = atom_getfloat(argv); + S2ADEBUG(post("bytes2any[%p]: a_argc=%d,*s=%d", x, a_argc, *s)); + if ((x->x_eos<0 && !*s) || (*s==x->x_eos)) { break; } /*-- hack: look for eos char --*/ + } + *s = 0; + S2ADEBUG(post("bytes2any[%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("bytes2any[%p]: binbuf_print: ", x)); + S2ADEBUG(binbuf_print(x->x_binbuf)); + + /*-- output --*/ + x_argc = binbuf_getnatom(x->x_binbuf); + x_argv = binbuf_getvec(x->x_binbuf); + if (x_argc && x_argv->a_type == A_SYMBOL) { + outlet_anything(x->x_outlet, + x_argv->a_w.w_symbol, + x_argc-1, + x_argv+1); + } + else { + outlet_anything(x->x_outlet, + &s_list, + x_argc, + x_argv); + } +} + + +/*===================================================================== + * Methods + *=====================================================================*/ + +/*-------------------------------------------------------------------- + * anything + */ +static void bytes2any_anything(t_bytes2any *x, MOO_UNUSED 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)) { + bytes2any_atoms(x, i-i0, argv+i0); + i0=i+1; + } + } + } + + if (i0 < argc) { + bytes2any_atoms(x, argc-i0, argv+i0); + } + + outlet_bang(x->x_outlet_done); +} + + +/*-------------------------------------------------------------------- + * new + */ +static void *bytes2any_new(MOO_UNUSED t_symbol *sel, int argc, t_atom *argv) +{ + t_bytes2any *x = (t_bytes2any *)pd_new(bytes2any_class); + + //-- defaults + x->x_binbuf = binbuf_new(); + x->x_size = BYTES2ANY_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("bytes2any_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; +} + +/*-------------------------------------------------------------------- + * free + */ +static void bytes2any_free(t_bytes2any *x) +{ + 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; +} + +/*-------------------------------------------------------------------- + * setup: guts + */ +void bytes2any_setup_guts(void) +{ + //-- class + bytes2any_class = class_new(gensym("bytes2any"), + (t_newmethod)bytes2any_new, + (t_method)bytes2any_free, + sizeof(t_bytes2any), + CLASS_DEFAULT, + A_GIMME, //-- initial_bufsize, eos_char + 0); + + //-- alias + class_addcreator((t_newmethod)bytes2any_new, gensym("bytes2any"), A_GIMME, 0); + + //-- methods + class_addanything(bytes2any_class, (t_method)bytes2any_anything); + + + //-- help symbol + //class_sethelpsymbol(bytes2any_class, gensym("bytes2any-help.pd")); //-- breaks pd-extended help lookup +} + +/*-------------------------------------------------------------------- + * setup + */ +void bytes2any_setup(void) +{ + post(bytes2any_banner); + bytes2any_setup_guts(); +} diff --git a/pdstring+wchar/src/config.h.in b/pdstring+wchar/src/config.h.in index fe4add7..748fa6a 100644 --- a/pdstring+wchar/src/config.h.in +++ b/pdstring+wchar/src/config.h.in @@ -1,7 +1,10 @@ /* src/config.h.in. Generated from configure.ac by autoheader. */ -/* Define this to include debugging code for the 'string2any' external. */ -#undef ANY2STRING_DEBUG +/* Define this to include debugging code for the 'bytes2any' external. */ +#undef ANY2BYTES_DEBUG + +/* Define this to include debugging code for the 'any2bytes' external. */ +#undef BYTES2ANY_DEBUG /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H @@ -33,8 +36,5 @@ /* User who configured this external */ #undef PDSTRING_USER -/* Define this to include debugging code for the 'any2string' external. */ -#undef STRING2ANY_DEBUG - /* Version number of package */ #undef VERSION diff --git a/pdstring+wchar/src/pdstring-help.pd b/pdstring+wchar/src/pdstring-help.pd index 2ab94b3..12e6d42 100644 --- a/pdstring+wchar/src/pdstring-help.pd +++ b/pdstring+wchar/src/pdstring-help.pd @@ -4,8 +4,6 @@ #X symbolatom 46 59 10 0 0 0 - - -; #X text 201 59 ... no special handling for symbols; #X text 200 37 anything can be converted to a list...; -#X obj 37 108 any2string; -#X obj 37 230 string2any; #X floatatom 54 178 4 0 0 0 - - -; #X text 213 230 string2any converts ASCII lists to Pd messages...; #X text 202 81 ... but "float" selector is silently dropped; @@ -13,7 +11,6 @@ #X obj 162 144 f 0; #X obj 134 153 + 1; #X obj 161 165 t f f f; -#X obj 133 198 string2any; #X obj 154 243 pack s 0; #X obj 162 119 until; #X obj 133 218 symbol; @@ -23,37 +20,40 @@ #X obj 162 54 t b b; #X obj 154 266 route list; #X obj 154 293 print charset; +#X obj 133 198 bytes2any; #X connect 0 0 2 0; #X connect 1 0 0 1; #X connect 2 0 1 0; -#X connect 2 1 3 0; -#X connect 2 2 4 1; -#X connect 3 0 6 0; -#X connect 4 0 11 0; -#X connect 5 0 0 0; +#X connect 2 1 12 0; +#X connect 2 2 3 1; +#X connect 3 0 10 0; +#X connect 4 0 0 0; +#X connect 5 0 3 0; #X connect 6 0 4 0; -#X connect 7 0 5 0; -#X connect 8 0 0 1; -#X connect 9 0 10 0; -#X connect 10 0 7 0; -#X connect 10 1 8 0; -#X connect 11 0 12 0; -#X connect 11 1 12 0; +#X connect 7 0 0 1; +#X connect 8 0 9 0; +#X connect 9 0 6 0; +#X connect 9 1 7 0; +#X connect 10 0 11 0; +#X connect 10 1 11 0; +#X connect 12 0 5 0; #X restore 249 144 pd ascii-table; #X msg 249 121 bang; #X text 361 143 know your charset; -#X obj 58 139 print any2string-out; -#X obj 37 254 print string2any-out; #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; +#X obj 37 108 any2bytes; +#X obj 37 230 bytes2any; +#X obj 58 139 print any2bytes-out; +#X obj 37 254 print bytes2any-out; +#X connect 1 0 14 0; +#X connect 2 0 14 0; +#X connect 5 0 15 0; +#X connect 9 0 8 0; +#X connect 11 0 14 0; +#X connect 12 0 15 0; +#X connect 14 0 15 0; +#X connect 14 0 16 0; +#X connect 15 0 17 0; diff --git a/pdstring+wchar/src/pdstring.c b/pdstring+wchar/src/pdstring.c index 44add2d..d68cbdd 100644 --- a/pdstring+wchar/src/pdstring.c +++ b/pdstring+wchar/src/pdstring.c @@ -55,13 +55,8 @@ typedef struct _pdstring * External declarations *=====================================================================*/ #ifndef PDSTRING_OBJECT_EXTERNALS -/* -extern void any2string_setup_guts(void); -extern void string2any_setup_guts(void); -*/ -#include "any2string.c" -#include "string2any.c" - +# include "any2bytes.c" +# include "bytes2any.c" #endif /*-------------------------------------------------------------------- @@ -91,8 +86,8 @@ void pdstring_setup(void) pdstring_help(NULL); #ifndef PDSTRING_OBJECT_EXTERNALS - any2string_setup_guts(); - string2any_setup_guts(); + any2bytes_setup_guts(); + bytes2any_setup_guts(); #endif pdstring_class = class_new(gensym("pdstring"), diff --git a/pdstring+wchar/src/string2any-help.pd b/pdstring+wchar/src/string2any-help.pd deleted file mode 100644 index 3d09fc7..0000000 --- a/pdstring+wchar/src/string2any-help.pd +++ /dev/null @@ -1,46 +0,0 @@ -#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 ; -#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; -#X connect 7 0 8 0; -#X connect 7 1 9 0; -#X connect 10 0 7 0; -#X connect 11 0 7 0; -#X connect 12 0 7 1; -#X connect 13 0 7 1; -#X connect 14 0 7 1; -#X connect 23 0 7 0; diff --git a/pdstring+wchar/src/string2any.c b/pdstring+wchar/src/string2any.c deleted file mode 100644 index 73eaae9..0000000 --- a/pdstring+wchar/src/string2any.c +++ /dev/null @@ -1,249 +0,0 @@ -/* -*- Mode: C -*- */ -/*=============================================================================*\ - * File: string2any.c - * Author: Bryan Jurish - * Description: convert strings to pd messages - * - * Copyright (c) 2004-2008 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 -#include -#include "mooPdUtils.h" - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -/* black magic */ -#ifdef NT -#pragma warning( disable : 4244 ) -#pragma warning( disable : 4305 ) -#endif - -/*-------------------------------------------------------------------- - * DEBUG - *--------------------------------------------------------------------*/ -/*#define STRING2ANY_DEBUG 1*/ -/*#undef STRING2ANY_DEBUG*/ - -#ifdef STRING2ANY_DEBUG -# define S2ADEBUG(x) x -#else -# define S2ADEBUG(x) -#endif - -#define STRING2ANY_DEFAULT_BUFLEN 256 - - -/*===================================================================== - * Constants - *=====================================================================*/ -static char *string2any_banner = "string2any: pdstring version " PACKAGE_VERSION " by Bryan Jurish"; - -/*===================================================================== - * Structures and Types: any2string - *=====================================================================*/ - -static t_class *string2any_class; - -typedef struct _string2any -{ - 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=0; - t_atom *x_argv; - - /*-- allocate --*/ - if ( ((int)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)); - } - - /*-- get text --*/ - for (s=x->x_text; argc > 0; argc--, a_argc++, argv++, s++) { - *s = atom_getfloat(argv); - S2ADEBUG(post("string2any[%p]: a_argc=%d,*s=%d", x, a_argc, *s)); - if ((x->x_eos<0 && !*s) || (*s==x->x_eos)) { break; } /*-- hack: look for eos char --*/ - } - *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)); - - /*-- output --*/ - x_argc = binbuf_getnatom(x->x_binbuf); - x_argv = binbuf_getvec(x->x_binbuf); - if (x_argc && x_argv->a_type == A_SYMBOL) { - outlet_anything(x->x_outlet, - x_argv->a_w.w_symbol, - x_argc-1, - x_argv+1); - } - else { - outlet_anything(x->x_outlet, - &s_list, - x_argc, - x_argv); - } -} - - -/*===================================================================== - * Methods - *=====================================================================*/ - -/*-------------------------------------------------------------------- - * anything - */ -static void string2any_anything(t_string2any *x, MOO_UNUSED 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(MOO_UNUSED t_symbol *sel, int argc, t_atom *argv) -{ - t_string2any *x = (t_string2any *)pd_new(string2any_class); - - //-- 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; -} - -/*-------------------------------------------------------------------- - * free - */ -static void string2any_free(t_string2any *x) -{ - 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; -} - -/*-------------------------------------------------------------------- - * 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); - - //-- alias - class_addcreator((t_newmethod)string2any_new, gensym("bytes2any"), A_GIMME, 0); - - //-- methods - class_addanything(string2any_class, (t_method)string2any_anything); - - - //-- help symbol - //class_sethelpsymbol(string2any_class, gensym("string2any-help.pd")); //-- breaks pd-extended help lookup -} - -/*-------------------------------------------------------------------- - * setup - */ -void string2any_setup(void) -{ - post(string2any_banner); - string2any_setup_guts(); -} diff --git a/pdstring+wchar/src/unsigned.pd b/pdstring+wchar/src/unsigned.pd index 7a5a328..d86c773 100644 --- a/pdstring+wchar/src/unsigned.pd +++ b/pdstring+wchar/src/unsigned.pd @@ -1,27 +1,27 @@ #N canvas 206 54 450 300 10; -#X floatatom 105 86 5 0 0 1 byte_value - -; -#X obj 105 116 string2any; -#X obj 119 146 print s2a; -#X obj 105 176 any2string; -#X floatatom 105 208 5 0 0 0 - - -; -#X msg 105 48 -10; -#X msg 143 48 246; -#X floatatom 238 207 5 0 0 0 - - -; -#X floatatom 240 82 5 0 0 1 byte_value - -; -#X msg 240 49 -10; -#X msg 278 49 246; -#X obj 238 115 bytes2any; -#X obj 238 175 any2bytes; -#X obj 252 145 print s2b; -#X connect 0 0 1 0; -#X connect 1 0 2 0; -#X connect 1 0 3 0; -#X connect 3 0 4 0; -#X connect 5 0 0 0; -#X connect 6 0 0 0; -#X connect 8 0 11 0; -#X connect 9 0 8 0; -#X connect 10 0 8 0; -#X connect 11 0 12 0; -#X connect 11 0 13 0; -#X connect 12 0 7 0; +#X floatatom 253 98 5 0 0 1 byte_value - -; +#X obj 267 158 print s2a; +#X floatatom 253 220 5 0 0 0 - - -; +#X msg 253 60 -10; +#X msg 291 60 246; +#X floatatom 86 219 5 0 0 0 - - -; +#X floatatom 88 94 5 0 0 1 byte_value - -; +#X msg 88 61 -10; +#X msg 126 61 246; +#X obj 86 127 bytes2any; +#X obj 86 187 any2bytes; +#X obj 100 157 print s2b; +#X obj 253 128 string2any; +#X obj 253 188 any2string; +#X connect 0 0 12 0; +#X connect 3 0 0 0; +#X connect 4 0 0 0; +#X connect 6 0 9 0; +#X connect 7 0 6 0; +#X connect 8 0 6 0; +#X connect 9 0 10 0; +#X connect 9 0 11 0; +#X connect 10 0 5 0; +#X connect 12 0 1 0; +#X connect 12 0 13 0; +#X connect 13 0 2 0; -- cgit v1.2.1