aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjasch <j45ch@users.sourceforge.net>2007-07-18 14:29:58 +0000
committerjasch <j45ch@users.sourceforge.net>2007-07-18 14:29:58 +0000
commit0bd317ffec2d94f211edcf448d5aea17f3acfdad (patch)
tree8bfd706e7ec56822344445a62013428245372582
parentc605308c3b3d09273dc52148083b25d251bc3a78 (diff)
*** empty log message ***
svn path=/trunk/externals/jasch_lib/; revision=8127
-rw-r--r--detox/detox.c2
-rw-r--r--detoxk/detox-help.pd108
-rw-r--r--detoxk/detox.c1
-rw-r--r--detoxk/m_pd.h635
-rw-r--r--detoxk/makefile92
-rw-r--r--memchr/strchr-help.pd22
-rw-r--r--memchr/strchr.c1
-rw-r--r--underscore/underscore.c1
8 files changed, 1 insertions, 861 deletions
diff --git a/detox/detox.c b/detox/detox.c
index 7debd3d..9889e45 100644
--- a/detox/detox.c
+++ b/detox/detox.c
@@ -1 +1 @@
-/*__________________________________________________________________________ detox á extract value/content from tag-structured symbol Copyright (C) 2003 - 2006 jan schacher 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 revised tree output 20040712 initial build 200300502 pd-port 20060506 ____________________________________________________________________________*/ #include "m_pd.h" #include <string.h> #include <stdlib.h> #include <ctype.h> #include <locale.h> #define VERSION "1.2" #define CLIP(x,a,b) (x)=(x)<(a)?(a):(x)>(b)?(b):(x) typedef struct _detox { t_object ob; t_atom t_tree[257], t_attrpair[2]; t_atom t_comp, t_blip; long t_treecount; short t_debug; short t_mode; void *s_outlet, *s_outlet2, *s_outlet3, *s_outlet4; } t_detox; t_symbol *ps_nothing; void *detox_class; void *detox_new(t_symbol *s, long argc, t_atom *argv); void detox_free(t_detox *x); void detox_reset(t_detox *x); void detox_debug(t_detox *x, float f); void detox_mode(t_detox *x, float f); void detox_anything(t_detox *x, t_symbol *s, long argc, t_atom *argv); long clip(long in, long min, long max); void version(t_detox *x); void detox_setup(void) { detox_class = class_new(gensym("detox"), (t_newmethod)detox_new, (t_method)detox_free, sizeof(t_detox), 0, A_GIMME, 0); class_addsymbol(detox_class, (t_method)detox_anything); // class_addmethod(detox_class, (t_method)detox_anything, gensym("anything"), A_GIMME,0); class_addmethod(detox_class, (t_method)detox_debug, gensym("debug"), A_FLOAT, 0); class_addmethod(detox_class, (t_method)detox_mode, gensym("mode"), A_FLOAT, 0); class_addmethod(detox_class, (t_method)detox_reset, gensym("reset"), 0); class_addmethod(detox_class, (t_method)version, gensym("version"), 0); post(". detox . jasch . "__DATE__" "); ps_nothing = gensym(""); } void *detox_new(t_symbol *s, long argc, t_atom *argv) { t_detox *x = (t_detox *)pd_new(detox_class); x->s_outlet = outlet_new(&x->ob, NULL); x->s_outlet2 = outlet_new(&x->ob, NULL); x->s_outlet3 = outlet_new(&x->ob, NULL); x->s_outlet4 = outlet_new(&x->ob, gensym("float")); x->t_treecount = 0; x->t_debug = 0; if((argc >= 1)&&(argv[0].a_type == A_FLOAT)){ if(argv[0].a_w.w_float == 0){ x->t_mode = 0; }else{ x->t_mode = 1; } }else{ x->t_mode = 1; } x->t_debug = 0; if(x->t_debug) post("mode is %ld", x->t_mode); return (x); } void detox_reset(t_detox *x) { short i; x->t_treecount = 0; for(i=0;i<256; i++) x->t_tree[i].a_w.w_symbol = ps_nothing; } void detox_debug(t_detox *x, float f) { if(f == 0.0){ x->t_debug = 0; }else if(f != 0){ x->t_debug = 1; } } void detox_mode(t_detox *x, float f) { if(f == 0.0){ x->t_mode = 0; }else if(f != 0){ x->t_mode = 1; } } void detox_anything(t_detox *x, t_symbol *s, long argc, t_atom *argv) { t_atom *outlist, *comp, *attrpair; char local[1024], local2[1024]; char temp[1024]; char tempstring[2]; char *ptr, *ptr2, *ptr3, *ptr4, *ptr5; long i, j, k, last, len, len2, tempcount = 0, pos = 0; short tagtype = 0; // 0 = closed, 1 = open, 2 = closing short outsize = 0; long quotetype = 0; short attrpresent = 0; i = 0; strcpy(tempstring, " "); outlist = x->t_tree; attrpair = x->t_attrpair; x->t_attrpair[0].a_type = A_SYMBOL; x->t_attrpair[1].a_type = A_SYMBOL; if(s->s_name == "debug"){ x->t_debug = CLIP(argv[0].a_w.w_float, 0, 1); return; } strcpy(local2, s->s_name); last = strlen(local2); // test for tag if(x->t_debug) post("input is %s", s->s_name); k=0; while(isspace(local2[k])){ // remove whitespace/tab/cr/linefeed k++; } if(x->t_debug) post("k is %ld, last is %ld", k, last); for(i=k, j=0; i<last; i++, j++){ // remove whitespace/tab/cr/linefeed local[j] = local2[i]; } local[j] = 0; // terminate string if((local[0] != '<') || (local[j-1] != '>')){ tagtype = 0; // not a well formed tag if(x->t_debug) post("tagtype 0"); goto content; } if((local[1] == '?') || (local[1] == '!')){ tagtype = 4; // this might be a metatag if(x->t_debug) post("tagtype 4"); goto content; } ptr = strchr(local, '/'); // is it a closing tag ? if(x->t_debug) post("ptr contains %s", s->s_name); if(ptr == NULL){ // we have new open tag tagtype = 2; if(x->t_debug) post("tagtype 2"); }else if((local[1] == '/')){ // is it at beginning tagtype = 3; if(x->t_debug) post("tagtype 3"); }else if(local[1] != '/'){ // is it elsewhere if(x->t_debug) post("tagtype 1"); tagtype = 1; } switch(tagtype){ case 1: // closed tag :: add temporarily to tree ptr = strchr(local, '>'); ptr2 = strchr(local, ' '); if(ptr2 != NULL) *ptr2 = 0; if(ptr != NULL){ *ptr = 0; }else{ return; } len = strlen(local); ptr5 = (char *)memmove((local + 0),(local + 1), len-1); local[len-1] = 0; ptr5 = local; x->t_blip.a_type = A_SYMBOL; x->t_blip.a_w.w_symbol = gensym(ptr5); tempcount = 1; break; case 2: // opening tag :: add to tree, increment count ptr2 = strchr(local, ' '); if(ptr2 != NULL){ *ptr2 = 0; if(x->t_debug) post("inside opening tag w/ whitespace, %s", local); }else{ local[strlen(local) - 1] = 0; // local[strlen(ptr2) -1] = 0; if(x->t_debug) post("inside opening tag no whitespace, %s", local); // return; } len = strlen(local); ptr5 = (char *)memmove((local + 0),(local + 1), len-1); if(x->t_debug) post("ptr5 is %s", ptr5); local[len-1] = 0; ptr5 = local; x->t_tree[x->t_treecount].a_type = A_SYMBOL; x->t_tree[x->t_treecount].a_w.w_symbol = gensym(ptr5); x->t_treecount++; x->t_treecount = clip(x->t_treecount, 0, 255); break; case 3: // closing tag :: remove from tree, decrement count ptr2 = strchr(local, '>'); if(ptr2 != NULL){ *ptr2 = 0; }else{ return; } len = strlen(local); ptr5 = (char *)memmove((local + 0),(local + 2), len-2); local[len-2] = 0; ptr5 = local; x->t_comp.a_type = A_SYMBOL; x->t_comp.a_w.w_symbol = gensym(ptr5); if(x->t_comp.a_w.w_symbol->s_name == x->t_tree[x->t_treecount-1].a_w.w_symbol->s_name){ x->t_treecount -= 1; x->t_treecount = clip(x->t_treecount, 0, 255); }else{ outlet_float(x->s_outlet4, 3); outlet_float(x->s_outlet3, -1); return; } break; } content: outlet_float(x->s_outlet4, tagtype); if(tagtype == 0) return; if(x->t_treecount > 0){ if(tempcount){ outsize = x->t_treecount + 1; x->t_tree[outsize-1] = x->t_blip; }else{ outsize = x->t_treecount; } outlet_list(x->s_outlet3, 0L, outsize, outlist); // ouput tree }else if(x->t_treecount == 0){ if(tempcount){ outlet_anything(x->s_outlet3, x->t_blip.a_w.w_symbol, 0, NULL); // ouput tree }else{ outlet_float(x->s_outlet3, 0); // ouput tree } } strcpy(local, s->s_name); ptr = strchr(local, '>'); // parse content between enclosing tags <tag>blah</tag> if(ptr == NULL) goto onward; *ptr = 0; ++ptr; ptr2 = strchr(ptr, '<'); if(ptr2 == NULL) goto onward; *ptr2 = 0; outlet_anything(x->s_outlet2, gensym(ptr), 0, NULL); onward: strcpy(local, s->s_name); // get full buffer again switch(x->t_mode){ case 0: // the old way of attribute parsing (mode 0) if(x->t_debug) post("content: before strtok %s", local); ptr = strtok(local,tempstring); while (ptr != NULL){ ptr3 = strchr(ptr, '"'); if(ptr3 != NULL){ *ptr3 = 0; ++ptr3; ptr4 = strchr(ptr3, '"'); *ptr4 = 0; outlet_anything(x->s_outlet, gensym(ptr3), 0, NULL); if(x->t_debug) post("content: after strtok %s", ptr); } ptr = strtok(NULL, tempstring); } break; case 1: // the new way of attribute parsing (mode 1) ptr = local; if(strcspn(ptr, "=\"\'") == strlen(ptr)) break; // no attr-chars found, bail ouit ptr = strchr(local, 32); // find first whitespace if(ptr == NULL) break; // no whitespace found bail attr_loop: while((ptr[0] == ' ') && (ptr != NULL)) ptr++; // find next non-whitespace char ptr2 = ptr; while(!((ptr2[0] == ' ')||(ptr2[0] == '=')) && (ptr2 != NULL)) ptr2++; // find next non-white or not equal-sign len = strlen(ptr) - strlen(ptr2); strncpy(temp, ptr, len); // copy into temp-buffer temp[len] = 0; // terminate temp_buffer attrpair[0].a_type = A_SYMBOL; attrpair[0].a_w.w_symbol = gensym(temp); // put into output symbol ptr = ptr2; while(!((ptr[0] == '\'') || (ptr[0] == '\"')) && (ptr != NULL)){ // move until single or double quote ptr++; quotetype = ptr[0]; } ptr2 = ++ptr; while((ptr2[0] != quotetype) && (ptr2 != NULL)) ptr2++; len = strlen(ptr) - strlen(ptr2); strncpy(temp, ptr, len); temp[len] = 0; attrpair[1].a_type = A_SYMBOL; attrpair[1].a_w.w_symbol = gensym(temp); outlet_anything(x->s_outlet, x->t_attrpair[0].a_w.w_symbol, 1, &x->t_attrpair[1]); ptr = ++ptr2; while((ptr[0] == ' ')&&(ptr != NULL)){ ptr++; } // find next non-whitespace char if((ptr[0] == '/') || (ptr[0] == '>') || (ptr[0] == '?') || (ptr == NULL)){ // if char is "/" or ">" or "?" bail out break; }else{ goto attr_loop; } break; } } void detox_free(t_detox *x) { // notify_free((t_object *)x); } long clip(long in, long min, long max) { return in < min? min: (in > max? max : in); } void version(t_detox *x) { post("á detox á jasch - version " VERSION" compiled "__DATE__" "__TIME__ ); } \ No newline at end of file
+/*__________________________________________________________________________ detox á extract value/content from tag-structured symbol Copyright (C) 2003 - 2006 jan schacher 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 pd-port 20060517 revised tree output 20040712 initial build 20030502 ____________________________________________________________________________*/ #include "m_pd.h" #include <string.h> #include <stdlib.h> #include <ctype.h> #include <locale.h> #include <stdio.h> #define VERSION "1.3" #define CLIP(x,a,b) (x)=(x)<(a)?(a):(x)>(b)?(b):(x) #define MAXLENGTH 4096 typedef struct _detox { t_object ob; t_atom t_tree[257], t_attrpair[2]; t_atom t_comp, t_blip; t_atom t_checkat[2]; char t_charbuf[MAXLENGTH]; long t_treecount; short t_debug; short t_mode; void *s_outlet, *s_outlet2, *s_outlet3, *s_outlet4; } t_detox; t_symbol *ps_nothing; void *detox_class; void *detox_new(t_symbol *s, short argc, t_atom *argv); void detox_bang(t_detox *x); void detox_float(t_detox *x, t_float f); void detox_list(t_detox *x, t_symbol *s, short argc, t_atom *argv); void detox_anything(t_detox *x, t_symbol *s, short argc, t_atom *argv); void detox_free(t_detox *x); void detox_reset(t_detox *x); void detox_debug(t_detox *x, float f); void detox_mode(t_detox *x, float f); void detox_anything(t_detox *x, t_symbol *s, short argc, t_atom *argv); void detox_action(t_detox *x); void detox_fixsymbol(t_detox *x); void version(t_detox *x); void detox_setup(void) { detox_class = class_new(gensym("detox"), (t_newmethod)detox_new, (t_method)detox_free, sizeof(t_detox), 0, A_GIMME, 0); class_addsymbol(detox_class, (t_method)detox_anything); class_addmethod(detox_class, (t_method)detox_list, gensym("list"), A_GIMME,0); class_addmethod(detox_class, (t_method)detox_debug, gensym("debug"), A_FLOAT, 0); class_addmethod(detox_class, (t_method)detox_mode, gensym("mode"), A_FLOAT, 0); class_addmethod(detox_class, (t_method)detox_reset, gensym("reset"), 0); class_addmethod(detox_class, (t_method)version, gensym("version"), 0); post("- detox - jasch - "__DATE__" "); ps_nothing = gensym(""); } void *detox_new(t_symbol *s, short argc, t_atom *argv) { t_detox *x = (t_detox *)pd_new(detox_class); x->s_outlet = outlet_new(&x->ob, NULL); x->s_outlet2 = outlet_new(&x->ob, NULL); x->s_outlet3 = outlet_new(&x->ob, NULL); x->s_outlet4 = outlet_new(&x->ob, gensym("float")); x->t_treecount = 0; x->t_debug = 0; if((argc >= 1)&&(argv[0].a_type == A_FLOAT)){ if(argv[0].a_w.w_float == 0){ x->t_mode = 0; }else{ x->t_mode = 1; } }else{ x->t_mode = 1; } x->t_debug = 0; if(x->t_debug) post("mode is %ld", x->t_mode); x->t_checkat[0].a_type = A_SYMBOL; x->t_checkat[0].a_w.w_symbol = gensym("none"); x->t_checkat[1].a_type = A_SYMBOL; x->t_checkat[1].a_w.w_symbol = gensym("none"); return (x); } void detox_free(t_detox *x) { // notify_free((t_object *)x); } void detox_bang(t_detox *x) { detox_action(x); } void detox_float(t_detox *x, t_float f) { sprintf(x->t_charbuf, "%.6f", f); detox_action(x); } void detox_list(t_detox *x, t_symbol *s, short argc, t_atom *argv) { long i; char temp[MAXLENGTH]; x->t_charbuf[0] = 0; for(i = 0; i < argc; i++){ if(i) strcat(x->t_charbuf, " "); temp[0] = 0; if(argv[i].a_type == A_FLOAT){ sprintf(temp, "%.6f", argv[i].a_w.w_float); }else if(argv[i].a_type == A_SYMBOL){ // check for whitespace in symbol and add back doublequotes if(strchr(argv[i].a_w.w_symbol->s_name, 32) == NULL) { // no whitespace : normal proc strcpy(temp, argv[i].a_w.w_symbol->s_name); } else { // with whitespace : fix it x->t_checkat[0] = argv[i]; detox_fixsymbol(x); strcpy(temp, x->t_checkat[1].a_w.w_symbol->s_name); } } if((strlen(x->t_charbuf) + strlen(temp)) < MAXLENGTH){ strcat(x->t_charbuf, temp); }else{ return; } } detox_action(x); } void detox_anything(t_detox *x, t_symbol *s, short argc, t_atom *argv) { long i; char temp[MAXLENGTH]; x->t_charbuf[0] = 0; strcpy(x->t_charbuf, s->s_name); for(i = 0; i < argc; i++){ strcat(x->t_charbuf, " "); temp[0] = 0; if(argv[i].a_type == A_FLOAT){ sprintf(temp, "%.6f", argv[i].a_w.w_float); }else if(argv[i].a_type == A_SYMBOL){ // check for whitespace in symbol and add back doublequotes if(strchr(argv[i].a_w.w_symbol->s_name, 32) == NULL) { // no whitespace : normal proc strcpy(temp, argv[i].a_w.w_symbol->s_name); } else { // with whitespace : fix it x->t_checkat[0] = argv[i]; detox_fixsymbol(x); strcpy(temp, x->t_checkat[1].a_w.w_symbol->s_name); } } // post("temp is %s", temp); if((strlen(x->t_charbuf) + strlen(temp)) < MAXLENGTH){ strcat(x->t_charbuf, temp); }else{ return; } } detox_action(x); return; } void detox_reset(t_detox *x) { short i; x->t_treecount = 0; for(i=0;i<256; i++) x->t_tree[i].a_w.w_symbol = ps_nothing; } void detox_debug(t_detox *x, float f) { if(f == 0.0){ x->t_debug = 0; }else if(f != 0){ x->t_debug = 1; } } void detox_mode(t_detox *x, float f) { if(f == 0.0){ x->t_mode = 0; }else if(f != 0){ x->t_mode = 1; } } void detox_action(t_detox *x) { t_atom *outlist, *attrpair; // *comp, char local[MAXLENGTH], local2[MAXLENGTH]; char temp[MAXLENGTH]; char tempstring[2]; // for strtok char *ptr1 = NULL, *ptr2 = NULL, *ptr3 = NULL; long i, j, k, last, len, tempcount = 0; short tagtype = 0; // 0 = closed, 1 = open, 2 = closing short outsize = 0; char quotetype[1]; short digitflag = 0; short punctflag = 0; short quoteflag = 0; // short attrpresent = 0; quotetype[0] = '\"'; // init to standard double quotes i = 0; strcpy(tempstring, " "); outlist = x->t_tree; attrpair = x->t_attrpair; x->t_attrpair[0].a_type = A_SYMBOL; x->t_attrpair[1].a_type = A_SYMBOL; // check type and recast on output strcpy(local2, x->t_charbuf); last = strlen(local2); // test for tag // if(x->t_debug) post("input is %s", x->t_charbuf); k = 0; while(isspace(local2[k])){ // remove whitespace/tab/cr/linefeed k++; } // if(x->t_debug) post("k is %ld, last is %ld", k, last); for(i=k, j=0; i<last; i++, j++){ // remove whitespace/tab/cr/linefeed local[j] = local2[i]; } local[j] = 0; // terminate string if((local[0] != '<') || (local[j-1] != '>')){ tagtype = 0; // not a well formed tag if(x->t_debug) post("tagtype 0"); goto content; } if((local[1] == '?') || (local[1] == '!')){ tagtype = 4; // this might be a metatag if(x->t_debug) post("tagtype 4"); goto content; } for(i = 0, ptr1 = NULL, quoteflag = 0; i < (long)(strlen(local) -1); i++) { if((local[i] == '\"') || (local[i] == '\'')){ quoteflag = !quoteflag; } if((local[i] == '/') && (quoteflag == 0)) { ptr1 = &local[i]; } } //ptr1 = strchr(local, '/'); // is it a closing tag ? // bug: if slash is within quotes: should ignore if(x->t_debug) post("ptr1 contains %s", x->t_charbuf); if(ptr1 == NULL){ // we have new open tag tagtype = 2; if(x->t_debug) post("tagtype 2"); }else if((local[1] == '/')){ // is it at beginning tagtype = 3; if(x->t_debug) post("tagtype 3"); }else if(local[1] != '/'){ // is it elsewhere if(x->t_debug) post("tagtype 1"); tagtype = 1; } switch(tagtype){ case 1: // closed tag :: add temporarily to tree ptr1 = strchr(local, '>'); ptr2 = strchr(local, ' '); if(ptr2 != NULL) *ptr2 = 0; if(ptr1 != NULL){ *ptr1 = 0; }else{ return; } len = strlen(local); ptr3 = (char *)memmove((local + 0),(local + 1), len-1); local[len-1] = 0; ptr3 = local; x->t_blip.a_type = A_SYMBOL; x->t_blip.a_w.w_symbol = gensym(ptr3); tempcount = 1; break; case 2: // opening tag :: add to tree, increment count ptr2 = strchr(local, ' '); if(ptr2 != NULL){ *ptr2 = 0; if(x->t_debug) post("inside opening tag w/ whitespace, %s", local); }else{ local[strlen(local) - 1] = 0; // local[strlen(ptr2) -1] = 0; if(x->t_debug) post("inside opening tag no whitespace, %s", local); // return; } len = strlen(local); ptr3 = (char *)memmove((local + 0),(local + 1), len-1); if(x->t_debug) post("ptr3 is %s", ptr3); local[len-1] = 0; ptr3 = local; SETSYMBOL(x->t_tree + x->t_treecount, gensym(ptr3)); x->t_treecount++; x->t_treecount = CLIP(x->t_treecount, 0, 255); break; case 3: // closing tag :: remove from tree, decrement count ptr2 = strchr(local, '>'); if(ptr2 != NULL){ *ptr2 = 0; }else{ return; } len = strlen(local); ptr3 = (char *)memmove((local + 0),(local + 2), len-2); local[len-2] = 0; ptr3 = local; x->t_comp.a_type = A_SYMBOL; x->t_comp.a_w.w_symbol = gensym(ptr3); if(x->t_comp.a_w.w_symbol->s_name == x->t_tree[x->t_treecount-1].a_w.w_symbol->s_name){ x->t_treecount -= 1; x->t_treecount = CLIP(x->t_treecount, 0, 255); }else{ outlet_float(x->s_outlet4, 3); outlet_float(x->s_outlet3, -1); return; } break; } content: outlet_float(x->s_outlet4, tagtype); if(tagtype == 0) return; // the tree if(x->t_treecount > 0){ if(tempcount){ outsize = x->t_treecount + 1; x->t_tree[outsize-1] = x->t_blip; }else{ outsize = x->t_treecount; } outlet_list(x->s_outlet3, 0L, outsize, outlist); // ouput tree }else if(x->t_treecount == 0){ if(tempcount){ outlet_anything(x->s_outlet3, x->t_blip.a_w.w_symbol, 0, 0L); // ouput tree }else{ outlet_float(x->s_outlet3, 0); // ouput tree } } strcpy(local, x->t_charbuf); ptr1 = strchr(local, '>'); // parse content between enclosing tags <tag>blah</tag> if(ptr1 == NULL) goto attributes; *ptr1 = 0; ++ptr1; ptr2 = strchr(ptr1, '<'); if(ptr2 == NULL) goto attributes; *ptr2 = 0; outlet_anything(x->s_outlet2, gensym(ptr1), 0, 0L); attributes: strcpy(local, x->t_charbuf); // retrieve full buffer again switch(x->t_mode) { // the old way of attribute parsing (mode 0) case 0: if(x->t_debug) post("content: before strtok %s", local); ptr1 = local; ptr2 = strchr(local, '>'); // find tag end ptr2++; // terminate local buffer after tag end ptr2[0] = 0; if(strcspn(ptr1, "=\"\'") == strlen(ptr1)) { // check for attributes inside tag break; // no attr-chars found, bail ouit } ptr1 = strchr(local, ' '); // find first whitespace if(ptr1 == NULL) { break; // no whitespace found bail } while((ptr1[0] == ' ') && (ptr1 != NULL)) { // find next non-whitespace char -> potential start of attr ptr1++; } ptr2 = ptr1; // setup second pointer from end of attr name while( !((ptr2[0] == ' ') || (ptr2[0] == '=')) && (ptr2 != NULL)) { // find next non-white or not equal-sign -> what if not well formed ?? ptr2++; } if(ptr2 == NULL) { error("detox: mode 0, attrloop ptr2 reached NULL looking for \" \" and \"=\""); return; } /*len = 0; len = strlen(ptr1) - strlen(ptr2); // determine length of attr name: name minus whitespace/equal sign for(i = 0; i < len; i++) { temp[i] = ptr1[i]; } temp[len] = 0; // terminate temp_buffer */ ptr1 = ptr2; // copy start pointer to position of end pointer -> remainder while(ptr1 != NULL) { // move start pointer until single or double quote if ((ptr1[0] == '\'') || (ptr1[0] == '\"')) { quotetype[0] = ptr1[0]; break; } ptr1++; } if(ptr1 == NULL) { // bail if no quotes found and end reached error("detox: mode 0, attrloop ptr1 reached NULL"); return; } // store quote char for later comparison if (x->t_debug) post("first quotetype found is %c", quotetype[0]); ptr2 = ++ptr1; // copy end pointer to pos of startpointer + 1, right after the quote while(ptr2 != NULL) { // looking for next quote of stored type if(ptr2[0] == quotetype[0]) { break; } ptr2++; } // post("quotetype is %c and ptr2 is %c", quotetype[0], ptr2[0]); if(ptr2 == NULL) { error("detox: mode 0, attrloop ptr2 reached NULL"); return; } len = 0; digitflag = 1; // reset check for long punctflag = 0; // reset check for float len = strlen(ptr1) - strlen(ptr2); // get the length of the attr content // post("ptr2 ends scan at %c", ptr2[0]); for(i = 0; i < len; i++) { // copy attr-content into temp-buffer temp[i] = ptr1[i]; punctflag += (temp[i] == '.'); // digitflag = digitflag && (isdigit(temp[i]) || ispunct(temp[i])); // are all digits? } temp[len] = 0; if (x->t_debug) post("temp is %s, digitflag is %ld, punctflag is %ld", temp, digitflag, punctflag); if(digitflag == 0){ attrpair[0].a_type = A_SYMBOL; // to do: check atom type and cast accordingly js 20061202 attrpair[0].a_w.w_symbol = gensym(temp); outlet_anything(x->s_outlet, x->t_attrpair[0].a_w.w_symbol, 0, 0L); } else if ((digitflag == 1)&&(punctflag == 0)){ attrpair[1].a_type = A_FLOAT; // to do: check atom type and cast accordingly js 20061202 attrpair[1].a_w.w_float = atoi(temp); outlet_float(x->s_outlet, x->t_attrpair[2].a_w.w_float); } else if ((digitflag == 1)&&(punctflag == 1)){ attrpair[1].a_type = A_FLOAT; // to do: check atom type and cast accordingly js 20061202 attrpair[1].a_w.w_float = atof(temp); outlet_float(x->s_outlet, x->t_attrpair[1].a_w.w_float); } break; case 1: // the new way of attribute parsing (mode 1) ¥¥¥¥ fixed 20070322 ptr1 = local; ptr2 = strchr(local, '>'); // find tag end ptr2++; // terminate local buffer after tag end ptr2[0] = 0; if(strcspn(ptr1, "=\"\'") == strlen(ptr1)) { // check for attributes inside tag break; // no attr-chars found, bail ouit } ptr1 = strchr(local, ' '); // find first whitespace if(ptr1 == NULL) { break; // no whitespace found bail } for(;;) { // ¥¥ attribute loop; example: <person name = 'Alan Turing' died = '07/06/1954' born = "1912-06-23" /> while((ptr1[0] == ' ') && (ptr1 != NULL)) { // find next non-whitespace char -> potential start of attr ptr1++; } ptr2 = ptr1; // setup second pointer from end of attr name while( !((ptr2[0] == ' ') || (ptr2[0] == '=')) && (ptr2 != NULL)) { // find next non-white or not equal-sign -> what if not well formed ?? ptr2++; } if(ptr2 == NULL) { error("detox: mode 1, attrloop ptr2 reached NULL looking for \" \" and \"=\""); return; } len = 0; len = strlen(ptr1) - strlen(ptr2); // determine length of attr name: name minus whitespace/equal sign for(i = 0; i < len; i++) { temp[i] = ptr1[i]; } temp[len] = 0; // terminate temp_buffer attrpair[0].a_w.w_symbol = gensym(temp); // put tempbuffer into output symbol // ¥ done with the attr-name ptr1 = ptr2; // copy start pointer to position of end pointer -> remainder while(ptr1 != NULL) { // move start pointer until single or double quote if ((ptr1[0] == '\'') || (ptr1[0] == '\"')) { quotetype[0] = ptr1[0]; // store quote char for later comparison break; } ptr1++; } if(ptr1 == NULL) { // bail if no quotes found and end reached error("detox: mode 1, attrloop ptr1 reached NULL"); return; } if (x->t_debug) post("first quotetype found is %c", quotetype[0]); ptr2 = ++ptr1; // copy end pointer to pos of startpointer + 1, right after the quote while(ptr2 != NULL) { // looking for next quote of stored type if(ptr2[0] == quotetype[0]) { break; } ptr2++; } // post("quotetype is %c and ptr2 is %c", quotetype[0], ptr2[0]); if(ptr2 == NULL) { error("detox: mode 1, attrloop ptr2 reached NULL"); return; } len = 0; digitflag = 1; // reset check for long punctflag = 0; // reset check for float len = strlen(ptr1) - strlen(ptr2); // get the length of the attr content // post("ptr2 ends scan at %c", ptr2[0]); for(i = 0; i < len; i++) { // copy attr-content into temp-buffer temp[i] = ptr1[i]; punctflag += (temp[i] == '.'); // digitflag = digitflag && (isdigit(temp[i]) || ispunct(temp[i])); // are all digits? } temp[len] = 0; if (x->t_debug) post("temp is %s, digitflag is %ld, punctflag is %ld", temp, digitflag, punctflag); if(digitflag == 0){ attrpair[1].a_type = A_SYMBOL; // to do: check atom type and cast accordingly js 20061202 attrpair[1].a_w.w_symbol = gensym(temp); } else if ((digitflag == 1)&&(punctflag == 0)){ attrpair[1].a_type = A_FLOAT; // to do: check atom type and cast accordingly js 20061202 attrpair[1].a_w.w_float = atoi(temp); } else if ((digitflag == 1)&&(punctflag == 1)){ attrpair[1].a_type = A_FLOAT; // to do: check atom type and cast accordingly js 20061202 attrpair[1].a_w.w_float = atof(temp); } outlet_anything(x->s_outlet, x->t_attrpair[0].a_w.w_symbol, 1, &x->t_attrpair[1]); ptr1 = ++ptr2; // move start pointer to end of atrr-content while(ptr1 != NULL) { // find next non-whitespace char if (ptr1[0] != ' ') { break; } ptr1++; } if((ptr1[0] == '/') || (ptr1[0] == '>') || (ptr1[0] == '?') || (ptr1 == NULL)) { // if char is "/" or ">" or "?" or end of string finish up if (x->t_debug) post("ptr1 reached ending meta characters"); return; } if (x->t_debug) post("ptr1 reached loop point"); } break; } } void detox_fixsymbol(t_detox *x) // this is an ugly hack for max stripping double quotes from symbols with whitespace in them (language problem) { long i = 0; long len = 0; x->t_checkat[1].a_w.w_symbol->s_name[0] = '\"'; // first char in output is " len = strlen(x->t_checkat[0].a_w.w_symbol->s_name); len = CLIP(len, 0, (MAXLENGTH-3)); for(i = 0; i < len; i++) { if ((x->t_checkat[0].a_w.w_symbol->s_name[i] == '/') || (x->t_checkat[0].a_w.w_symbol->s_name[i] == '>')) { // check for syntax differences break; } x->t_checkat[1].a_w.w_symbol->s_name[i+1] = x->t_checkat[0].a_w.w_symbol->s_name[i]; } x->t_checkat[1].a_w.w_symbol->s_name[i+1] = '\"'; // last char in output is " x->t_checkat[1].a_w.w_symbol->s_name[i+2] = 0; // terminate string } void version(t_detox *x) { post("á detox á jasch á v. "VERSION" á compiled "__DATE__" - "__TIME__ ); } \ No newline at end of file
diff --git a/detoxk/detox-help.pd b/detoxk/detox-help.pd
deleted file mode 100644
index 247c0d2..0000000
--- a/detoxk/detox-help.pd
+++ /dev/null
@@ -1,108 +0,0 @@
-#N canvas 0 22 814 758 10;
-#X msg 58 114 <toxine name="fastfood">;
-#X obj 274 400 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
-1;
-#X msg 274 417 mode \$1;
-#X msg 72 133 <class name="italian">;
-#X obj 59 363 tosymbol;
-#X msg 120 400 reset;
-#X msg 85 152 <dish name="pizza">;
-#X msg 353 314 <person died = '1954-06-07' born = "1912-06-23">Alan
-Turing</person>;
-#X obj 225 603 prepend set;
-#X msg 225 622 anchovi -56;
-#X obj 225 645 prepend set;
-#X msg 225 663 name margherita;
-#X text 348 414 1: all attribute:value pairs;
-#X text 164 399 reset tag-tree;
-#X floatatom 227 469 8 0 0 0 - - -;
-#X obj 226 545 prepend set;
-#X msg 226 563 toxine class dish pizza item;
-#X text 406 463 0 invalid tag;
-#X text 406 478 1 closed tag;
-#X text 406 493 2 opening tag;
-#X text 406 508 3 closing tag;
-#X text 406 523 4 meta tag;
-#X msg 97 171 <pizza name = "margherita">;
-#X msg 110 223 <item>anchovi \$1</item>;
-#X floatatom 110 208 5 0 0 0 - - -;
-#X msg 115 244 </topping>;
-#X msg 114 263 </pizza>;
-#X msg 114 281 </dish>;
-#X msg 115 299 </class>;
-#X msg 115 318 </toxine>;
-#X text 348 399 0: first attribute:value pair;
-#X text 296 399 mode:;
-#X obj 59 437 detox 1;
-#X text 462 559 -1 when unmatched closing tag;
-#X msg 187 318 </error>;
-#X text 405 545 returns: 0 when tree is empty;
-#X obj 61 598 print tag_type;
-#X obj 61 616 print tag_tree;
-#X obj 61 634 print tag_content;
-#X obj 61 652 print attribute:value;
-#X obj 352 150 openpanel;
-#X obj 351 248 textfile;
-#X obj 364 222 bng 15 250 50 0 empty empty empty 0 -6 0 8 -150892 -1
--1;
-#X obj 352 133 bng 15 250 50 0 empty empty empty 0 -6 0 8 -166441 -1
--1;
-#X msg 364 204 rewind;
-#X msg 352 168 read \$1 cr;
-#X text 433 199 go to start of file;
-#X text 433 214 step through file;
-#X obj 351 266 print input_line;
-#X text 375 132 open wellformed xml-file;
-#X msg 110 190 <topping name = "mozarella">;
-#X text 354 298 closed tag w/ multiple attributes;
-#X obj -14 13 cnv 15 780 40 empty empty detox 20 12 0 24 -237236 -66577
-0;
-#X text 85 21 extract values \, contents \, attributes from xml-tag
-structures;
-#X text 85 35 argument (optional): mode 0/1;
-#X text 666 18 jasch 05/2006;
-#X text 624 34 http://www.jasch.ch;
-#X obj 310 465 cnv 15 90 20 empty empty tag_type: 10 10 0 10 -233017
--66577 0;
-#X obj 312 542 cnv 15 90 20 empty empty tag_tree: 10 10 0 10 -233017
--66577 0;
-#X obj 312 600 cnv 15 90 20 empty empty tag_content: 10 10 0 10 -233017
--66577 0;
-#X obj 311 643 cnv 15 200 18 empty empty attribute/value_pairs: 10
-10 0 10 -233017 -66577 0;
-#X connect 0 0 4 0;
-#X connect 1 0 2 0;
-#X connect 2 0 32 0;
-#X connect 3 0 4 0;
-#X connect 4 0 32 0;
-#X connect 5 0 32 0;
-#X connect 6 0 4 0;
-#X connect 7 0 4 0;
-#X connect 8 0 9 0;
-#X connect 10 0 11 0;
-#X connect 15 0 16 0;
-#X connect 22 0 4 0;
-#X connect 23 0 4 0;
-#X connect 24 0 23 0;
-#X connect 25 0 4 0;
-#X connect 26 0 4 0;
-#X connect 27 0 4 0;
-#X connect 28 0 4 0;
-#X connect 29 0 4 0;
-#X connect 32 0 10 0;
-#X connect 32 0 39 0;
-#X connect 32 1 8 0;
-#X connect 32 1 38 0;
-#X connect 32 2 15 0;
-#X connect 32 2 37 0;
-#X connect 32 3 14 0;
-#X connect 32 3 36 0;
-#X connect 34 0 4 0;
-#X connect 40 0 45 0;
-#X connect 41 0 4 0;
-#X connect 41 0 48 0;
-#X connect 42 0 41 0;
-#X connect 43 0 40 0;
-#X connect 44 0 41 0;
-#X connect 45 0 41 0;
-#X connect 50 0 4 0;
diff --git a/detoxk/detox.c b/detoxk/detox.c
deleted file mode 100644
index 9889e45..0000000
--- a/detoxk/detox.c
+++ /dev/null
@@ -1 +0,0 @@
-/*__________________________________________________________________________ detox á extract value/content from tag-structured symbol Copyright (C) 2003 - 2006 jan schacher 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 pd-port 20060517 revised tree output 20040712 initial build 20030502 ____________________________________________________________________________*/ #include "m_pd.h" #include <string.h> #include <stdlib.h> #include <ctype.h> #include <locale.h> #include <stdio.h> #define VERSION "1.3" #define CLIP(x,a,b) (x)=(x)<(a)?(a):(x)>(b)?(b):(x) #define MAXLENGTH 4096 typedef struct _detox { t_object ob; t_atom t_tree[257], t_attrpair[2]; t_atom t_comp, t_blip; t_atom t_checkat[2]; char t_charbuf[MAXLENGTH]; long t_treecount; short t_debug; short t_mode; void *s_outlet, *s_outlet2, *s_outlet3, *s_outlet4; } t_detox; t_symbol *ps_nothing; void *detox_class; void *detox_new(t_symbol *s, short argc, t_atom *argv); void detox_bang(t_detox *x); void detox_float(t_detox *x, t_float f); void detox_list(t_detox *x, t_symbol *s, short argc, t_atom *argv); void detox_anything(t_detox *x, t_symbol *s, short argc, t_atom *argv); void detox_free(t_detox *x); void detox_reset(t_detox *x); void detox_debug(t_detox *x, float f); void detox_mode(t_detox *x, float f); void detox_anything(t_detox *x, t_symbol *s, short argc, t_atom *argv); void detox_action(t_detox *x); void detox_fixsymbol(t_detox *x); void version(t_detox *x); void detox_setup(void) { detox_class = class_new(gensym("detox"), (t_newmethod)detox_new, (t_method)detox_free, sizeof(t_detox), 0, A_GIMME, 0); class_addsymbol(detox_class, (t_method)detox_anything); class_addmethod(detox_class, (t_method)detox_list, gensym("list"), A_GIMME,0); class_addmethod(detox_class, (t_method)detox_debug, gensym("debug"), A_FLOAT, 0); class_addmethod(detox_class, (t_method)detox_mode, gensym("mode"), A_FLOAT, 0); class_addmethod(detox_class, (t_method)detox_reset, gensym("reset"), 0); class_addmethod(detox_class, (t_method)version, gensym("version"), 0); post("- detox - jasch - "__DATE__" "); ps_nothing = gensym(""); } void *detox_new(t_symbol *s, short argc, t_atom *argv) { t_detox *x = (t_detox *)pd_new(detox_class); x->s_outlet = outlet_new(&x->ob, NULL); x->s_outlet2 = outlet_new(&x->ob, NULL); x->s_outlet3 = outlet_new(&x->ob, NULL); x->s_outlet4 = outlet_new(&x->ob, gensym("float")); x->t_treecount = 0; x->t_debug = 0; if((argc >= 1)&&(argv[0].a_type == A_FLOAT)){ if(argv[0].a_w.w_float == 0){ x->t_mode = 0; }else{ x->t_mode = 1; } }else{ x->t_mode = 1; } x->t_debug = 0; if(x->t_debug) post("mode is %ld", x->t_mode); x->t_checkat[0].a_type = A_SYMBOL; x->t_checkat[0].a_w.w_symbol = gensym("none"); x->t_checkat[1].a_type = A_SYMBOL; x->t_checkat[1].a_w.w_symbol = gensym("none"); return (x); } void detox_free(t_detox *x) { // notify_free((t_object *)x); } void detox_bang(t_detox *x) { detox_action(x); } void detox_float(t_detox *x, t_float f) { sprintf(x->t_charbuf, "%.6f", f); detox_action(x); } void detox_list(t_detox *x, t_symbol *s, short argc, t_atom *argv) { long i; char temp[MAXLENGTH]; x->t_charbuf[0] = 0; for(i = 0; i < argc; i++){ if(i) strcat(x->t_charbuf, " "); temp[0] = 0; if(argv[i].a_type == A_FLOAT){ sprintf(temp, "%.6f", argv[i].a_w.w_float); }else if(argv[i].a_type == A_SYMBOL){ // check for whitespace in symbol and add back doublequotes if(strchr(argv[i].a_w.w_symbol->s_name, 32) == NULL) { // no whitespace : normal proc strcpy(temp, argv[i].a_w.w_symbol->s_name); } else { // with whitespace : fix it x->t_checkat[0] = argv[i]; detox_fixsymbol(x); strcpy(temp, x->t_checkat[1].a_w.w_symbol->s_name); } } if((strlen(x->t_charbuf) + strlen(temp)) < MAXLENGTH){ strcat(x->t_charbuf, temp); }else{ return; } } detox_action(x); } void detox_anything(t_detox *x, t_symbol *s, short argc, t_atom *argv) { long i; char temp[MAXLENGTH]; x->t_charbuf[0] = 0; strcpy(x->t_charbuf, s->s_name); for(i = 0; i < argc; i++){ strcat(x->t_charbuf, " "); temp[0] = 0; if(argv[i].a_type == A_FLOAT){ sprintf(temp, "%.6f", argv[i].a_w.w_float); }else if(argv[i].a_type == A_SYMBOL){ // check for whitespace in symbol and add back doublequotes if(strchr(argv[i].a_w.w_symbol->s_name, 32) == NULL) { // no whitespace : normal proc strcpy(temp, argv[i].a_w.w_symbol->s_name); } else { // with whitespace : fix it x->t_checkat[0] = argv[i]; detox_fixsymbol(x); strcpy(temp, x->t_checkat[1].a_w.w_symbol->s_name); } } // post("temp is %s", temp); if((strlen(x->t_charbuf) + strlen(temp)) < MAXLENGTH){ strcat(x->t_charbuf, temp); }else{ return; } } detox_action(x); return; } void detox_reset(t_detox *x) { short i; x->t_treecount = 0; for(i=0;i<256; i++) x->t_tree[i].a_w.w_symbol = ps_nothing; } void detox_debug(t_detox *x, float f) { if(f == 0.0){ x->t_debug = 0; }else if(f != 0){ x->t_debug = 1; } } void detox_mode(t_detox *x, float f) { if(f == 0.0){ x->t_mode = 0; }else if(f != 0){ x->t_mode = 1; } } void detox_action(t_detox *x) { t_atom *outlist, *attrpair; // *comp, char local[MAXLENGTH], local2[MAXLENGTH]; char temp[MAXLENGTH]; char tempstring[2]; // for strtok char *ptr1 = NULL, *ptr2 = NULL, *ptr3 = NULL; long i, j, k, last, len, tempcount = 0; short tagtype = 0; // 0 = closed, 1 = open, 2 = closing short outsize = 0; char quotetype[1]; short digitflag = 0; short punctflag = 0; short quoteflag = 0; // short attrpresent = 0; quotetype[0] = '\"'; // init to standard double quotes i = 0; strcpy(tempstring, " "); outlist = x->t_tree; attrpair = x->t_attrpair; x->t_attrpair[0].a_type = A_SYMBOL; x->t_attrpair[1].a_type = A_SYMBOL; // check type and recast on output strcpy(local2, x->t_charbuf); last = strlen(local2); // test for tag // if(x->t_debug) post("input is %s", x->t_charbuf); k = 0; while(isspace(local2[k])){ // remove whitespace/tab/cr/linefeed k++; } // if(x->t_debug) post("k is %ld, last is %ld", k, last); for(i=k, j=0; i<last; i++, j++){ // remove whitespace/tab/cr/linefeed local[j] = local2[i]; } local[j] = 0; // terminate string if((local[0] != '<') || (local[j-1] != '>')){ tagtype = 0; // not a well formed tag if(x->t_debug) post("tagtype 0"); goto content; } if((local[1] == '?') || (local[1] == '!')){ tagtype = 4; // this might be a metatag if(x->t_debug) post("tagtype 4"); goto content; } for(i = 0, ptr1 = NULL, quoteflag = 0; i < (long)(strlen(local) -1); i++) { if((local[i] == '\"') || (local[i] == '\'')){ quoteflag = !quoteflag; } if((local[i] == '/') && (quoteflag == 0)) { ptr1 = &local[i]; } } //ptr1 = strchr(local, '/'); // is it a closing tag ? // bug: if slash is within quotes: should ignore if(x->t_debug) post("ptr1 contains %s", x->t_charbuf); if(ptr1 == NULL){ // we have new open tag tagtype = 2; if(x->t_debug) post("tagtype 2"); }else if((local[1] == '/')){ // is it at beginning tagtype = 3; if(x->t_debug) post("tagtype 3"); }else if(local[1] != '/'){ // is it elsewhere if(x->t_debug) post("tagtype 1"); tagtype = 1; } switch(tagtype){ case 1: // closed tag :: add temporarily to tree ptr1 = strchr(local, '>'); ptr2 = strchr(local, ' '); if(ptr2 != NULL) *ptr2 = 0; if(ptr1 != NULL){ *ptr1 = 0; }else{ return; } len = strlen(local); ptr3 = (char *)memmove((local + 0),(local + 1), len-1); local[len-1] = 0; ptr3 = local; x->t_blip.a_type = A_SYMBOL; x->t_blip.a_w.w_symbol = gensym(ptr3); tempcount = 1; break; case 2: // opening tag :: add to tree, increment count ptr2 = strchr(local, ' '); if(ptr2 != NULL){ *ptr2 = 0; if(x->t_debug) post("inside opening tag w/ whitespace, %s", local); }else{ local[strlen(local) - 1] = 0; // local[strlen(ptr2) -1] = 0; if(x->t_debug) post("inside opening tag no whitespace, %s", local); // return; } len = strlen(local); ptr3 = (char *)memmove((local + 0),(local + 1), len-1); if(x->t_debug) post("ptr3 is %s", ptr3); local[len-1] = 0; ptr3 = local; SETSYMBOL(x->t_tree + x->t_treecount, gensym(ptr3)); x->t_treecount++; x->t_treecount = CLIP(x->t_treecount, 0, 255); break; case 3: // closing tag :: remove from tree, decrement count ptr2 = strchr(local, '>'); if(ptr2 != NULL){ *ptr2 = 0; }else{ return; } len = strlen(local); ptr3 = (char *)memmove((local + 0),(local + 2), len-2); local[len-2] = 0; ptr3 = local; x->t_comp.a_type = A_SYMBOL; x->t_comp.a_w.w_symbol = gensym(ptr3); if(x->t_comp.a_w.w_symbol->s_name == x->t_tree[x->t_treecount-1].a_w.w_symbol->s_name){ x->t_treecount -= 1; x->t_treecount = CLIP(x->t_treecount, 0, 255); }else{ outlet_float(x->s_outlet4, 3); outlet_float(x->s_outlet3, -1); return; } break; } content: outlet_float(x->s_outlet4, tagtype); if(tagtype == 0) return; // the tree if(x->t_treecount > 0){ if(tempcount){ outsize = x->t_treecount + 1; x->t_tree[outsize-1] = x->t_blip; }else{ outsize = x->t_treecount; } outlet_list(x->s_outlet3, 0L, outsize, outlist); // ouput tree }else if(x->t_treecount == 0){ if(tempcount){ outlet_anything(x->s_outlet3, x->t_blip.a_w.w_symbol, 0, 0L); // ouput tree }else{ outlet_float(x->s_outlet3, 0); // ouput tree } } strcpy(local, x->t_charbuf); ptr1 = strchr(local, '>'); // parse content between enclosing tags <tag>blah</tag> if(ptr1 == NULL) goto attributes; *ptr1 = 0; ++ptr1; ptr2 = strchr(ptr1, '<'); if(ptr2 == NULL) goto attributes; *ptr2 = 0; outlet_anything(x->s_outlet2, gensym(ptr1), 0, 0L); attributes: strcpy(local, x->t_charbuf); // retrieve full buffer again switch(x->t_mode) { // the old way of attribute parsing (mode 0) case 0: if(x->t_debug) post("content: before strtok %s", local); ptr1 = local; ptr2 = strchr(local, '>'); // find tag end ptr2++; // terminate local buffer after tag end ptr2[0] = 0; if(strcspn(ptr1, "=\"\'") == strlen(ptr1)) { // check for attributes inside tag break; // no attr-chars found, bail ouit } ptr1 = strchr(local, ' '); // find first whitespace if(ptr1 == NULL) { break; // no whitespace found bail } while((ptr1[0] == ' ') && (ptr1 != NULL)) { // find next non-whitespace char -> potential start of attr ptr1++; } ptr2 = ptr1; // setup second pointer from end of attr name while( !((ptr2[0] == ' ') || (ptr2[0] == '=')) && (ptr2 != NULL)) { // find next non-white or not equal-sign -> what if not well formed ?? ptr2++; } if(ptr2 == NULL) { error("detox: mode 0, attrloop ptr2 reached NULL looking for \" \" and \"=\""); return; } /*len = 0; len = strlen(ptr1) - strlen(ptr2); // determine length of attr name: name minus whitespace/equal sign for(i = 0; i < len; i++) { temp[i] = ptr1[i]; } temp[len] = 0; // terminate temp_buffer */ ptr1 = ptr2; // copy start pointer to position of end pointer -> remainder while(ptr1 != NULL) { // move start pointer until single or double quote if ((ptr1[0] == '\'') || (ptr1[0] == '\"')) { quotetype[0] = ptr1[0]; break; } ptr1++; } if(ptr1 == NULL) { // bail if no quotes found and end reached error("detox: mode 0, attrloop ptr1 reached NULL"); return; } // store quote char for later comparison if (x->t_debug) post("first quotetype found is %c", quotetype[0]); ptr2 = ++ptr1; // copy end pointer to pos of startpointer + 1, right after the quote while(ptr2 != NULL) { // looking for next quote of stored type if(ptr2[0] == quotetype[0]) { break; } ptr2++; } // post("quotetype is %c and ptr2 is %c", quotetype[0], ptr2[0]); if(ptr2 == NULL) { error("detox: mode 0, attrloop ptr2 reached NULL"); return; } len = 0; digitflag = 1; // reset check for long punctflag = 0; // reset check for float len = strlen(ptr1) - strlen(ptr2); // get the length of the attr content // post("ptr2 ends scan at %c", ptr2[0]); for(i = 0; i < len; i++) { // copy attr-content into temp-buffer temp[i] = ptr1[i]; punctflag += (temp[i] == '.'); // digitflag = digitflag && (isdigit(temp[i]) || ispunct(temp[i])); // are all digits? } temp[len] = 0; if (x->t_debug) post("temp is %s, digitflag is %ld, punctflag is %ld", temp, digitflag, punctflag); if(digitflag == 0){ attrpair[0].a_type = A_SYMBOL; // to do: check atom type and cast accordingly js 20061202 attrpair[0].a_w.w_symbol = gensym(temp); outlet_anything(x->s_outlet, x->t_attrpair[0].a_w.w_symbol, 0, 0L); } else if ((digitflag == 1)&&(punctflag == 0)){ attrpair[1].a_type = A_FLOAT; // to do: check atom type and cast accordingly js 20061202 attrpair[1].a_w.w_float = atoi(temp); outlet_float(x->s_outlet, x->t_attrpair[2].a_w.w_float); } else if ((digitflag == 1)&&(punctflag == 1)){ attrpair[1].a_type = A_FLOAT; // to do: check atom type and cast accordingly js 20061202 attrpair[1].a_w.w_float = atof(temp); outlet_float(x->s_outlet, x->t_attrpair[1].a_w.w_float); } break; case 1: // the new way of attribute parsing (mode 1) ¥¥¥¥ fixed 20070322 ptr1 = local; ptr2 = strchr(local, '>'); // find tag end ptr2++; // terminate local buffer after tag end ptr2[0] = 0; if(strcspn(ptr1, "=\"\'") == strlen(ptr1)) { // check for attributes inside tag break; // no attr-chars found, bail ouit } ptr1 = strchr(local, ' '); // find first whitespace if(ptr1 == NULL) { break; // no whitespace found bail } for(;;) { // ¥¥ attribute loop; example: <person name = 'Alan Turing' died = '07/06/1954' born = "1912-06-23" /> while((ptr1[0] == ' ') && (ptr1 != NULL)) { // find next non-whitespace char -> potential start of attr ptr1++; } ptr2 = ptr1; // setup second pointer from end of attr name while( !((ptr2[0] == ' ') || (ptr2[0] == '=')) && (ptr2 != NULL)) { // find next non-white or not equal-sign -> what if not well formed ?? ptr2++; } if(ptr2 == NULL) { error("detox: mode 1, attrloop ptr2 reached NULL looking for \" \" and \"=\""); return; } len = 0; len = strlen(ptr1) - strlen(ptr2); // determine length of attr name: name minus whitespace/equal sign for(i = 0; i < len; i++) { temp[i] = ptr1[i]; } temp[len] = 0; // terminate temp_buffer attrpair[0].a_w.w_symbol = gensym(temp); // put tempbuffer into output symbol // ¥ done with the attr-name ptr1 = ptr2; // copy start pointer to position of end pointer -> remainder while(ptr1 != NULL) { // move start pointer until single or double quote if ((ptr1[0] == '\'') || (ptr1[0] == '\"')) { quotetype[0] = ptr1[0]; // store quote char for later comparison break; } ptr1++; } if(ptr1 == NULL) { // bail if no quotes found and end reached error("detox: mode 1, attrloop ptr1 reached NULL"); return; } if (x->t_debug) post("first quotetype found is %c", quotetype[0]); ptr2 = ++ptr1; // copy end pointer to pos of startpointer + 1, right after the quote while(ptr2 != NULL) { // looking for next quote of stored type if(ptr2[0] == quotetype[0]) { break; } ptr2++; } // post("quotetype is %c and ptr2 is %c", quotetype[0], ptr2[0]); if(ptr2 == NULL) { error("detox: mode 1, attrloop ptr2 reached NULL"); return; } len = 0; digitflag = 1; // reset check for long punctflag = 0; // reset check for float len = strlen(ptr1) - strlen(ptr2); // get the length of the attr content // post("ptr2 ends scan at %c", ptr2[0]); for(i = 0; i < len; i++) { // copy attr-content into temp-buffer temp[i] = ptr1[i]; punctflag += (temp[i] == '.'); // digitflag = digitflag && (isdigit(temp[i]) || ispunct(temp[i])); // are all digits? } temp[len] = 0; if (x->t_debug) post("temp is %s, digitflag is %ld, punctflag is %ld", temp, digitflag, punctflag); if(digitflag == 0){ attrpair[1].a_type = A_SYMBOL; // to do: check atom type and cast accordingly js 20061202 attrpair[1].a_w.w_symbol = gensym(temp); } else if ((digitflag == 1)&&(punctflag == 0)){ attrpair[1].a_type = A_FLOAT; // to do: check atom type and cast accordingly js 20061202 attrpair[1].a_w.w_float = atoi(temp); } else if ((digitflag == 1)&&(punctflag == 1)){ attrpair[1].a_type = A_FLOAT; // to do: check atom type and cast accordingly js 20061202 attrpair[1].a_w.w_float = atof(temp); } outlet_anything(x->s_outlet, x->t_attrpair[0].a_w.w_symbol, 1, &x->t_attrpair[1]); ptr1 = ++ptr2; // move start pointer to end of atrr-content while(ptr1 != NULL) { // find next non-whitespace char if (ptr1[0] != ' ') { break; } ptr1++; } if((ptr1[0] == '/') || (ptr1[0] == '>') || (ptr1[0] == '?') || (ptr1 == NULL)) { // if char is "/" or ">" or "?" or end of string finish up if (x->t_debug) post("ptr1 reached ending meta characters"); return; } if (x->t_debug) post("ptr1 reached loop point"); } break; } } void detox_fixsymbol(t_detox *x) // this is an ugly hack for max stripping double quotes from symbols with whitespace in them (language problem) { long i = 0; long len = 0; x->t_checkat[1].a_w.w_symbol->s_name[0] = '\"'; // first char in output is " len = strlen(x->t_checkat[0].a_w.w_symbol->s_name); len = CLIP(len, 0, (MAXLENGTH-3)); for(i = 0; i < len; i++) { if ((x->t_checkat[0].a_w.w_symbol->s_name[i] == '/') || (x->t_checkat[0].a_w.w_symbol->s_name[i] == '>')) { // check for syntax differences break; } x->t_checkat[1].a_w.w_symbol->s_name[i+1] = x->t_checkat[0].a_w.w_symbol->s_name[i]; } x->t_checkat[1].a_w.w_symbol->s_name[i+1] = '\"'; // last char in output is " x->t_checkat[1].a_w.w_symbol->s_name[i+2] = 0; // terminate string } void version(t_detox *x) { post("á detox á jasch á v. "VERSION" á compiled "__DATE__" - "__TIME__ ); } \ No newline at end of file
diff --git a/detoxk/m_pd.h b/detoxk/m_pd.h
deleted file mode 100644
index 41e0ffa..0000000
--- a/detoxk/m_pd.h
+++ /dev/null
@@ -1,635 +0,0 @@
-/* Copyright (c) 1997-1999 Miller Puckette.
-* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
-
-#ifndef __m_pd_h_
-
-#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
-extern "C" {
-#endif
-
-#define PD_MAJOR_VERSION 0
-#define PD_MINOR_VERSION 39
-
-/* old name for "MSW" flag -- we have to take it for the sake of many old
-"nmakefiles" for externs, which will define NT and not MSW */
-#if defined(NT) && !defined(MSW)
-#define MSW
-#endif
-
-#ifdef MSW
-/* #pragma warning( disable : 4091 ) */
-#pragma warning( disable : 4305 ) /* uncast const double to float */
-#pragma warning( disable : 4244 ) /* uncast float/int conversion etc. */
-#pragma warning( disable : 4101 ) /* unused automatic variables */
-#endif /* MSW */
-
- /* the external storage class is "extern" in UNIX; in MSW it's ugly. */
-#ifdef MSW
-#ifdef PD_INTERNAL
-#define EXTERN __declspec(dllexport) extern
-#else
-#define EXTERN __declspec(dllimport) extern
-#endif /* PD_INTERNAL */
-#else
-#define EXTERN extern
-#endif /* MSW */
-
- /* and depending on the compiler, hidden data structures are
- declared differently: */
-#if defined( __GNUC__) || defined( __BORLANDC__ ) || defined( __MWERKS__ )
-#define EXTERN_STRUCT struct
-#else
-#define EXTERN_STRUCT extern struct
-#endif
-
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#include <stddef.h> /* just for size_t -- how lame! */
-#endif
-
-#define MAXPDSTRING 1000 /* use this for anything you want */
-#define MAXPDARG 5 /* max number of args we can typecheck today */
-
-/* signed and unsigned integer types the size of a pointer: */
-/* GG: long is the size of a pointer */
-typedef long t_int;
-
-typedef float t_float; /* a floating-point number at most the same size */
-typedef float t_floatarg; /* floating-point type for function calls */
-
-typedef struct _symbol
-{
- char *s_name;
- struct _class **s_thing;
- struct _symbol *s_next;
-} t_symbol;
-
-EXTERN_STRUCT _array;
-#define t_array struct _array /* g_canvas.h */
-
-/* pointers to glist and array elements go through a "stub" which sticks
-around after the glist or array is freed. The stub itself is deleted when
-both the glist/array is gone and the refcount is zero, ensuring that no
-gpointers are pointing here. */
-
-#define GP_NONE 0 /* the stub points nowhere (has been cut off) */
-#define GP_GLIST 1 /* the stub points to a glist element */
-#define GP_ARRAY 2 /* ... or array */
-
-typedef struct _gstub
-{
- union
- {
- struct _glist *gs_glist; /* glist we're in */
- struct _array *gs_array; /* array we're in */
- } gs_un;
- int gs_which; /* GP_GLIST/GP_ARRAY */
- int gs_refcount; /* number of gpointers pointing here */
-} t_gstub;
-
-typedef struct _gpointer /* pointer to a gobj in a glist */
-{
- union
- {
- struct _scalar *gp_scalar; /* scalar we're in (if glist) */
- union word *gp_w; /* raw data (if array) */
- } gp_un;
- int gp_valid; /* number which must match gpointee */
- t_gstub *gp_stub; /* stub which points to glist/array */
-} t_gpointer;
-
-typedef union word
-{
- t_float w_float;
- t_symbol *w_symbol;
- t_gpointer *w_gpointer;
- t_array *w_array;
- struct _glist *w_list;
- int w_index;
-} t_word;
-
-typedef enum
-{
- A_NULL,
- A_FLOAT,
- A_SYMBOL,
- A_POINTER,
- A_SEMI,
- A_COMMA,
- A_DEFFLOAT,
- A_DEFSYM,
- A_DOLLAR,
- A_DOLLSYM,
- A_GIMME,
- A_CANT
-} t_atomtype;
-
-#define A_DEFSYMBOL A_DEFSYM /* better name for this */
-
-typedef struct _atom
-{
- t_atomtype a_type;
- union word a_w;
-} t_atom;
-
-EXTERN_STRUCT _class;
-#define t_class struct _class
-
-EXTERN_STRUCT _outlet;
-#define t_outlet struct _outlet
-
-EXTERN_STRUCT _inlet;
-#define t_inlet struct _inlet
-
-EXTERN_STRUCT _binbuf;
-#define t_binbuf struct _binbuf
-
-EXTERN_STRUCT _clock;
-#define t_clock struct _clock
-
-EXTERN_STRUCT _outconnect;
-#define t_outconnect struct _outconnect
-
-EXTERN_STRUCT _glist;
-#define t_glist struct _glist
-#define t_canvas struct _glist /* LATER lose this */
-
-typedef t_class *t_pd; /* pure datum: nothing but a class pointer */
-
-typedef struct _gobj /* a graphical object */
-{
- t_pd g_pd; /* pure datum header (class) */
- struct _gobj *g_next; /* next in list */
-} t_gobj;
-
-typedef struct _scalar /* a graphical object holding data */
-{
- t_gobj sc_gobj; /* header for graphical object */
- t_symbol *sc_template; /* template name (LATER replace with pointer) */
- t_word sc_vec[1]; /* indeterminate-length array of words */
-} t_scalar;
-
-typedef struct _text /* patchable object - graphical, with text */
-{
- t_gobj te_g; /* header for graphical object */
- t_binbuf *te_binbuf; /* holder for the text */
- t_outlet *te_outlet; /* linked list of outlets */
- t_inlet *te_inlet; /* linked list of inlets */
- short te_xpix; /* x&y location (within the toplevel) */
- short te_ypix;
- short te_width; /* requested width in chars, 0 if auto */
- unsigned int te_type:2; /* from defs below */
-} t_text;
-
-#define T_TEXT 0 /* just a textual comment */
-#define T_OBJECT 1 /* a MAX style patchable object */
-#define T_MESSAGE 2 /* a MAX stype message */
-#define T_ATOM 3 /* a cell to display a number or symbol */
-
-#define te_pd te_g.g_pd
-
- /* t_object is synonym for t_text (LATER unify them) */
-
-typedef struct _text t_object;
-
-#define ob_outlet te_outlet
-#define ob_inlet te_inlet
-#define ob_binbuf te_binbuf
-#define ob_pd te_g.g_pd
-#define ob_g te_g
-
-typedef void (*t_method)(void);
-typedef void *(*t_newmethod)( void);
-typedef void (*t_gotfn)(void *x, ...);
-
-/* ---------------- pre-defined objects and symbols --------------*/
-EXTERN t_pd pd_objectmaker; /* factory for creating "object" boxes */
-EXTERN t_pd pd_canvasmaker; /* factory for creating canvases */
-EXTERN t_symbol s_pointer;
-EXTERN t_symbol s_float;
-EXTERN t_symbol s_symbol;
-EXTERN t_symbol s_bang;
-EXTERN t_symbol s_list;
-EXTERN t_symbol s_anything;
-EXTERN t_symbol s_signal;
-EXTERN t_symbol s__N;
-EXTERN t_symbol s__X;
-EXTERN t_symbol s_x;
-EXTERN t_symbol s_y;
-EXTERN t_symbol s_;
-
-/* --------- prototypes from the central message system ----------- */
-EXTERN void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv);
-EXTERN void pd_forwardmess(t_pd *x, int argc, t_atom *argv);
-EXTERN t_symbol *gensym(char *s);
-EXTERN t_gotfn getfn(t_pd *x, t_symbol *s);
-EXTERN t_gotfn zgetfn(t_pd *x, t_symbol *s);
-EXTERN void nullfn(void);
-EXTERN void pd_vmess(t_pd *x, t_symbol *s, char *fmt, ...);
-#define mess0(x, s) ((*getfn((x), (s)))((x)))
-#define mess1(x, s, a) ((*getfn((x), (s)))((x), (a)))
-#define mess2(x, s, a,b) ((*getfn((x), (s)))((x), (a),(b)))
-#define mess3(x, s, a,b,c) ((*getfn((x), (s)))((x), (a),(b),(c)))
-#define mess4(x, s, a,b,c,d) ((*getfn((x), (s)))((x), (a),(b),(c),(d)))
-#define mess5(x, s, a,b,c,d,e) ((*getfn((x), (s)))((x), (a),(b),(c),(d),(e)))
-EXTERN void obj_list(t_object *x, t_symbol *s, int argc, t_atom *argv);
-EXTERN t_pd *pd_newest(void);
-
-/* --------------- memory management -------------------- */
-EXTERN void *getbytes(size_t nbytes);
-EXTERN void *getzbytes(size_t nbytes);
-EXTERN void *copybytes(void *src, size_t nbytes);
-EXTERN void freebytes(void *x, size_t nbytes);
-EXTERN void *resizebytes(void *x, size_t oldsize, size_t newsize);
-
-/* -------------------- atoms ----------------------------- */
-
-#define SETSEMI(atom) ((atom)->a_type = A_SEMI, (atom)->a_w.w_index = 0)
-#define SETCOMMA(atom) ((atom)->a_type = A_COMMA, (atom)->a_w.w_index = 0)
-#define SETPOINTER(atom, gp) ((atom)->a_type = A_POINTER, \
- (atom)->a_w.w_gpointer = (gp))
-#define SETFLOAT(atom, f) ((atom)->a_type = A_FLOAT, (atom)->a_w.w_float = (f))
-#define SETSYMBOL(atom, s) ((atom)->a_type = A_SYMBOL, \
- (atom)->a_w.w_symbol = (s))
-#define SETDOLLAR(atom, n) ((atom)->a_type = A_DOLLAR, \
- (atom)->a_w.w_index = (n))
-#define SETDOLLSYM(atom, s) ((atom)->a_type = A_DOLLSYM, \
- (atom)->a_w.w_symbol= (s))
-
-EXTERN t_float atom_getfloat(t_atom *a);
-EXTERN t_int atom_getint(t_atom *a);
-EXTERN t_symbol *atom_getsymbol(t_atom *a);
-EXTERN t_symbol *atom_gensym(t_atom *a);
-EXTERN t_float atom_getfloatarg(int which, int argc, t_atom *argv);
-EXTERN t_int atom_getintarg(int which, int argc, t_atom *argv);
-EXTERN t_symbol *atom_getsymbolarg(int which, int argc, t_atom *argv);
-
-EXTERN void atom_string(t_atom *a, char *buf, unsigned int bufsize);
-
-/* ------------------ binbufs --------------- */
-
-EXTERN t_binbuf *binbuf_new(void);
-EXTERN void binbuf_free(t_binbuf *x);
-EXTERN t_binbuf *binbuf_duplicate(t_binbuf *y);
-
-EXTERN void binbuf_text(t_binbuf *x, char *text, size_t size);
-EXTERN void binbuf_gettext(t_binbuf *x, char **bufp, int *lengthp);
-EXTERN void binbuf_clear(t_binbuf *x);
-EXTERN void binbuf_add(t_binbuf *x, int argc, t_atom *argv);
-EXTERN void binbuf_addv(t_binbuf *x, char *fmt, ...);
-EXTERN void binbuf_addbinbuf(t_binbuf *x, t_binbuf *y);
-EXTERN void binbuf_addsemi(t_binbuf *x);
-EXTERN void binbuf_restore(t_binbuf *x, int argc, t_atom *argv);
-EXTERN void binbuf_print(t_binbuf *x);
-EXTERN int binbuf_getnatom(t_binbuf *x);
-EXTERN t_atom *binbuf_getvec(t_binbuf *x);
-EXTERN void binbuf_eval(t_binbuf *x, t_pd *target, int argc, t_atom *argv);
-EXTERN int binbuf_read(t_binbuf *b, char *filename, char *dirname,
- int crflag);
-EXTERN int binbuf_read_via_path(t_binbuf *b, char *filename, char *dirname,
- int crflag);
-EXTERN int binbuf_write(t_binbuf *x, char *filename, char *dir,
- int crflag);
-EXTERN void binbuf_evalfile(t_symbol *name, t_symbol *dir);
-EXTERN t_symbol *binbuf_realizedollsym(t_symbol *s, int ac, t_atom *av,
- int tonew);
-
-/* ------------------ clocks --------------- */
-
-EXTERN t_clock *clock_new(void *owner, t_method fn);
-EXTERN void clock_set(t_clock *x, double systime);
-EXTERN void clock_delay(t_clock *x, double delaytime);
-EXTERN void clock_unset(t_clock *x);
-EXTERN double clock_getlogicaltime(void);
-EXTERN double clock_getsystime(void); /* OBSOLETE; use clock_getlogicaltime() */
-EXTERN double clock_gettimesince(double prevsystime);
-EXTERN double clock_getsystimeafter(double delaytime);
-EXTERN void clock_free(t_clock *x);
-
-/* ----------------- pure data ---------------- */
-EXTERN t_pd *pd_new(t_class *cls);
-EXTERN void pd_free(t_pd *x);
-EXTERN void pd_bind(t_pd *x, t_symbol *s);
-EXTERN void pd_unbind(t_pd *x, t_symbol *s);
-EXTERN t_pd *pd_findbyclass(t_symbol *s, t_class *c);
-EXTERN void pd_pushsym(t_pd *x);
-EXTERN void pd_popsym(t_pd *x);
-EXTERN t_symbol *pd_getfilename(void);
-EXTERN t_symbol *pd_getdirname(void);
-EXTERN void pd_bang(t_pd *x);
-EXTERN void pd_pointer(t_pd *x, t_gpointer *gp);
-EXTERN void pd_float(t_pd *x, t_float f);
-EXTERN void pd_symbol(t_pd *x, t_symbol *s);
-EXTERN void pd_list(t_pd *x, t_symbol *s, int argc, t_atom *argv);
-EXTERN void pd_anything(t_pd *x, t_symbol *s, int argc, t_atom *argv);
-#define pd_class(x) (*(x))
-
-/* ----------------- pointers ---------------- */
-EXTERN void gpointer_init(t_gpointer *gp);
-EXTERN void gpointer_copy(const t_gpointer *gpfrom, t_gpointer *gpto);
-EXTERN void gpointer_unset(t_gpointer *gp);
-EXTERN int gpointer_check(const t_gpointer *gp, int headok);
-
-/* ----------------- patchable "objects" -------------- */
-EXTERN t_inlet *inlet_new(t_object *owner, t_pd *dest, t_symbol *s1,
- t_symbol *s2);
-EXTERN t_inlet *pointerinlet_new(t_object *owner, t_gpointer *gp);
-EXTERN t_inlet *floatinlet_new(t_object *owner, t_float *fp);
-EXTERN t_inlet *symbolinlet_new(t_object *owner, t_symbol **sp);
-EXTERN t_inlet *signalinlet_new(t_object *owner, t_float f);
-EXTERN void inlet_free(t_inlet *x);
-
-EXTERN t_outlet *outlet_new(t_object *owner, t_symbol *s);
-EXTERN void outlet_bang(t_outlet *x);
-EXTERN void outlet_pointer(t_outlet *x, t_gpointer *gp);
-EXTERN void outlet_float(t_outlet *x, t_float f);
-EXTERN void outlet_symbol(t_outlet *x, t_symbol *s);
-EXTERN void outlet_list(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
-EXTERN void outlet_anything(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
-EXTERN t_symbol *outlet_getsymbol(t_outlet *x);
-EXTERN void outlet_free(t_outlet *x);
-EXTERN t_object *pd_checkobject(t_pd *x);
-
-
-/* -------------------- canvases -------------- */
-
-EXTERN void glob_setfilename(void *dummy, t_symbol *name, t_symbol *dir);
-
-EXTERN void canvas_setargs(int argc, t_atom *argv);
-EXTERN void canvas_getargs(int *argcp, t_atom **argvp);
-EXTERN t_symbol *canvas_getcurrentdir(void);
-EXTERN t_glist *canvas_getcurrent(void);
-EXTERN void canvas_makefilename(t_glist *c, char *file,
- char *result,int resultsize);
-EXTERN t_symbol *canvas_getdir(t_glist *x);
-EXTERN int sys_fontwidth(int fontsize);
-EXTERN int sys_fontheight(int fontsize);
-EXTERN void canvas_dataproperties(t_glist *x, t_scalar *sc, t_binbuf *b);
-
-/* ---------------- widget behaviors ---------------------- */
-
-EXTERN_STRUCT _widgetbehavior;
-#define t_widgetbehavior struct _widgetbehavior
-
-EXTERN_STRUCT _parentwidgetbehavior;
-#define t_parentwidgetbehavior struct _parentwidgetbehavior
-EXTERN t_parentwidgetbehavior *pd_getparentwidget(t_pd *x);
-
-/* -------------------- classes -------------- */
-
-#define CLASS_DEFAULT 0 /* flags for new classes below */
-#define CLASS_PD 1
-#define CLASS_GOBJ 2
-#define CLASS_PATCHABLE 3
-#define CLASS_NOINLET 8
-
-#define CLASS_TYPEMASK 3
-
-
-EXTERN t_class *class_new(t_symbol *name, t_newmethod newmethod,
- t_method freemethod, size_t size, int flags, t_atomtype arg1, ...);
-EXTERN void class_addcreator(t_newmethod newmethod, t_symbol *s,
- t_atomtype type1, ...);
-EXTERN void class_addmethod(t_class *c, t_method fn, t_symbol *sel,
- t_atomtype arg1, ...);
-EXTERN void class_addbang(t_class *c, t_method fn);
-EXTERN void class_addpointer(t_class *c, t_method fn);
-EXTERN void class_doaddfloat(t_class *c, t_method fn);
-EXTERN void class_addsymbol(t_class *c, t_method fn);
-EXTERN void class_addlist(t_class *c, t_method fn);
-EXTERN void class_addanything(t_class *c, t_method fn);
-EXTERN void class_sethelpsymbol(t_class *c, t_symbol *s);
-EXTERN void class_setwidget(t_class *c, t_widgetbehavior *w);
-EXTERN void class_setparentwidget(t_class *c, t_parentwidgetbehavior *w);
-EXTERN t_parentwidgetbehavior *class_parentwidget(t_class *c);
-EXTERN char *class_getname(t_class *c);
-EXTERN char *class_gethelpname(t_class *c);
-EXTERN void class_setdrawcommand(t_class *c);
-EXTERN int class_isdrawcommand(t_class *c);
-EXTERN void class_domainsignalin(t_class *c, int onset);
-#define CLASS_MAINSIGNALIN(c, type, field) \
- class_domainsignalin(c, (char *)(&((type *)0)->field) - (char *)0)
-
- /* prototype for functions to save Pd's to a binbuf */
-typedef void (*t_savefn)(t_gobj *x, t_binbuf *b);
-EXTERN void class_setsavefn(t_class *c, t_savefn f);
-EXTERN t_savefn class_getsavefn(t_class *c);
- /* prototype for functions to open properties dialogs */
-typedef void (*t_propertiesfn)(t_gobj *x, struct _glist *glist);
-EXTERN void class_setpropertiesfn(t_class *c, t_propertiesfn f);
-EXTERN t_propertiesfn class_getpropertiesfn(t_class *c);
-
-#ifndef PD_CLASS_DEF
-#define class_addbang(x, y) class_addbang((x), (t_method)(y))
-#define class_addpointer(x, y) class_addpointer((x), (t_method)(y))
-#define class_addfloat(x, y) class_doaddfloat((x), (t_method)(y))
-#define class_addsymbol(x, y) class_addsymbol((x), (t_method)(y))
-#define class_addlist(x, y) class_addlist((x), (t_method)(y))
-#define class_addanything(x, y) class_addanything((x), (t_method)(y))
-#endif
-
-/* ------------ printing --------------------------------- */
-EXTERN void post(const char *fmt, ...);
-EXTERN void startpost(const char *fmt, ...);
-EXTERN void poststring(const char *s);
-EXTERN void postfloat(float f);
-EXTERN void postatom(int argc, t_atom *argv);
-EXTERN void endpost(void);
-EXTERN void error(const char *fmt, ...);
-EXTERN void verbose(int level, const char *fmt, ...);
-EXTERN void bug(const char *fmt, ...);
-EXTERN void pd_error(void *object, const char *fmt, ...);
-EXTERN void sys_logerror(const char *object, const char *s);
-EXTERN void sys_unixerror(const char *object);
-EXTERN void sys_ouch(void);
-
-
-/* ------------ system interface routines ------------------- */
-EXTERN int sys_isreadablefile(const char *name);
-EXTERN void sys_bashfilename(const char *from, char *to);
-EXTERN void sys_unbashfilename(const char *from, char *to);
-EXTERN int open_via_path(const char *name, const char *ext, const char *dir,
- char *dirresult, char **nameresult, unsigned int size, int bin);
-EXTERN int sched_geteventno(void);
-EXTERN double sys_getrealtime(void);
-EXTERN int (*sys_idlehook)(void); /* hook to add idle time computation */
-
-
-/* ------------ threading ------------------- */
-EXTERN void sys_lock(void);
-EXTERN void sys_unlock(void);
-EXTERN int sys_trylock(void);
-
-
-/* --------------- signals ----------------------------------- */
-
-typedef float t_sample;
-#define MAXLOGSIG 32
-#define MAXSIGSIZE (1 << MAXLOGSIG)
-
-typedef struct _signal
-{
- int s_n; /* number of points in the array */
- t_sample *s_vec; /* the array */
- float s_sr; /* sample rate */
- int s_refcount; /* number of times used */
- int s_isborrowed; /* whether we're going to borrow our array */
- struct _signal *s_borrowedfrom; /* signal to borrow it from */
- struct _signal *s_nextfree; /* next in freelist */
- struct _signal *s_nextused; /* next in used list */
-} t_signal;
-
-
-typedef t_int *(*t_perfroutine)(t_int *args);
-
-EXTERN t_int *plus_perform(t_int *args);
-EXTERN t_int *zero_perform(t_int *args);
-EXTERN t_int *copy_perform(t_int *args);
-
-EXTERN void dsp_add_plus(t_sample *in1, t_sample *in2, t_sample *out, int n);
-EXTERN void dsp_add_copy(t_sample *in, t_sample *out, int n);
-EXTERN void dsp_add_scalarcopy(t_sample *in, t_sample *out, int n);
-EXTERN void dsp_add_zero(t_sample *out, int n);
-
-EXTERN int sys_getblksize(void);
-EXTERN float sys_getsr(void);
-EXTERN int sys_get_inchannels(void);
-EXTERN int sys_get_outchannels(void);
-
-EXTERN void dsp_add(t_perfroutine f, int n, ...);
-EXTERN void dsp_addv(t_perfroutine f, int n, t_int *vec);
-EXTERN void pd_fft(float *buf, int npoints, int inverse);
-EXTERN int ilog2(int n);
-
-EXTERN void mayer_fht(float *fz, int n);
-EXTERN void mayer_fft(int n, float *real, float *imag);
-EXTERN void mayer_ifft(int n, float *real, float *imag);
-EXTERN void mayer_realfft(int n, float *real);
-EXTERN void mayer_realifft(int n, float *real);
-
-EXTERN float *cos_table;
-#define LOGCOSTABSIZE 9
-#define COSTABSIZE (1<<LOGCOSTABSIZE)
-
-EXTERN int canvas_suspend_dsp(void);
-EXTERN void canvas_resume_dsp(int oldstate);
-EXTERN void canvas_update_dsp(void);
-EXTERN int canvas_dspstate;
-
-/* up/downsampling */
-typedef struct _resample
-{
- int method; /* up/downsampling method ID */
-
- t_int downsample; /* downsampling factor */
- t_int upsample; /* upsampling factor */
-
- t_float *s_vec; /* here we hold the resampled data */
- int s_n;
-
- t_float *coeffs; /* coefficients for filtering... */
- int coefsize;
-
- t_float *buffer; /* buffer for filtering */
- int bufsize;
-} t_resample;
-
-EXTERN void resample_init(t_resample *x);
-EXTERN void resample_free(t_resample *x);
-
-EXTERN void resample_dsp(t_resample *x, t_sample *in, int insize, t_sample *out, int outsize, int method);
-EXTERN void resamplefrom_dsp(t_resample *x, t_sample *in, int insize, int outsize, int method);
-EXTERN void resampleto_dsp(t_resample *x, t_sample *out, int insize, int outsize, int method);
-
-/* ----------------------- utility functions for signals -------------- */
-EXTERN float mtof(float);
-EXTERN float ftom(float);
-EXTERN float rmstodb(float);
-EXTERN float powtodb(float);
-EXTERN float dbtorms(float);
-EXTERN float dbtopow(float);
-
-EXTERN float q8_sqrt(float);
-EXTERN float q8_rsqrt(float);
-#ifndef N32
-EXTERN float qsqrt(float); /* old names kept for extern compatibility */
-EXTERN float qrsqrt(float);
-#endif
-/* --------------------- data --------------------------------- */
-
- /* graphical arrays */
-EXTERN_STRUCT _garray;
-#define t_garray struct _garray
-
-EXTERN t_class *garray_class;
-EXTERN int garray_getfloatarray(t_garray *x, int *size, t_float **vec);
-EXTERN float garray_get(t_garray *x, t_symbol *s, t_int indx);
-EXTERN void garray_redraw(t_garray *x);
-EXTERN int garray_npoints(t_garray *x);
-EXTERN char *garray_vec(t_garray *x);
-EXTERN void garray_resize(t_garray *x, t_floatarg f);
-EXTERN void garray_usedindsp(t_garray *x);
-EXTERN void garray_setsaveit(t_garray *x, int saveit);
-EXTERN t_class *scalar_class;
-
-EXTERN t_float *value_get(t_symbol *s);
-EXTERN void value_release(t_symbol *s);
-EXTERN int value_getfloat(t_symbol *s, t_float *f);
-EXTERN int value_setfloat(t_symbol *s, t_float f);
-
-/* ------- GUI interface - functions to send strings to TK --------- */
-typedef void (*t_guicallbackfn)(t_gobj *client, t_glist *glist);
-
-EXTERN void sys_vgui(char *fmt, ...);
-EXTERN void sys_gui(char *s);
-EXTERN void sys_pretendguibytes(int n);
-EXTERN void sys_queuegui(void *client, t_glist *glist, t_guicallbackfn f);
-EXTERN void sys_unqueuegui(void *client);
- /* dialog window creation and destruction */
-EXTERN void gfxstub_new(t_pd *owner, void *key, const char *cmd);
-EXTERN void gfxstub_deleteforkey(void *key);
-
-extern t_class *glob_pdobject; /* object to send "pd" messages */
-
-/*------------- Max 0.26 compatibility --------------------*/
-
-/* the following reflects the new way classes are laid out, with the class
- pointing to the messlist and not vice versa. Externs shouldn't feel it. */
-typedef t_class *t_externclass;
-
-EXTERN void c_extern(t_externclass *cls, t_newmethod newroutine,
- t_method freeroutine, t_symbol *name, size_t size, int tiny, \
- t_atomtype arg1, ...);
-EXTERN void c_addmess(t_method fn, t_symbol *sel, t_atomtype arg1, ...);
-
-#define t_getbytes getbytes
-#define t_freebytes freebytes
-#define t_resizebytes resizebytes
-#define typedmess pd_typedmess
-#define vmess pd_vmess
-
-/* A definition to help gui objects straddle 0.34-0.35 changes. If this is
-defined, there is a "te_xpix" field in objects, not a "te_xpos" as before: */
-
-#define PD_USE_TE_XPIX
-
-
-#ifdef __i386__
-/* a test for NANs and denormals. Should only be necessary on i386. */
-#define PD_BADFLOAT(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \
- (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000))
-/* more stringent test: anything not between 1e-19 and 1e19 in absolute val */
-#define PD_BIGORSMALL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \
- (((*(unsigned int*)&(f))&0x60000000)==0x60000000))
-#else
-#define PD_BADFLOAT(f) 0
-#define PD_BIGORSMALL(f) 0
-#endif
-
-#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
-}
-#endif
-
-#define __m_pd_h_
-#endif /* __m_pd_h_ */
diff --git a/detoxk/makefile b/detoxk/makefile
deleted file mode 100644
index 6e4c3db..0000000
--- a/detoxk/makefile
+++ /dev/null
@@ -1,92 +0,0 @@
-NAME=detox
-CSYM=detox
-
-current: pd_darwin
-
-# ----------------------- NT -----------------------
-
-pd_nt: $(NAME).dll
-
-.SUFFIXES: .dll
-
-PDNTCFLAGS = /W3 /WX /DNT /DPD /nologo
-VC="C:\Program Files\Microsoft Visual Studio\Vc98"
-
-PDNTINCLUDE = /I. /I..\..\src /I$(VC)\include
-
-PDNTLDIR = $(VC)\lib
-PDNTLIB = $(PDNTLDIR)\libc.lib \
- $(PDNTLDIR)\oldnames.lib \
- $(PDNTLDIR)\kernel32.lib \
- ..\..\bin\pd.lib
-
-.c.dll:
- cl $(PDNTCFLAGS) $(PDNTINCLUDE) /c $*.c
- link /dll /export:$(CSYM)_setup $*.obj $(PDNTLIB)
-
-# ----------------------- IRIX 5.x -----------------------
-
-pd_irix5: $(NAME).pd_irix5
-
-.SUFFIXES: .pd_irix5
-
-SGICFLAGS5 = -o32 -DPD -DUNIX -DIRIX -O2
-
-SGIINCLUDE = -I../../src
-
-.c.pd_irix5:
- $(CC) $(SGICFLAGS5) $(SGIINCLUDE) -o $*.o -c $*.c
- ld -elf -shared -rdata_shared -o $*.pd_irix5 $*.o
- rm $*.o
-
-# ----------------------- IRIX 6.x -----------------------
-
-pd_irix6: $(NAME).pd_irix6
-
-.SUFFIXES: .pd_irix6
-
-SGICFLAGS6 = -n32 -DPD -DUNIX -DIRIX -DN32 -woff 1080,1064,1185 \
- -OPT:roundoff=3 -OPT:IEEE_arithmetic=3 -OPT:cray_ivdep=true \
- -Ofast=ip32
-
-.c.pd_irix6:
- $(CC) $(SGICFLAGS6) $(SGIINCLUDE) -o $*.o -c $*.c
- ld -n32 -IPA -shared -rdata_shared -o $*.pd_irix6 $*.o
- rm $*.o
-
-# ----------------------- LINUX i386 -----------------------
-
-pd_linux: $(NAME).pd_linux
-
-.SUFFIXES: .pd_linux
-
-LINUXCFLAGS = -DPD -O2 -funroll-loops -fomit-frame-pointer -fPIC \
- -Wall -W -Wshadow -Wstrict-prototypes \
- -Wno-unused -Wno-parentheses -Wno-switch $(CFLAGS)
-
-LINUXINCLUDE = -I../../src -I../../../pd/src
-
-.c.pd_linux:
- $(CC) $(LINUXCFLAGS) $(LINUXINCLUDE) -o $*.o -c $*.c
- ld -export_dynamic -shared -o $*.pd_linux $*.o -lc -lm
- strip --strip-unneeded $*.pd_linux
- rm -f $*.o
-
-# ----------------------- Mac OSX -----------------------
-
-pd_darwin: $(NAME).pd_darwin
-
-.SUFFIXES: .pd_darwin
-
-DARWINCFLAGS = -DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \
- -Wno-unused -Wno-parentheses -Wno-switch
-
-.c.pd_darwin:
- $(CC) $(DARWINCFLAGS) $(LINUXINCLUDE) -o $*.o -c $*.c
- $(CC) -bundle -undefined suppress -flat_namespace -o $*.pd_darwin $*.o
- rm -f $*.o
-
-# ----------------------------------------------------------
-
-clean:
- rm -f *.o *.pd_* so_locations
diff --git a/memchr/strchr-help.pd b/memchr/strchr-help.pd
deleted file mode 100644
index 1358e41..0000000
--- a/memchr/strchr-help.pd
+++ /dev/null
@@ -1,22 +0,0 @@
-#N canvas 0 22 458 308 10;
-#X obj 315 16 import jasch_lib;
-#X floatatom 271 85 5 0 0 0 - - -;
-#X obj 147 75 tosymbol;
-#X floatatom 149 213 5 0 0 0 - - -;
-#X msg 272 106 set :;
-#X msg 315 106 set _;
-#X msg 361 106 set !;
-#X msg 148 53 hallo_this:world!;
-#X symbolatom 100 32 20 0 0 0 - - -;
-#X obj 100 11 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X obj 148 156 strchr;
-#X connect 1 0 10 0;
-#X connect 2 0 10 0;
-#X connect 4 0 10 0;
-#X connect 5 0 10 0;
-#X connect 6 0 10 0;
-#X connect 7 0 2 0;
-#X connect 8 0 10 0;
-#X connect 9 0 8 0;
-#X connect 10 0 3 0;
diff --git a/memchr/strchr.c b/memchr/strchr.c
deleted file mode 100644
index ab67f90..0000000
--- a/memchr/strchr.c
+++ /dev/null
@@ -1 +0,0 @@
-/*__________________________________________________________________________ strchr á strchr c-string function Copyright (C) 2003 jan schacher 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 initial build 20030507 ____________________________________________________________________________*/ #include "m_pd.h" #include <string.h> typedef struct strchr { t_object ob; void *s_outlet; char s_tempstring[4096]; } t_strchr; void *strchr_class; void *strchr_new(t_symbol *s, long argc, t_atom *argv); void strchr_free(t_strchr *x); void strchr_anything(t_strchr *x, t_symbol *s, long argc, t_atom *argv); void strchr_set(t_strchr *x, t_symbol *s, long argc, t_atom *argv); void strchr_setup(void) { strchr_class = class_new(gensym("strchr"), (t_newmethod)strchr_new, 0L, sizeof(t_strchr), 0, A_GIMME, 0); class_addsymbol(strchr_class, (t_method)strchr_anything); class_addmethod(strchr_class, (t_method)strchr_set, gensym("set"), A_GIMME, 0); post(". strchr . jasch . "__DATE__"",0); } void *strchr_new(t_symbol *s, long argc, t_atom *argv) { short i; t_strchr *x; x = (t_strchr *)pd_new(strchr_class); x->s_outlet = outlet_new(&x->ob, gensym("float")); strcpy(x->s_tempstring, "/"); for(i=0; i<argc; i++){ switch(argv[i].a_type){ case A_SYMBOL: if(i == 0){ strncpy(x->s_tempstring, argv[0].a_w.w_symbol->s_name, 1); } break; } } return (x); } void strchr_assist(t_strchr *x, void *b, long msg, long arg, char *dst) { if(msg==1) switch(arg){ case 0: strcpy(dst, "string in (symbol)"); break; } else if(msg==2){ strcpy(dst, "matched position (int)"); } } void strchr_anything(t_strchr *x, t_symbol *s, long argc, t_atom *argv) { char *ptr; char local[4096]; long pos; strcpy(local, s->s_name); ptr = strchr(local, (char)x->s_tempstring[0]); if(ptr != NULL){ pos = (long)(ptr-local+1); outlet_float(x->s_outlet, pos); }else{ outlet_float(x->s_outlet, -1); } return; } void strchr_set(t_strchr *x, t_symbol *s, long argc, t_atom *argv) { { switch (argv[0].a_type) { case A_FLOAT: error("strchr: wrong argument type for set");break; case A_SYMBOL: strncpy(x->s_tempstring, argv[0].a_w.w_symbol->s_name, 1); x->s_tempstring[1] = 0; break; } } } void strchr_free(t_strchr *x) { // notify_free((t_object *)x); } \ No newline at end of file
diff --git a/underscore/underscore.c b/underscore/underscore.c
deleted file mode 100644
index c95e6e2..0000000
--- a/underscore/underscore.c
+++ /dev/null
@@ -1 +0,0 @@
-/*__________________________________________________________________________ _ á (underscore) prepend setter Copyright © 2002-2006 jan schacher 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 revision history: 20040303 rebuilt release 20060516 PD-port ____________________________________________________________________________*/ #include "m_pd.h" #define MAXSIZE 1024 #define MIN(a,b) ((a)<(b)?(a):(b)) typedef struct underscore { t_object ob; t_atom p_at[MAXSIZE*2]; int p_headlength, p_bodylength; void *p_outlet; } t_underscore; void *underscore_class; void *underscore_new(t_symbol *s, short ac, t_atom *av); void underscore_bang(t_underscore *x); void underscore_float(t_underscore *x, double f); void underscore_anything(t_underscore *x, t_symbol *s, short ac, t_atom *av); void underscore_set(t_underscore *x, t_symbol *s, short ac, t_atom *av); void underscore_list(t_underscore *x, t_symbol *s, short ac, t_atom *av); void underscore_output(t_underscore *x); t_symbol *ps_bang; t_symbol *ps_set; void __setup(void) { underscore_class = class_new(gensym("_"), (t_newmethod)underscore_new, 0L, sizeof(t_underscore), 0, A_GIMME, 0); class_addbang(underscore_class, (t_method)underscore_bang); class_addfloat(underscore_class, (t_method)underscore_float); class_addmethod(underscore_class, (t_method)underscore_list, gensym("list"), A_GIMME, 0); class_addanything(underscore_class, (t_method)underscore_anything); class_addmethod(underscore_class, (t_method)underscore_set, gensym("set"), A_GIMME, 0); post(". _ . jasch . "__DATE__" ",0); ps_bang = gensym("bang"); ps_set = gensym("set"); } void *underscore_new(t_symbol *s, short ac, t_atom *av) { t_underscore *x; int i; t_atom *at; x = (t_underscore *)pd_new(underscore_class); x->p_outlet = outlet_new(&x->ob,0); at = x->p_at; x->p_headlength = 1; x->p_bodylength = 0; at[0].a_type = A_SYMBOL; at[0].a_w.w_symbol = ps_set; if(ac != 0){ ac = MIN(MAXSIZE, ac); x->p_headlength = ac; for (i=0; i<ac; ++i) *at++ = *av++; } return x; } void underscore_bang(t_underscore *x) { t_atom *at; at = x->p_at; x->p_bodylength = 1; x->p_at[x->p_headlength].a_type = A_SYMBOL; x->p_at[x->p_headlength].a_w.w_symbol = ps_bang; underscore_output(x) ; } void underscore_float(t_underscore *x, double f) { t_atom *at; at = x->p_at; x->p_bodylength = 1; SETFLOAT(at+(x->p_headlength), f); underscore_output(x) ; } void underscore_list(t_underscore *x, t_symbol *s, short ac, t_atom *av) { t_atom *at; int i, temp; ac = MIN(MAXSIZE, ac); x->p_bodylength = ac; // indicates input list length temp = x->p_headlength; at = x->p_at; at = at + temp; ac = MIN(MAXSIZE, ac); for (i=0; i<ac; i++) *at++ = *av++; underscore_output(x) ; } void underscore_anything(t_underscore *x, t_symbol *s, short ac, t_atom *av) { int i, temp; t_atom *at; temp = x->p_headlength; at = x->p_at; ac = MIN(MAXSIZE-1, ac); x->p_bodylength = ac+1; at = x->p_at; at = at + temp+1; x->p_at[temp].a_type = A_SYMBOL; x->p_at[temp].a_w.w_symbol = s; for (i=(temp+1); i<(ac+temp+1); i++) *at++ = *av++; underscore_output(x) ; } void underscore_set(t_underscore *x, t_symbol *s, short ac, t_atom *av) { t_atom *at; int i, temp; at = x->p_at; x->p_headlength = ac; // indicates input list length ac = MIN(MAXSIZE, ac); for (i=0; i<ac; i++) *at++ = *av++; } void underscore_output(t_underscore *x) { t_atom *at; t_atom atoms[MAXSIZE*2]; int i, outlength; t_symbol *s; at = x->p_at; outlength = MIN(MAXSIZE, (x->p_headlength+x->p_bodylength)); if(x->p_at[0].a_type != A_SYMBOL){ outlet_list(x->p_outlet, 0L, outlength, at); }else{ at ++; s = x->p_at[0].a_w.w_symbol; outlet_anything(x->p_outlet, s, outlength-1, at); } } \ No newline at end of file