Update of /cvsroot/pure-data/externals/miXed/shared/toxy In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15203/shared/toxy
Modified Files: Makefile.sources scriptlet.c scriptlet.h Added Files: plusbob.c plusbob.h Log Message: many small improvements in toxy, plustot added
--- NEW FILE: plusbob.c --- /* Copyright (c) 2003 krzYszcz and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
#include <string.h> #include "m_pd.h" #include "common/loud.h" #include "plusbob.h"
//#define PLUSBOB_DEBUG
/* LATER let there be a choice of using either fake-symbols, or gpointers. The gpointer layout would be such: gs_un points to a plusbob-like structure (without the bob_tag field), a unique integer code has to be reserved for gs_which, the fields gp_un and gp_valid are ignored. Using bob_refcount instead of gs_refcount is likely to simplify code. */
/* Currently, objects of all +bob types are tagged with the same name: */ static char plustag_name[] = "+bob";
static void plustag_init(t_symbol *tag) { tag->s_name = plustag_name; tag->s_thing = 0; tag->s_next = 0; }
/* silent if caller is empty */ int plustag_isvalid(t_symbol *tag, t_pd *caller) { if (tag->s_name == plustag_name) return (1); else if (caller) { if (strcmp(tag->s_name, plustag_name)) loud_error((caller == PLUSBOB_OWNER ? 0 : caller), "does not understand '%s' (check object connections)", tag->s_name); else loud_error((caller == PLUSBOB_OWNER ? 0 : caller), "confused..."); } return (0); }
/* +bob is an object tossed around, a bobbing object. Currently, this is a wrapping for Tcl_Interp, Tcl_Obj, or a tcl variable, but the +bob interface is abstract enough to be suitable for other types of objects. The t_plusbob is kind of a virtual base. */
struct _plustype { t_plustype *tp_base; /* empty, if directly derived from t_plusbob */ t_symbol *tp_name; size_t tp_size; /* constructor is to be called explicitly, from derived constructors, or from a public wrapper. */ t_plustypefn tp_deletefn; /* destructor */ t_plustypefn tp_preservefn; t_plustypefn tp_releasefn; t_plustypefn tp_attachfn; };
static t_plustype *plustype_default = 0;
t_plustype *plustype_new(t_plustype *base, t_symbol *name, size_t sz, t_plustypefn deletefn, t_plustypefn preservefn, t_plustypefn releasefn, t_plustypefn attachfn) { t_plustype *tp = getbytes(sizeof(*tp)); tp->tp_base = base; tp->tp_name = name; tp->tp_size = sz; tp->tp_deletefn = deletefn; tp->tp_preservefn = preservefn; tp->tp_releasefn = releasefn; tp->tp_attachfn = attachfn; return (tp); }
static void plusbob_doattach(t_plusbob *bob, t_plusbob *parent) { if (bob->bob_parent = parent) { /* become the youngest child: */ bob->bob_prev = 0; if (bob->bob_next = parent->bob_children) { if (parent->bob_children->bob_prev) bug("plusbob_doattach 1"); parent->bob_children->bob_prev = bob; } parent->bob_children = bob; } else bug("plusbob_doattach 2"); }
static void plusbob_dodetach(t_plusbob *bob) { if (bob->bob_parent) { if (bob->bob_prev) { if (bob == bob->bob_parent->bob_children) bug("plusbob_dodetach 1"); bob->bob_prev->bob_next = bob->bob_next; } if (bob->bob_next) bob->bob_next->bob_prev = bob->bob_prev; if (bob == bob->bob_parent->bob_children) bob->bob_parent->bob_children = bob->bob_next; } else bug("plusbob_dodetach 2"); }
/* To be called from derived constructors. Preserving is caller's responsibility. */ t_plusbob *plusbob_create(t_plustype *tp, t_plusbob *parent) { t_plusbob *bob; if (!tp) { if (!plustype_default) plustype_default = plustype_new(0, 0, sizeof(t_plusbob), 0, 0, 0, 0); tp = plustype_default; } if (bob = getbytes(tp->tp_size)) { plustag_init(&bob->bob_tag); bob->bob_type = tp; while (tp->tp_base) tp = tp->tp_base; bob->bob_root = tp; bob->bob_owner = 0; bob->bob_refcount = 0; bob->bob_dorefcount = 1; bob->bob_children = 0; if (parent) plusbob_doattach(bob, parent); else bob->bob_parent = 0; } return (bob); }
/* Should never be called, but from plusbob_release(). Calling from a derived destructor is illegal. */ static void plusbob_free(t_plusbob *bob) { t_plustype *tp; if (bob->bob_parent) plusbob_dodetach(bob); for (tp = bob->bob_type; tp; tp = tp->tp_base) if (tp->tp_deletefn) (*tp->tp_deletefn)(bob); freebytes(bob, (bob->bob_type ? bob->bob_type->tp_size : sizeof(*bob))); }
void plusbob_preserve(t_plusbob *bob) { if (bob->bob_dorefcount) { t_plustype *tp; for (tp = bob->bob_type; tp; tp = tp->tp_base) if (tp->tp_preservefn) (*tp->tp_preservefn)(bob); bob->bob_refcount++; } }
void plusbob_release(t_plusbob *bob) { if (bob->bob_dorefcount) { t_plustype *tp; for (tp = bob->bob_type; tp; tp = tp->tp_base) if (tp->tp_releasefn) (*tp->tp_releasefn)(bob); if (--bob->bob_refcount <= 0) { if (bob->bob_refcount == 0) plusbob_free(bob); else bug("plusbob_release"); } } }
t_plusbob *plusbob_getparent(t_plusbob *bob) { return (bob->bob_parent); }
/* To be called for redirection only. Bobs created as orphans are a special case, and cannot be attached later on. Likewise, changing non-orphan bobs to orphans is illegal. */ void plusbob_attach(t_plusbob *bob, t_plusbob *newparent) { if (bob->bob_parent && newparent) { t_plustype *tp; plusbob_dodetach(bob); plusbob_doattach(bob, newparent); for (tp = bob->bob_type; tp; tp = tp->tp_base) if (tp->tp_attachfn) (*tp->tp_attachfn)(bob); } else if (newparent) bug("plusbob_attach 1"); else bug("plusbob_attach 2"); }
t_plusbob *plusbob_getnext(t_plusbob *bob) { return (bob->bob_next); }
t_plusbob *plusbob_getchildren(t_plusbob *bob) { return (bob->bob_children); }
/* Redirect all bobs to a replacement parent. Assuming replacement exists. */ void plusbob_detachchildren(t_plusbob *bob, t_plusbob *newparent) { while (bob->bob_children) plusbob_attach(bob->bob_children, newparent); }
void plusbob_detachownedchildren(t_plusbob *bob, t_plusbob *newparent, t_pd *owner) { t_plusbob *child = bob->bob_children, *next; while (child) { next = child->bob_next; if (child->bob_owner == owner) plusbob_attach(child, newparent); child = next; } }
void plusbob_setowner(t_plusbob *bob, t_pd *owner) { bob->bob_owner = owner; }
t_pd *plusbob_getowner(t_plusbob *bob) { return (bob->bob_owner); }
void outlet_plusbob(t_outlet *o, t_plusbob *bob) { outlet_symbol(o, (t_symbol *)bob); }
/* silent if caller is empty */ int plustag_validtype(t_symbol *tag, t_symbol *tname, t_pd *caller) { if (tag->s_name == plustag_name) { if (((t_plusbob *)tag)->bob_type->tp_name == tname) return (1); else if (caller) { t_symbol *s = ((t_plusbob *)tag)->bob_type->tp_name; loud_error((caller == PLUSBOB_OWNER ? ((t_plusbob *)tag)->bob_owner : caller), "invalid type '%s' ('%s' expected)", (s ? s->s_name : "<unknown>"), (tname ? tname->s_name : "<unknown>")); } } else if (plustag_isvalid(tag, caller)) /* print the error there */ bug("plustag_validtype"); return (0); }
/* silent if caller is empty */ int plustag_validroot(t_symbol *tag, t_symbol *rname, t_pd *caller) { if (tag->s_name == plustag_name) { if (((t_plusbob *)tag)->bob_root->tp_name == rname) return (1); else if (caller) { t_symbol *s = ((t_plusbob *)tag)->bob_root->tp_name; loud_error((caller == PLUSBOB_OWNER ? ((t_plusbob *)tag)->bob_owner : caller), "invalid base type '%s' ('%s' expected)", (s ? s->s_name : "<unknown>"), (rname ? rname->s_name : "<unknown>")); } } else if (plustag_isvalid(tag, caller)) /* print the error there */ bug("plustag_validroot"); return (0); }
t_symbol *plustag_typename(t_symbol *tag, int validate, t_pd *caller) { if (!validate || tag->s_name == plustag_name) return (((t_plusbob *)tag)->bob_type->tp_name); else if (plustag_isvalid(tag, caller)) /* print the error there */ bug("plustag_typename"); return (0); }
t_symbol *plustag_rootname(t_symbol *tag, int validate, t_pd *caller) { if (!validate || tag->s_name == plustag_name) return (((t_plusbob *)tag)->bob_root->tp_name); else if (plustag_isvalid(tag, caller)) /* print the error there */ bug("plustag_rootname"); return (0); }
/* Plusenv (aka +env) is the base for an `environment' +bob. Environment encapsulates data common for a collection of +bobs. This is the standard way of grouping +bobs, according to a parent/children relationship. */
static t_plustype *plusenv_type = 0; static t_plusbob *plusenv_parent = 0; /* the parent of all environments */
/* To be called from derived constructors (or, LATER, plusenv's provider). */ t_plusenv *plusenv_create(t_plustype *tp, t_plusbob *parent, t_symbol *id) { t_plusenv *env = 0; if (env = (t_plusenv *)plusbob_create(tp, parent)) { if (!id) /* LATER design a public interface for bob_dorefcount */ ((t_plusbob *)env)->bob_dorefcount = 0; env->env_id = id; /* LATER rethink */ } return (env); }
t_plusenv *plusenv_find(t_symbol *id, t_plusenv *defenv) { if (plusenv_parent && id) { t_plusbob *bob; for (bob = plusenv_parent->bob_children; bob; bob = bob->bob_next) if (((t_plusenv *)bob)->env_id == id) break; return ((t_plusenv *)bob); } else return (defenv); }
t_symbol *plusenv_getid(t_plusenv *env) { return (env->env_id); }
/* Type ignored, LATER rethink. */ t_plusbob *plusenv_getparent(t_plustype *tp) { if (!plusenv_parent) plusenv_parent = plusbob_create(0, 0); return (plusenv_parent); }
t_plustype *plusenv_setup(void) { if (!plusenv_type) { plusenv_type = plustype_new(0, gensym("+env"), sizeof(t_plusenv), 0, 0, 0, 0); } return (plusenv_type); }
--- NEW FILE: plusbob.h --- /* Copyright (c) 2003 krzYszcz and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
#ifndef __PLUSBOB_H__ #define __PLUSBOB_H__
EXTERN_STRUCT _plustype; #define t_plustype struct _plustype EXTERN_STRUCT _plusbob; #define t_plusbob struct _plusbob EXTERN_STRUCT _plusenv; #define t_plusenv struct _plusenv
struct _plusbob { t_symbol bob_tag; /* common value for all bob types */ t_plustype *bob_type; /* our type */ t_plustype *bob_root; /* our base type directly derived from t_plusbob */ t_pd *bob_owner; int bob_refcount; int bob_dorefcount; t_plusbob *bob_children; /* empty, unless we are a parent */ /* each bob has exactly one parent, unless being a special, `orphan' case */ t_plusbob *bob_parent; t_plusbob *bob_prev; /* younger brother */ t_plusbob *bob_next; /* older sister */ };
struct _plusenv { t_plusbob env_bob; t_symbol *env_id; /* LATER use local symbol namespace */ };
#define PLUSBOB_OWNER ((t_pd *)-1)
typedef void (*t_plustypefn)(void *);
int plustag_isvalid(t_symbol *s, t_pd *caller);
t_plustype *plustype_new(t_plustype *base, t_symbol *name, size_t sz, t_plustypefn deletefn, t_plustypefn preservefn, t_plustypefn releasefn, t_plustypefn attachfn);
t_plusbob *plusbob_create(t_plustype *tp, t_plusbob *parent); void plusbob_preserve(t_plusbob *bob); void plusbob_release(t_plusbob *bob); t_plusbob *plusbob_getparent(t_plusbob *bob); void plusbob_attach(t_plusbob *bob, t_plusbob *newparent); t_plusbob *plusbob_getnext(t_plusbob *bob); t_plusbob *plusbob_getchildren(t_plusbob *bob); void plusbob_detachchildren(t_plusbob *bob, t_plusbob *newparent); void plusbob_detachownedchildren(t_plusbob *bob, t_plusbob *newparent, t_pd *owner); void plusbob_setowner(t_plusbob *bob, t_pd *owner); t_pd *plusbob_getowner(t_plusbob *bob); void outlet_plusbob(t_outlet *o, t_plusbob *bob); int plustag_validtype(t_symbol *tag, t_symbol *tname, t_pd *caller); int plustag_validroot(t_symbol *tag, t_symbol *rname, t_pd *caller); t_symbol *plustag_typename(t_symbol *tag, int validate, t_pd *caller); t_symbol *plustag_rootname(t_symbol *tag, int validate, t_pd *caller);
t_plusenv *plusenv_create(t_plustype *tp, t_plusbob *parent, t_symbol *id); t_plusenv *plusenv_find(t_symbol *id, t_plusenv *defenv); t_symbol *plusenv_getid(t_plusenv *env); t_plusbob *plusenv_getparent(t_plustype *tp); t_plustype *plusenv_setup(void);
#endif
Index: Makefile.sources =================================================================== RCS file: /cvsroot/pure-data/externals/miXed/shared/toxy/Makefile.sources,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Makefile.sources 24 Sep 2003 10:46:19 -0000 1.1 --- Makefile.sources 19 Feb 2004 22:23:17 -0000 1.2 *************** *** 1,2 **** OTHER_SOURCES = \ ! scriptlet.c --- 1,3 ---- OTHER_SOURCES = \ ! scriptlet.c \ ! plusbob.c
Index: scriptlet.c =================================================================== RCS file: /cvsroot/pure-data/externals/miXed/shared/toxy/scriptlet.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** scriptlet.c 3 Oct 2003 12:08:31 -0000 1.2 --- scriptlet.c 19 Feb 2004 22:23:17 -0000 1.3 *************** *** 29,40 **** struct _scriptlet { ! t_pd *s_owner; ! t_glist *s_glist; /* containing glist (possibly null) */ ! t_symbol *s_rptarget; /* reply target */ ! t_symbol *s_cbtarget; /* callback target */ ! t_symbol *s_item; ! t_scriptlet_cvfn s_cvfn; ! t_canvas *s_cv; ! int s_cvstate; int s_size; char *s_buffer; --- 29,41 ---- struct _scriptlet { ! t_pd *s_owner; ! t_glist *s_glist; /* containing glist (empty allowed) */ ! t_symbol *s_rptarget; /* reply target */ ! t_symbol *s_cbtarget; /* callback target */ ! t_symbol *s_item; ! t_scriptlet_cvfn s_cvfn; /* if empty, passing resolveall is a bug */ ! t_canvas *s_cv; /* as returned by cvfn */ ! int s_cvstate; ! int s_locked; /* append lock, for filtering, when reading from file */ int s_size; char *s_buffer; *************** *** 84,88 **** static int scriptlet_doappend(t_scriptlet *sp, char *buf) { ! if (buf) { int nprefix = sp->s_head - sp->s_buffer; --- 85,89 ---- static int scriptlet_doappend(t_scriptlet *sp, char *buf) { ! if (buf && !sp->s_locked) { int nprefix = sp->s_head - sp->s_buffer; *************** *** 193,197 **** } break; ! case '~': if (resolveall) { --- 194,198 ---- } break; ! case '~': /* FIXME, the dot-tilde stuff is purely experimental. */ if (resolveall) { *************** *** 199,228 **** if (cv = scriptlet_canvasvalidate(sp, visedonly)) { ! /* FIXME */ ! if (!strcmp(&ibuf[1], "x1")) { sprintf(obuf, "%d", cv->gl_screenx1); len = 3; } ! else if (!strcmp(&ibuf[1], "x2")) { sprintf(obuf, "%d", cv->gl_screenx2); len = 3; } ! else if (!strcmp(&ibuf[1], "y1")) { sprintf(obuf, "%d", cv->gl_screeny1); len = 3; } ! else if (!strcmp(&ibuf[1], "y2")) { sprintf(obuf, "%d", cv->gl_screeny2); len = 3; } ! else if (!strcmp(&ibuf[1], "edit")) { sprintf(obuf, "%d", cv->gl_edit); len = 5; } else loud_error(sp->s_owner, "bad field '%s'", &ibuf[1]); } --- 200,259 ---- if (cv = scriptlet_canvasvalidate(sp, visedonly)) { ! if (!strncmp(&ibuf[1], "tag", 3)) ! { ! t_rtext *rt; ! if (cv->gl_owner && glist_isvisible(cv->gl_owner) && ! cv->gl_owner->gl_editor && ! (rt = glist_findrtext(cv->gl_owner, (t_object *)cv))) ! sprintf(obuf, "%s", rtext_gettag(rt)); ! else ! obuf[0] = 0; ! len = 4; ! } ! else if (!strncmp(&ibuf[1], "owner", 5)) ! { ! if (cv->gl_owner && glist_isvisible(cv->gl_owner)) ! sprintf(obuf, ".x%x", (int)cv->gl_owner); ! else ! obuf[0] = 0; ! len = 6; ! } ! else if (!strncmp(&ibuf[1], "root", 4)) ! { ! sprintf(obuf, ".x%x", (int)canvas_getrootfor(cv)); ! len = 5; ! } ! /* LATER find out when gl_<coords> are updated, ! think how to better sync them to Tk. */ ! else if (!strncmp(&ibuf[1], "x1", 2)) { sprintf(obuf, "%d", cv->gl_screenx1); len = 3; } ! else if (!strncmp(&ibuf[1], "x2", 2)) { sprintf(obuf, "%d", cv->gl_screenx2); len = 3; } ! else if (!strncmp(&ibuf[1], "y1", 2)) { sprintf(obuf, "%d", cv->gl_screeny1); len = 3; } ! else if (!strncmp(&ibuf[1], "y2", 2)) { sprintf(obuf, "%d", cv->gl_screeny2); len = 3; } ! else if (!strncmp(&ibuf[1], "edit", 4)) { sprintf(obuf, "%d", cv->gl_edit); len = 5; } + else if (!strncmp(&ibuf[1], "gop", 3)) + { + sprintf(obuf, "%d", glist_isgraph(cv)); + len = 4; + } else loud_error(sp->s_owner, "bad field '%s'", &ibuf[1]); } *************** *** 250,266 **** if (ibuf[1] == ':') { ! sprintf(obuf, "{::toxy::callback "); len = 2; } else if (ibuf[1] == '|') { ! sprintf(obuf, "{::toxy::callback %s ", ! sp->s_rptarget->s_name); len = 2; } else { ! sprintf(obuf, "{::toxy::callback %s _cb ", ! sp->s_cbtarget->s_name); len = 1; } --- 281,295 ---- if (ibuf[1] == ':') { ! sprintf(obuf, "{pd [concat "); len = 2; } else if (ibuf[1] == '|') { ! sprintf(obuf, "{pd [concat %s ", sp->s_rptarget->s_name); len = 2; } else { ! sprintf(obuf, "{pd [concat %s _cb ", sp->s_cbtarget->s_name); len = 1; } *************** *** 270,274 **** if (resolveall) { ! sprintf(obuf, "}"); len = 1; } --- 299,303 ---- if (resolveall) { ! sprintf(obuf, "\;]}"); len = 1; } *************** *** 286,289 **** --- 315,319 ---- { sp->s_cvstate = SCRIPTLET_CVUNKNOWN; + sp->s_locked = 0; sp->s_separator = 0; strcpy(sp->s_buffer, "namespace eval ::toxy {\ *************** *** 401,405 **** }
! /* Non-expanding -- LATER think if this is likely to cause any confusion. Especially, consider the widget_vis() vs. widget_update() case. */ void scriptlet_vpush(t_scriptlet *sp, char *varname) --- 431,435 ---- }
! /* Non-substituting -- LATER think if this is likely to cause any confusion. Especially, consider the widget_vis() vs. widget_update() case. */ void scriptlet_vpush(t_scriptlet *sp, char *varname) *************** *** 497,547 **** }
! static int scriptlet_doread(t_scriptlet *sp, FILE *fp, char *rc, ! t_scriptlet_cmntfn cmntfn) { t_scriptlet *outsp = sp, *newsp; char buf[MAXPDSTRING]; ! scriptlet_reset(outsp); ! while (!feof(fp)) { ! if (fgets(buf, MAXPDSTRING - 1, fp)) { ! char *ptr = buf; ! while (*ptr == ' ' || *ptr == '\t') ptr++; ! if (*ptr == '#') { ! if (cmntfn) { ! char sel = *++ptr; ! if (sel && sel != '\n') { ! ptr++; ! while (*ptr == ' ' || *ptr == '\t') ptr++; ! if (*ptr == '\n') ! *ptr = 0; ! if (*ptr) ! { ! char *ep = ptr + strlen(ptr) - 1; ! while (*ep == ' ' || *ep == '\t' || *ep == '\n') ! ep--; ! ep[1] = 0; ! } ! newsp = cmntfn(sp->s_owner, rc, sel, ptr); ! if (newsp && newsp != outsp) ! scriptlet_reset(outsp = newsp); } } } - else if (*ptr && *ptr != '\n') - scriptlet_doappend(outsp, buf); } ! else break; } return (SCRIPTLET_OK); }
! int scriptlet_rcload(t_scriptlet *sp, char *rc, char *ext, ! t_scriptlet_cmntfn cmntfn) { char filename[MAXPDSTRING], buf[MAXPDSTRING], *nameptr, *dir; int fd; --- 527,610 ---- }
! static int scriptlet_doread(t_scriptlet *sp, t_pd *caller, FILE *fp, ! char *rc, char *builtin, t_scriptlet_cmntfn cmntfn) { t_scriptlet *outsp = sp, *newsp; char buf[MAXPDSTRING]; ! if (!caller) caller = sp->s_owner; ! while ((fp && !feof(fp) && fgets(buf, MAXPDSTRING - 1, fp)) ! || builtin) { ! char *ptr; ! if (builtin) { ! int i; ! for (i = 0, ptr = buf; i < MAXPDSTRING - 1; i++, ptr++) { ! if ((*ptr = (*builtin ? *builtin : '\n')) == '\n') { ! ptr[1] = 0; ! if (*builtin) builtin++; ! if (!*builtin) builtin = 0; ! break; ! } ! else builtin++; ! } ! } ! ptr = buf; ! while (*ptr == ' ' || *ptr == '\t') ptr++; ! if (*ptr == '#') ! { ! if (cmntfn) ! { ! char sel = *++ptr; ! if (sel && sel != '\n') ! { ! ptr++; ! while (*ptr == ' ' || *ptr == '\t') ptr++; ! if (*ptr == '\n') ! *ptr = 0; ! if (*ptr) { ! char *ep = ptr + strlen(ptr) - 1; ! while (*ep == ' ' || *ep == '\t' || *ep == '\n') ! ep--; ! ep[1] = 0; ! } ! newsp = cmntfn(caller, rc, sel, ptr); ! if (newsp == SCRIPTLET_UNLOCK) ! outsp->s_locked = 0; ! else if (newsp == SCRIPTLET_LOCK) ! outsp->s_locked = 1; ! else if (newsp != outsp) ! { ! outsp->s_locked = 0; ! scriptlet_reset(outsp = newsp); } } } } ! else if (*ptr && *ptr != '\n') ! scriptlet_doappend(outsp, buf); } + outsp->s_locked = 0; return (SCRIPTLET_OK); }
! /* Load particular section(s) from buffer (skip up to an unlocking comment, ! keep appending up to a locking comment, repeat). */ ! int scriptlet_rcparse(t_scriptlet *sp, t_pd *caller, char *rc, char *contents, ! t_scriptlet_cmntfn cmntfn) ! { ! int result; ! sp->s_locked = 1; /* see scriptlet_doread() above for unlocking scheme */ ! result = scriptlet_doread(sp, caller, 0, rc, contents, cmntfn); ! return (result); ! } ! ! int scriptlet_rcload(t_scriptlet *sp, t_pd *caller, char *rc, char *ext, ! char *builtin, t_scriptlet_cmntfn cmntfn) { + int result; char filename[MAXPDSTRING], buf[MAXPDSTRING], *nameptr, *dir; int fd; *************** *** 552,556 **** if ((fd = open_via_path(dir, rc, ext, buf, &nameptr, MAXPDSTRING, 0)) < 0) { ! return (SCRIPTLET_NOFILE); } else --- 615,619 ---- if ((fd = open_via_path(dir, rc, ext, buf, &nameptr, MAXPDSTRING, 0)) < 0) { ! result = SCRIPTLET_NOFILE; } else *************** *** 558,581 **** FILE *fp; close(fd); ! strcpy(filename, buf); ! strcat(filename, "/"); ! strcat(filename, nameptr); ! sys_bashfilename(filename, filename); if (fp = fopen(filename, "r")) { ! int result = scriptlet_doread(sp, fp, rc, cmntfn); fclose(fp); - return (result); } else { bug("scriptlet_rcload"); ! return (SCRIPTLET_NOFILE); } } }
int scriptlet_read(t_scriptlet *sp, t_symbol *fn) { FILE *fp; char buf[MAXPDSTRING]; --- 621,653 ---- FILE *fp; close(fd); ! if (nameptr != buf) ! { ! strcpy(filename, buf); ! strcat(filename, "/"); ! strcat(filename, nameptr); ! sys_bashfilename(filename, filename); ! } ! else sys_bashfilename(nameptr, filename); if (fp = fopen(filename, "r")) { ! result = scriptlet_doread(sp, caller, fp, rc, 0, cmntfn); fclose(fp); } else { bug("scriptlet_rcload"); ! result = SCRIPTLET_NOFILE; } } + if (result != SCRIPTLET_OK) + { + scriptlet_doread(sp, caller, 0, rc, builtin, cmntfn); + } + return (result); }
int scriptlet_read(t_scriptlet *sp, t_symbol *fn) { + int result; FILE *fp; char buf[MAXPDSTRING]; *************** *** 588,600 **** if (fp = fopen(buf, "r")) { ! int result = scriptlet_doread(sp, fp, 0, 0); fclose(fp); - return (result); } else { loud_error(sp->s_owner, "error while loading file "%s"", fn->s_name); ! return (SCRIPTLET_NOFILE); } }
--- 660,673 ---- if (fp = fopen(buf, "r")) { ! scriptlet_reset(sp); ! result = scriptlet_doread(sp, 0, fp, 0, 0, 0); fclose(fp); } else { loud_error(sp->s_owner, "error while loading file "%s"", fn->s_name); ! result = SCRIPTLET_NOFILE; } + return (result); }
*************** *** 641,649 **** }
void scriptlet_clone(t_scriptlet *to, t_scriptlet *from) { scriptlet_reset(to); to->s_separator = ' '; ! /* LATER use from's buffer with refcount */ scriptlet_doappend(to, from->s_head); } --- 714,733 ---- }
+ void scriptlet_setowner(t_scriptlet *sp, t_pd *owner) + { + sp->s_owner = owner; + } + void scriptlet_clone(t_scriptlet *to, t_scriptlet *from) { scriptlet_reset(to); to->s_separator = ' '; ! /* LATER add a flag to optionally use from's buffer with refcount */ ! scriptlet_doappend(to, from->s_head); ! } ! ! void scriptlet_append(t_scriptlet *to, t_scriptlet *from) ! { ! to->s_separator = ' '; scriptlet_doappend(to, from->s_head); } *************** *** 659,664 **** }
t_scriptlet *scriptlet_new(t_pd *owner, t_symbol *rptarget, t_symbol *cbtarget, ! t_symbol *item, t_scriptlet_cvfn cvfn) { t_scriptlet *sp = getbytes(sizeof(*sp)); --- 743,751 ---- }
+ /* The parameter 'gl' (null accepted) is necessary, because the 's_glist' + field, if implicitly set, would be dangerous (after a glist is gone) + and confusing (current directory used for i/o of a global scriptlet). */ t_scriptlet *scriptlet_new(t_pd *owner, t_symbol *rptarget, t_symbol *cbtarget, ! t_symbol *item, t_glist *gl, t_scriptlet_cvfn cvfn) { t_scriptlet *sp = getbytes(sizeof(*sp)); *************** *** 668,677 **** if (!configured) { - sys_gui("namespace eval ::toxy {\ - proc callback {args} {pd $args \;}}\n"); sys_gui("image create bitmap ::toxy::img::empty -data {}\n"); } sp->s_owner = owner; ! sp->s_glist = canvas_getcurrent(); sp->s_rptarget = rptarget; sp->s_cbtarget = cbtarget; --- 755,762 ---- if (!configured) { sys_gui("image create bitmap ::toxy::img::empty -data {}\n"); } sp->s_owner = owner; ! sp->s_glist = gl; sp->s_rptarget = rptarget; sp->s_cbtarget = cbtarget;
Index: scriptlet.h =================================================================== RCS file: /cvsroot/pure-data/externals/miXed/shared/toxy/scriptlet.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** scriptlet.h 3 Oct 2003 12:08:32 -0000 1.2 --- scriptlet.h 19 Feb 2004 22:23:17 -0000 1.3 *************** *** 8,11 **** --- 8,13 ---- enum { SCRIPTLET_OK = 0, SCRIPTLET_NOFILE, SCRIPTLET_BADFILE, SCRIPTLET_IGNORED }; + #define SCRIPTLET_UNLOCK ((t_scriptlet *)0) + #define SCRIPTLET_LOCK ((t_scriptlet *)1)
EXTERN_STRUCT _scriptlet; *************** *** 31,44 **** int visedonly, int ac, t_atom *av, t_props *argprops); char *scriptlet_nextword(char *buf); ! int scriptlet_rcload(t_scriptlet *sp, char *rc, char *ext, ! t_scriptlet_cmntfn cmntfn); int scriptlet_read(t_scriptlet *sp, t_symbol *fn); int scriptlet_write(t_scriptlet *sp, t_symbol *fn); char *scriptlet_getcontents(t_scriptlet *sp, int *lenp); char *scriptlet_getbuffer(t_scriptlet *sp, int *sizep); void scriptlet_clone(t_scriptlet *to, t_scriptlet *from); void scriptlet_free(t_scriptlet *sp); t_scriptlet *scriptlet_new(t_pd *owner, t_symbol *rptarget, t_symbol *cbtarget, ! t_symbol *item, t_scriptlet_cvfn cvfn);
#endif --- 33,50 ---- int visedonly, int ac, t_atom *av, t_props *argprops); char *scriptlet_nextword(char *buf); ! int scriptlet_rcparse(t_scriptlet *sp, t_pd *caller, char *rc, char *contents, ! t_scriptlet_cmntfn cmntfn); ! int scriptlet_rcload(t_scriptlet *sp, t_pd *caller, char *rc, char *ext, ! char *builtin, t_scriptlet_cmntfn cmntfn); int scriptlet_read(t_scriptlet *sp, t_symbol *fn); int scriptlet_write(t_scriptlet *sp, t_symbol *fn); char *scriptlet_getcontents(t_scriptlet *sp, int *lenp); char *scriptlet_getbuffer(t_scriptlet *sp, int *sizep); + void scriptlet_setowner(t_scriptlet *sp, t_pd *owner); void scriptlet_clone(t_scriptlet *to, t_scriptlet *from); + void scriptlet_append(t_scriptlet *to, t_scriptlet *from); void scriptlet_free(t_scriptlet *sp); t_scriptlet *scriptlet_new(t_pd *owner, t_symbol *rptarget, t_symbol *cbtarget, ! t_symbol *item, t_glist *gl, t_scriptlet_cvfn cvfn);
#endif