Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10524/src
Modified Files: Tag: devel_0_38 x_gui.c Log Message: avoid "audio dialog too long" bug by dynamic reservation (only if really necessary)
Index: x_gui.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/x_gui.c,v retrieving revision 1.3 retrieving revision 1.3.4.1 diff -C2 -d -r1.3 -r1.3.4.1 *** x_gui.c 6 Sep 2004 20:20:36 -0000 1.3 --- x_gui.c 11 May 2005 20:07:00 -0000 1.3.4.1 *************** *** 45,61 **** void gfxstub_new(t_pd *owner, void *key, const char *cmd) { ! char buf[MAXPDSTRING]; char namebuf[80]; t_gfxstub *x; t_symbol *s; /* if any exists with matching key, burn it. */ for (x = gfxstub_list; x; x = x->x_next) if (x->x_key == key) gfxstub_deleteforkey(key); ! if (strlen(cmd) + 50 > MAXPDSTRING) ! { ! bug("audio dialog too long"); ! return; ! } x = (t_gfxstub *)pd_new(gfxstub_class); sprintf(namebuf, ".gfxstub%lx", (t_int)x); --- 45,67 ---- void gfxstub_new(t_pd *owner, void *key, const char *cmd) { ! char stbuf[MAXPDSTRING]; ! char *buf; char namebuf[80]; t_gfxstub *x; t_symbol *s; + int len = strlen(cmd) + 50; + /* if any exists with matching key, burn it. */ for (x = gfxstub_list; x; x = x->x_next) if (x->x_key == key) gfxstub_deleteforkey(key); ! ! /* TG - if necessary reserve a larger buffer */ ! /* gcc could also dynamically reserve on the stack... keep this for later */ ! if(len > MAXPDSTRING) ! buf = getbytes(len); ! else ! buf = stbuf; ! x = (t_gfxstub *)pd_new(gfxstub_class); sprintf(namebuf, ".gfxstub%lx", (t_int)x); *************** *** 70,73 **** --- 76,82 ---- sprintf(buf, cmd, s->s_name); sys_gui(buf); + + if(buf != stbuf) + freebytes(buf,len); }