[PD] get console messages within patch

Mathieu Bouchard matju at artengine.ca
Mon Nov 21 08:07:19 CET 2011


Le 2011-11-20 à 22:23:00, Jonathan Wilkes a écrit :
> ----- Original Message -----
>> From: Mathieu Bouchard <matju at artengine.ca>
>> Le 2011-11-16 à 18:06:00, Jonathan Wilkes a écrit :
>>>>  From: Mathieu Bouchard <matju at artengine.ca>
>>>>    http://artengine.ca/desiredata/gallery/unpost.gif
>>>>  But this external would require a modification to pd that has been 
>> circulating on the net since 2003 and rejected by Miller in 2004.
>>>  What's the modification?  Is it on the tracker?
>> Actually, I don't find it in the bug tracker nor the patch tracker.
>> Don't worry, it's somewhere in SourceForget.
> What's printhook?

It's the feature that redirects the formatted output of [print] and post() 
and error() to a single destination.

[unpost] changes this at runtime while keeping a backup, sends a message, 
and when the call returns, it restores the backup. That's all.

Here's the source code of [unpost] :

-----------------8<--------découpez-ici--------8<-----------------

static t_class *unpost_class;
struct t_unpost : t_object {
         t_outlet *o0,*o1;
};
struct t_unpost_frame {
         t_unpost *self;
         std::ostringstream buf;
};
static t_unpost_frame *current_unpost;

void *unpost_new (t_symbol *s) {
     t_unpost *x = (t_unpost *)pd_new(unpost_class);
     x->o0 = outlet_new(x,&s_symbol);
     x->o1 = outlet_new(x,&s_symbol);
     return x;
}
extern t_printhook sys_printhook;
void unpost_printhook (const char *s) {
     std::ostringstream &b = current_unpost->buf;
     b << s;
     const char *p;
     const char *d=b.str().data(),*dd=d;
     for (;;) {
         p = strchr(d,'\n');
         if (!p) break;
         current_unpost->self->o1->send(gensym2(d,p-d));
         d=p+1;
     }
     if (d!=dd) {
         char *q = strdup(d); /* well i could use memmove, but i'm not supposed to use strcpy because of overlap */
         current_unpost->buf.clear();
         current_unpost->buf << q;
         free(q);
     }
}
void unpost_anything (t_unpost *x, t_symbol *s, int argc, t_atom *argv) {
     t_printhook backup1 = sys_printhook;
     t_unpost_frame *backup2 = current_unpost;
     sys_printhook = unpost_printhook;
     current_unpost = new t_unpost_frame;
     current_unpost->self = x;
     x->o0->send(s,argc,argv);
     sys_printhook = backup1;
     current_unpost = backup2;
}

  ______________________________________________________________________
| Mathieu BOUCHARD ----- téléphone : +1.514.383.3801 ----- Montréal, QC


More information about the Pd-list mailing list