Update of /cvsroot/pure-data/externals/miXed/shared/common
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1117/shared/common
Modified Files:
loud.c loud.h props.c props.h
Log Message:
cyclone alpha54 and toxy alpha16 (see notes.txt for cyclone, toxy and shared)
Index: loud.h
===================================================================
RCS file: /cvsroot/pure-data/externals/miXed/shared/common/loud.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** loud.h 11 Jan 2005 10:33:21 -0000 1.5
--- loud.h 12 Mar 2005 00:19:10 -0000 1.6
***************
*** 46,49 ****
--- 46,50 ----
void loudbug_post(char *fmt, ...);
void loudbug_startpost(char *fmt, ...);
+ void loudbug_stringpost(char *s);
void loudbug_endpost(void);
void loudbug_postatom(int ac, t_atom *av);
Index: loud.c
===================================================================
RCS file: /cvsroot/pure-data/externals/miXed/shared/common/loud.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** loud.c 27 Jan 2005 14:42:53 -0000 1.6
--- loud.c 12 Mar 2005 00:19:10 -0000 1.7
***************
*** 367,370 ****
--- 367,378 ----
}
+ void loudbug_stringpost(char *s)
+ {
+ fputs(s, stderr);
+ #ifdef MSW
+ fflush(stderr);
+ #endif
+ }
+
void loudbug_endpost(void)
{
Index: props.c
===================================================================
RCS file: /cvsroot/pure-data/externals/miXed/shared/common/props.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** props.c 11 Jan 2005 10:33:21 -0000 1.4
--- props.c 12 Mar 2005 00:19:10 -0000 1.5
***************
*** 1,3 ****
! /* 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. */
--- 1,3 ----
! /* Copyright (c) 2003-2005 krzYszcz and others.
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
***************
*** 5,8 ****
--- 5,9 ----
#include <string.h>
#include "m_pd.h"
+ #include "common/loud.h"
#include "common/grow.h"
#include "props.h"
***************
*** 13,19 ****
#define PROPS_INISIZE 32 /* LATER rethink */
! #define PROPS_MAXOTHERS 32
! enum { PROPS_NONE = 0, PROPS_THIS, PROPS_OTHER };
enum { PROPS_SINGLEMODE = 0, PROPS_MULTIMODE };
--- 14,23 ----
#define PROPS_INISIZE 32 /* LATER rethink */
! #define PROPS_MAXMIXUPS 32
! /* return values of props_iskey() */
! enum { PROPS_NONE = 0, PROPS_THIS, PROPS_MIXUP };
!
! /* 'mode' argument values of props_iskey() and props_update() */
enum { PROPS_SINGLEMODE = 0, PROPS_MULTIMODE };
***************
*** 30,37 ****
char *p_thisinitial;
char *p_name;
! int p_size; /* as allocated */
! int p_natoms; /* as used */
t_atom *p_buffer;
t_atom p_bufini[PROPS_INISIZE];
t_pd *p_owner;
t_propsresolver p_resolver;
--- 34,42 ----
char *p_thisinitial;
char *p_name;
! int p_size; /* as allocated */
! int p_natoms; /* as used */
t_atom *p_buffer;
t_atom p_bufini[PROPS_INISIZE];
+ int p_nextindex;
t_pd *p_owner;
t_propsresolver p_resolver;
***************
*** 39,44 ****
t_propelem *p_nextelem;
int p_badupdate;
! char p_otherescapes[PROPS_MAXOTHERS];
! t_props *p_otherprops; /* props list's head */
t_props *p_next;
};
--- 44,49 ----
t_propelem *p_nextelem;
int p_badupdate;
! char p_mixupescapes[PROPS_MAXMIXUPS];
! t_props *p_firstmixup; /* points to the props list's head */
t_props *p_next;
};
***************
*** 113,119 ****
}
! static char *props_otherinitial(t_props *pp, char c)
{
! t_props *pp1 = pp->p_otherprops;
while (pp1)
{
--- 118,222 ----
}
! /* API calls for lookup (getvalue) and traversal (firstvalue, nextvalue), and
! non-api calls (removevalue) of resolved properties. Only dictionary-enabled
! properties handle these calls. Plain 'key', without escape, is expected.
! Traversal is not thread-safe (will we need threaded props, LATER?) */
!
! char *props_getvalue(t_props *pp, char *key)
{
! if (pp->p_resolver)
! {
! t_propelem *ep = pp->p_dict;
! while (ep)
! {
! if (strcmp(ep->e_key, key))
! ep = ep->e_next;
! else
! return (ep->e_value);
! }
! }
! return (0);
! }
!
! char *props_nextvalue(t_props *pp, char **keyp)
! {
! if (pp->p_nextelem)
! {
! char *value = pp->p_nextelem->e_value;
! *keyp = pp->p_nextelem->e_key;
! pp->p_nextelem = pp->p_nextelem->e_next;
! return (value);
! }
! return (0);
! }
!
! char *props_firstvalue(t_props *pp, char **keyp)
! {
! if (pp->p_nextelem)
! loudbug_bug("props_firstvalue");
! if (pp->p_resolver)
! pp->p_nextelem = pp->p_dict;
! return (props_nextvalue(pp, keyp));
! }
!
! static void props_removevalue(t_props *pp, char *key)
! {
! if (pp->p_resolver && *key)
! {
! t_propelem *ep = pp->p_dict, *epp = 0;
! while (ep)
! {
! if (strcmp(ep->e_key, key))
! {
! epp = ep;
! ep = ep->e_next;
! }
! else
! {
! if (epp)
! epp->e_next = ep->e_next;
! else
! pp->p_dict = ep->e_next;
! propelem_free(ep);
! break;
! }
! }
! }
! }
!
! void props_clearvalues(t_props *pp)
! {
! while (pp->p_dict)
! {
! t_propelem *ep = pp->p_dict->e_next;
! propelem_free(pp->p_dict);
! pp->p_dict = ep;
! }
! }
!
! /* LATER think about 'deep' cloning, i.e. propagating source atoms into
! the destination buffer. Since cloning, unless requested by the user,
! should never be persistent (source atoms should not stick to the
! destination object in a .pd file), deep cloning requires introducing
! a two-buffer scheme. There is no reason for deep cloning of arguments,
! or handlers, but options could benefit. */
!
! void props_clonevalues(t_props *to, t_props *from)
! {
! if (to->p_resolver)
! {
! int ac;
! t_atom *ap = props_getfirst(from, &ac);
! while (ap)
! {
! props_dictadd(to, ap->a_w.w_symbol, ac - 1, ap + 1);
! ap = props_getnext(from, &ac);
! }
! }
! }
!
! static char *props_mixupinitial(t_props *pp, char c)
! {
! t_props *pp1 = pp->p_firstmixup;
while (pp1)
{
***************
*** 122,133 ****
pp1 = pp1->p_next;
}
! bug("props_otherinitial");
! post("(%c \"%s\")", c, pp->p_otherescapes);
return (0);
}
! static int props_atstart(t_props *pp, int mode, char *buf)
{
! char *otherinitial;
if (*buf == pp->p_thisescape)
{
--- 225,239 ----
pp1 = pp1->p_next;
}
! loudbug_bug("props_mixupinitial");
! loudbug_post("(%c \"%s\")", c, pp->p_mixupescapes);
return (0);
}
! /* If buf is pp's key, returns PROPS_THIS; otherwise, if PROPS_MULTIMODE
! was passed and buf is a key of one of pp's mixups, returns PROPS_MIXUP;
! otherwise, returns PROPS_NONE. */
! static int props_iskey(t_props *pp, int mode, char *buf)
{
! char *mixupinitial;
if (*buf == pp->p_thisescape)
{
***************
*** 138,162 ****
}
else if (mode == PROPS_MULTIMODE &&
! *pp->p_otherescapes && strchr(pp->p_otherescapes, *buf))
{
char c = buf[1];
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')
! || ((otherinitial = props_otherinitial(pp, *buf))
! && *otherinitial && strchr(otherinitial, c)))
! return (PROPS_OTHER);
}
return (PROPS_NONE);
}
/* Search for a property, replace its value if found, otherwise add.
! Assuming s is valid. Returning nafter - nbefore. */
! static int props_update(t_props *pp, int mode,
! t_symbol *s, int ac, t_atom *av, int doit)
{
int nadd, ndiff, ibeg, iend = 0;
t_atom *ap;
for (nadd = 0, ap = av; nadd < ac; nadd++, ap++)
! if (ap->a_type == A_SYMBOL
! && props_atstart(pp, mode, ap->a_w.w_symbol->s_name))
break;
if (!nadd)
--- 244,354 ----
}
else if (mode == PROPS_MULTIMODE &&
! *pp->p_mixupescapes && strchr(pp->p_mixupescapes, *buf))
{
char c = buf[1];
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')
! || ((mixupinitial = props_mixupinitial(pp, *buf))
! && *mixupinitial && strchr(mixupinitial, c)))
! return (PROPS_MIXUP);
}
return (PROPS_NONE);
}
+ /* Lookup (getone) and traversal (getfirst, getnext) of unresolved properties.
+ These calls return a pointer to the key atom (the contents follows it),
+ unlike the get/first/nextvalue calls, which return the (resolved) value.
+ Traversal is not thread-safe (will we need threaded props, LATER?) */
+
+ t_atom *props_getone(t_props *pp, t_symbol *keysym, int *npp)
+ {
+ if (keysym &&
+ props_iskey(pp, PROPS_SINGLEMODE, keysym->s_name) != PROPS_NONE)
+ {
+ int ibeg, iend = 0;
+ t_atom *ap;
+ for (ibeg = 0, ap = pp->p_buffer; ibeg < pp->p_natoms; ibeg++, ap++)
+ {
+ if (ap->a_type == A_SYMBOL && ap->a_w.w_symbol == keysym)
+ {
+ for (iend = ibeg + 1, ap++; iend < pp->p_natoms; iend++, ap++)
+ if (ap->a_type == A_SYMBOL &&
+ props_iskey(pp, PROPS_SINGLEMODE,
+ ap->a_w.w_symbol->s_name) != PROPS_NONE)
+ break;
+ break;
+ }
+ }
+ if (iend > ibeg)
+ {
+ *npp = iend - ibeg;
+ return (pp->p_buffer + ibeg);
+ }
+ }
+ *npp = 0;
+ return (0);
+ }
+
+ t_atom *props_getnext(t_props *pp, int *npp)
+ {
+ if (pp->p_nextindex >= 0)
+ {
+ int ibeg = pp->p_nextindex;
+ t_atom *ap;
+ for (ap = pp->p_buffer + ibeg; ibeg < pp->p_natoms; ibeg++, ap++)
+ if (ap->a_type == A_SYMBOL &&
+ props_iskey(pp, PROPS_SINGLEMODE,
+ ap->a_w.w_symbol->s_name) != PROPS_NONE)
+ break;
+ if (ibeg < pp->p_natoms)
+ {
+ int iend;
+ for (iend = ibeg + 1, ap++; iend < pp->p_natoms; iend++, ap++)
+ if (ap->a_type == A_SYMBOL &&
+ props_iskey(pp, PROPS_SINGLEMODE,
+ ap->a_w.w_symbol->s_name) != PROPS_NONE)
+ break;
+ if (iend < pp->p_natoms)
+ pp->p_nextindex = iend;
+ else
+ pp->p_nextindex = -1;
+ *npp = iend - ibeg;
+ return (pp->p_buffer + ibeg);
+ }
+ else pp->p_nextindex = -1;
+ }
+ *npp = 0;
+ return (0);
+ }
+
+ t_atom *props_getfirst(t_props *pp, int *npp)
+ {
+ if (pp->p_nextindex >= 0)
+ loudbug_bug("props_getfirst");
+ pp->p_nextindex = 0;
+ return (props_getnext(pp, npp));
+ }
+
+ t_atom *props_getall(t_props *pp, int *npp)
+ {
+ *npp = pp->p_natoms;
+ return (pp->p_buffer);
+ }
+
+ char *props_getname(t_props *pp)
+ {
+ return (pp ? pp->p_name : "property");
+ }
+
/* Search for a property, replace its value if found, otherwise add.
! If 'filter' contains an exact copy, do nothing. Assuming 'keysym'
! is valid. Returning nafter - nbefore. */
! static int props_update(t_props *pp, int mode, t_props *filter,
! t_symbol *keysym, int ac, t_atom *av, int doit)
{
int nadd, ndiff, ibeg, iend = 0;
t_atom *ap;
for (nadd = 0, ap = av; nadd < ac; nadd++, ap++)
! if (ap->a_type == A_SYMBOL &&
! props_iskey(pp, mode, ap->a_w.w_symbol->s_name) != PROPS_NONE)
break;
if (!nadd)
***************
*** 167,178 ****
pp->p_badupdate = 0;
nadd++;
for (ibeg = 0, ap = pp->p_buffer; ibeg < pp->p_natoms; ibeg++, ap++)
{
! if (ap->a_type == A_SYMBOL && ap->a_w.w_symbol == s)
{
for (iend = ibeg + 1, ap++; iend < pp->p_natoms; iend++, ap++)
! if (ap->a_type == A_SYMBOL
! && props_atstart(pp, PROPS_SINGLEMODE,
! ap->a_w.w_symbol->s_name))
break;
break;
--- 359,399 ----
pp->p_badupdate = 0;
nadd++;
+
+ if (filter)
+ {
+ int acf;
+ t_atom *apf = props_getone(filter, keysym, &acf);
+ if (acf == nadd)
+ {
+ int i;
+ #ifdef PROPS_DEBUG
+ loudbug_startpost("checking %s", keysym->s_name);
+ loudbug_postatom(nadd - 1, av);
+ #endif
+ for (i = 1, ap = av, apf++; i < nadd; i++, ap++, apf++)
+ if (ap->a_type != apf->a_type ||
+ ap->a_w.w_symbol != apf->a_w.w_symbol)
+ break;
+ if (i == nadd)
+ #ifndef PROPS_DEBUG
+ return (0);
+ #else
+ {
+ loudbug_post(" ... filtered");
+ return (0);
+ }
+ else loudbug_post(" ... updated");
+ #endif
+ }
+ }
+
for (ibeg = 0, ap = pp->p_buffer; ibeg < pp->p_natoms; ibeg++, ap++)
{
! if (ap->a_type == A_SYMBOL && ap->a_w.w_symbol == keysym)
{
for (iend = ibeg + 1, ap++; iend < pp->p_natoms; iend++, ap++)
! if (ap->a_type == A_SYMBOL &&
! props_iskey(pp, PROPS_SINGLEMODE,
! ap->a_w.w_symbol->s_name) != PROPS_NONE)
break;
break;
***************
*** 185,195 ****
if (newnatoms > pp->p_size)
{
! bug("props_update");
return (0);
}
#ifdef PROPS_DEBUG
! post("%s %s, [%d..%d), ndiff %d",
! (iend > ibeg ? "replacing" : "adding"), s->s_name,
! ibeg, iend, ndiff);
#endif
if (iend > ibeg)
--- 406,416 ----
if (newnatoms > pp->p_size)
{
! loudbug_bug("props_update");
return (0);
}
#ifdef PROPS_DEBUG
! loudbug_post("%s %s, [%d..%d), ndiff %d",
! (iend > ibeg ? "replacing" : "adding"), keysym->s_name,
! ibeg, iend, ndiff);
#endif
if (iend > ibeg)
***************
*** 212,220 ****
{
ap = pp->p_buffer + pp->p_natoms;
! SETSYMBOL(ap, s);
}
ap++;
nadd--;
! if (pp->p_resolver) props_dictadd(pp, s, nadd, av);
for (i = 0; i < nadd; i++) *ap++ = *av++;
pp->p_natoms = newnatoms;
--- 433,442 ----
{
ap = pp->p_buffer + pp->p_natoms;
! SETSYMBOL(ap, keysym);
}
ap++;
nadd--;
! if (pp->p_resolver)
! props_dictadd(pp, keysym, nadd, av);
for (i = 0; i < nadd; i++) *ap++ = *av++;
pp->p_natoms = newnatoms;
***************
*** 223,230 ****
}
! /* If in a single mode, ignore `other' properties (their switches are parsed
! through as values). If there is an empty property, which is not to be
! ignored, do not parse beyond. Return an offending switch, if any. */
! t_symbol *props_add(t_props *pp, int single, t_symbol *s, int ac, t_atom *av)
{
t_symbol *empty = 0;
--- 445,454 ----
}
! /* Carve out all properties of a given kind from a message. If in a single
! mode, ignore `mixup' properties -- their keys are parsed through as values.
! If there is an empty property, which is not to be ignored, do not parse
! beyond. Return an offending key symbol, if any. */
! t_symbol *props_add(t_props *pp, int single, t_props *filter,
! t_symbol *s, int ac, t_atom *av)
{
t_symbol *empty = 0;
***************
*** 232,236 ****
int mode = (single ? PROPS_SINGLEMODE : PROPS_MULTIMODE);
int ac1, i, ngrown = 0;
! if (!s || !props_atstart(pp, PROPS_SINGLEMODE, s->s_name))
{
s = 0;
--- 456,460 ----
int mode = (single ? PROPS_SINGLEMODE : PROPS_MULTIMODE);
int ac1, i, ngrown = 0;
! if (!s || props_iskey(pp, PROPS_SINGLEMODE, s->s_name) == PROPS_NONE)
{
s = 0;
***************
*** 239,243 ****
s = (av->a_type == A_SYMBOL ? av->a_w.w_symbol : 0);
ac--; av++;
! if (s && props_atstart(pp, PROPS_SINGLEMODE, s->s_name))
break;
s = 0;
--- 463,468 ----
s = (av->a_type == A_SYMBOL ? av->a_w.w_symbol : 0);
ac--; av++;
! if (s &&
! props_iskey(pp, PROPS_SINGLEMODE, s->s_name) != PROPS_NONE)
break;
s = 0;
***************
*** 249,262 ****
goto done;
}
! ngrown += props_update(pp, mode, s, ac, av, 0);
if (pp->p_badupdate)
empty = s;
else for (i = 0, ap = av; i < ac; i++, ap++)
{
! if (ap->a_type == A_SYMBOL
! && props_atstart(pp, PROPS_SINGLEMODE,
! ap->a_w.w_symbol->s_name))
{
! ngrown += props_update(pp, mode, ap->a_w.w_symbol,
ac - i - 1, ap + 1, 0);
if (pp->p_badupdate)
--- 474,487 ----
goto done;
}
! ngrown += props_update(pp, mode, filter, s, ac, av, 0);
if (pp->p_badupdate)
empty = s;
else for (i = 0, ap = av; i < ac; i++, ap++)
{
! if (ap->a_type == A_SYMBOL &&
! props_iskey(pp, PROPS_SINGLEMODE,
! ap->a_w.w_symbol->s_name) != PROPS_NONE)
{
! ngrown += props_update(pp, mode, filter, ap->a_w.w_symbol,
ac - i - 1, ap + 1, 0);
if (pp->p_badupdate)
***************
*** 278,291 ****
goto done;
}
! props_update(pp, mode, s, ac, av, 1);
if (pp->p_badupdate)
empty = s;
else for (i = 0, ap = av; i < ac; i++, ap++)
{
! if (ap->a_type == A_SYMBOL
! && props_atstart(pp, PROPS_SINGLEMODE,
! ap->a_w.w_symbol->s_name))
{
! props_update(pp, mode, ap->a_w.w_symbol,
ac - i - 1, ap + 1, 1);
if (pp->p_badupdate)
--- 503,516 ----
goto done;
}
! props_update(pp, mode, filter, s, ac, av, 1);
if (pp->p_badupdate)
empty = s;
else for (i = 0, ap = av; i < ac; i++, ap++)
{
! if (ap->a_type == A_SYMBOL &&
! props_iskey(pp, PROPS_SINGLEMODE,
! ap->a_w.w_symbol->s_name) != PROPS_NONE)
{
! props_update(pp, mode, filter, ap->a_w.w_symbol,
ac - i - 1, ap + 1, 1);
if (pp->p_badupdate)
***************
*** 300,308 ****
}
! /* FIXME remove from p_dict */
! int props_remove(t_props *pp, t_symbol *s)
{
int ac;
! t_atom *av = props_getone(pp, s, &ac);
if (av)
{
--- 525,534 ----
}
! int props_remove(t_props *pp, t_symbol *keysym)
{
int ac;
! t_atom *av = props_getone(pp, keysym, &ac);
! if (keysym && *keysym->s_name)
! props_removevalue(pp, keysym->s_name + 1);
if (av)
{
***************
*** 317,439 ****
}
! /* LATER think about 'deep' cloning, i.e. propagating source atoms into
! the destination buffer. Since cloning, unless requested by the user,
! should never be persistent (source atoms should not stick to the
! destination object in a .pd file), deep cloning requires introducing
! a two-buffer scheme. There is no reason for deep cloning of arguments,
! or handlers, but options could benefit. */
!
! void props_clone(t_props *to, t_props *from)
{
! if (to->p_resolver)
! {
! /* LATER make this into a generic traversing method */
! int ibeg = 0, iend = 0;
! t_atom *abeg = from->p_buffer;
! t_atom *ap = abeg;
! while (ibeg < from->p_natoms)
! {
! if (ap->a_type == A_SYMBOL &&
! props_atstart(from, PROPS_SINGLEMODE, ap->a_w.w_symbol->s_name))
! {
! for (iend = ibeg + 1, ap++; iend < from->p_natoms; iend++, ap++)
! if (ap->a_type == A_SYMBOL
! && props_atstart(from, PROPS_MULTIMODE,
! ap->a_w.w_symbol->s_name))
! break;
! props_dictadd(to, abeg->a_w.w_symbol,
! iend - ibeg - 1, abeg + 1);
! if (iend < from->p_natoms)
! {
! ibeg = iend;
! abeg = ap;
! }
! else break;
! }
! else
! {
! ibeg++;
! ap++;
! }
! }
! }
! else
! {
! /* LATER */
! }
}
! /* only dictionary-enabled properties handle props_...value() calls */
!
! char *props_getvalue(t_props *pp, char *key)
{
! if (pp->p_resolver)
{
! t_propelem *ep = pp->p_dict;
! while (ep)
{
! if (strcmp(ep->e_key, key))
! ep = ep->e_next;
! else
! return (ep->e_value);
}
}
! return (0);
! }
!
! char *props_nextvalue(t_props *pp, char **keyp)
! {
! if (pp->p_nextelem)
! {
! char *value = pp->p_nextelem->e_value;
! *keyp = pp->p_nextelem->e_key;
! pp->p_nextelem = pp->p_nextelem->e_next;
! return (value);
! }
! return (0);
! }
!
! char *props_firstvalue(t_props *pp, char **keyp)
! {
! if (pp->p_resolver)
! pp->p_nextelem = pp->p_dict;
! return (props_nextvalue(pp, keyp));
}
! t_atom *props_getone(t_props *pp, t_symbol *s, int *npp)
{
! int ibeg, iend = 0;
! t_atom *ap;
! if (!(s && props_atstart(pp, PROPS_SINGLEMODE, s->s_name)))
! return (0);
! for (ibeg = 0, ap = pp->p_buffer; ibeg < pp->p_natoms; ibeg++, ap++)
! {
! if (ap->a_type == A_SYMBOL && ap->a_w.w_symbol == s)
! {
! for (iend = ibeg + 1, ap++; iend < pp->p_natoms; iend++, ap++)
! if (ap->a_type == A_SYMBOL
! && props_atstart(pp, PROPS_MULTIMODE,
! ap->a_w.w_symbol->s_name))
! break;
! break;
! }
! }
! if (iend > ibeg)
{
! *npp = iend - ibeg;
! return (pp->p_buffer + ibeg);
}
- else return (0);
- }
-
- t_atom *props_getall(t_props *pp, int *npp)
- {
- *npp = pp->p_natoms;
- return (pp->p_buffer);
- }
-
- char *props_getname(t_props *pp)
- {
- return (pp ? pp->p_name : "property");
}
--- 543,578 ----
}
! static void props_clearone(t_props *pp)
{
! pp->p_natoms = 0;
! props_clearvalues(pp);
}
! void props_clearall(t_props *pp)
{
! if (pp && (pp = pp->p_firstmixup))
{
! while (pp)
{
! props_clearone(pp);
! pp = pp->p_next;
}
}
! else loudbug_bug("props_clearall");
}
! /* Compute pp0 = pp1 - pp2, using key-only equivalence. */
! void props_diff(t_props *pp0, t_props *pp1, t_props *pp2)
{
! int ac1;
! t_atom *ap1 = props_getfirst(pp1, &ac1);
! props_clearone(pp0);
! while (ap1)
{
! int ac2;
! if (!props_getone(pp2, ap1->a_w.w_symbol, &ac2))
! props_add(pp0, 0, 0, 0, ac1, ap1);
! ap1 = props_getnext(pp1, &ac1);
}
}
***************
*** 442,451 ****
if (pp->p_buffer != pp->p_bufini)
freebytes(pp->p_buffer, pp->p_size * sizeof(*pp->p_buffer));
! while (pp->p_dict)
! {
! t_propelem *ep = pp->p_dict->e_next;
! propelem_free(pp->p_dict);
! pp->p_dict = ep;
! }
freebytes(pp, sizeof(*pp));
}
--- 581,585 ----
if (pp->p_buffer != pp->p_bufini)
freebytes(pp->p_buffer, pp->p_size * sizeof(*pp->p_buffer));
! props_clearvalues(pp);
freebytes(pp, sizeof(*pp));
}
***************
*** 453,457 ****
void props_freeall(t_props *pp)
{
! if (pp && (pp = pp->p_otherprops))
{
while (pp)
--- 587,591 ----
void props_freeall(t_props *pp)
{
! if (pp && (pp = pp->p_firstmixup))
{
while (pp)
***************
*** 462,479 ****
}
}
! else bug("props_freeall");
}
! void props_setupothers(t_props *pp, t_props *otherprops)
{
t_props *pp1;
! pp->p_next = (otherprops ? otherprops->p_otherprops : 0);
for (pp1 = pp; pp1; pp1 = pp1->p_next)
{
t_props *pp2;
! char *bp = pp1->p_otherescapes;
int i;
! pp1->p_otherprops = pp;
! for (pp2 = pp, i = 1; pp2 && i < PROPS_MAXOTHERS;
pp2 = pp2->p_next, i++)
if (pp2 != pp1)
--- 596,613 ----
}
}
! else loudbug_bug("props_freeall");
}
! static void props_setupmixups(t_props *pp, t_props *mixup)
{
t_props *pp1;
! pp->p_next = (mixup ? mixup->p_firstmixup : 0);
for (pp1 = pp; pp1; pp1 = pp1->p_next)
{
t_props *pp2;
! char *bp = pp1->p_mixupescapes;
int i;
! pp1->p_firstmixup = pp;
! for (pp2 = pp, i = 1; pp2 && i < PROPS_MAXMIXUPS;
pp2 = pp2->p_next, i++)
if (pp2 != pp1)
***************
*** 481,489 ****
*bp = 0;
#ifdef PROPS_DEBUG
! startpost("%c \"%s\" ", pp1->p_thisescape, pp1->p_otherescapes);
#endif
}
#ifdef PROPS_DEBUG
! endpost();
#endif
}
--- 615,623 ----
*bp = 0;
#ifdef PROPS_DEBUG
! loudbug_startpost("%c \"%s\" ", pp1->p_thisescape, pp1->p_mixupescapes);
#endif
}
#ifdef PROPS_DEBUG
! loudbug_endpost();
#endif
}
***************
*** 491,495 ****
/* nonzero resolver requires the owner to be nonzero */
t_props *props_new(t_pd *owner, char *name, char *thisdelim,
! t_props *otherprops, t_propsresolver resolver)
{
t_props *pp = getbytes(sizeof(*pp));
--- 625,629 ----
/* nonzero resolver requires the owner to be nonzero */
t_props *props_new(t_pd *owner, char *name, char *thisdelim,
! t_props *mixup, t_propsresolver resolver)
{
t_props *pp = getbytes(sizeof(*pp));
***************
*** 504,515 ****
else
{
! bug("props_new (no escape)");
pp->p_thisescape = '-';
pp->p_thisinitial = 0;
}
! props_setupothers(pp, otherprops);
pp->p_size = PROPS_INISIZE;
pp->p_natoms = 0;
pp->p_buffer = pp->p_bufini;
if (pp->p_owner = owner)
pp->p_resolver = resolver;
--- 638,650 ----
else
{
! loudbug_bug("props_new (no escape)");
pp->p_thisescape = '-';
pp->p_thisinitial = 0;
}
! props_setupmixups(pp, mixup);
pp->p_size = PROPS_INISIZE;
pp->p_natoms = 0;
pp->p_buffer = pp->p_bufini;
+ pp->p_nextindex = -1;
if (pp->p_owner = owner)
pp->p_resolver = resolver;
***************
*** 517,521 ****
{
if (resolver)
! bug("props_new (no owner)");
pp->p_resolver = 0;
}
--- 652,656 ----
{
if (resolver)
! loudbug_bug("props_new (no owner)");
pp->p_resolver = 0;
}
Index: props.h
===================================================================
RCS file: /cvsroot/pure-data/externals/miXed/shared/common/props.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** props.h 3 Oct 2003 12:08:31 -0000 1.2
--- props.h 12 Mar 2005 00:19:10 -0000 1.3
***************
*** 1,3 ****
! /* 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. */
--- 1,3 ----
! /* Copyright (c) 2003-2005 krzYszcz and others.
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
***************
*** 11,26 ****
typedef char *(*t_propsresolver)(t_pd *, int, t_atom *);
- t_symbol *props_add(t_props *pp, int single, t_symbol *s, int ac, t_atom *av);
- int props_remove(t_props *pp, t_symbol *s);
- void props_clone(t_props *to, t_props *from);
char *props_getvalue(t_props *pp, char *key);
char *props_firstvalue(t_props *pp, char **keyp);
char *props_nextvalue(t_props *pp, char **keyp);
! t_atom *props_getone(t_props *pp, t_symbol *s, int *npp);
t_atom *props_getall(t_props *pp, int *npp);
char *props_getname(t_props *pp);
void props_freeall(t_props *pp);
t_props *props_new(t_pd *owner, char *name, char *thisdelim,
! t_props *otherprops, t_propsresolver resolver);
#endif
--- 11,34 ----
typedef char *(*t_propsresolver)(t_pd *, int, t_atom *);
char *props_getvalue(t_props *pp, char *key);
char *props_firstvalue(t_props *pp, char **keyp);
char *props_nextvalue(t_props *pp, char **keyp);
! void props_clearvalues(t_props *pp);
! void props_clonevalues(t_props *to, t_props *from);
!
! t_atom *props_getone(t_props *pp, t_symbol *keysym, int *npp);
! t_atom *props_getfirst(t_props *pp, int *npp);
! t_atom *props_getnext(t_props *pp, int *npp);
t_atom *props_getall(t_props *pp, int *npp);
char *props_getname(t_props *pp);
+
+ t_symbol *props_add(t_props *pp, int single, t_props *filter,
+ t_symbol *s, int ac, t_atom *av);
+ int props_remove(t_props *pp, t_symbol *keysym);
+ void props_diff(t_props *pp0, t_props *pp1, t_props *pp2);
+ void props_clearall(t_props *pp);
void props_freeall(t_props *pp);
t_props *props_new(t_pd *owner, char *name, char *thisdelim,
! t_props *mixup, t_propsresolver resolver);
#endif