aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.common8
-rw-r--r--cyclone/hammer/Table.c97
-rw-r--r--cyclone/hammer/coll.c117
-rw-r--r--cyclone/hammer/funbuff.c2
-rw-r--r--test/cyclone/Table-test.pd34
5 files changed, 168 insertions, 90 deletions
diff --git a/Makefile.common b/Makefile.common
index 7f88cd1..fd57c44 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -31,6 +31,14 @@ OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
LFLAGS = -export_dynamic -shared
endif
+ifeq ($(OS_NAME),MinGW)
+CC = gcc
+X_SUFFIX = dll
+DEFINES = -DNT -DMSW
+OPT_CFLAGS = -funroll-loops
+LFLAGS = -shared $(PD_DIR)/../bin/pd.dll
+endif
+
ifeq ($(OS_NAME),Darwin)
CC = gcc2
X_SUFFIX = pd_darwin
diff --git a/cyclone/hammer/Table.c b/cyclone/hammer/Table.c
index 9b08cbe..e366cbb 100644
--- a/cyclone/hammer/Table.c
+++ b/cyclone/hammer/Table.c
@@ -61,7 +61,7 @@ typedef struct _tablecommon
typedef struct _table
{
t_object x_ob;
- t_canvas *x_canvas;
+ t_canvas *x_glist;
t_symbol *x_name;
t_tablecommon *x_common;
t_float x_value;
@@ -92,8 +92,8 @@ static void tablecommon_modified(t_tablecommon *cc, int relocated)
{
t_table *x;
for (x = cc->c_refs; x; x = x->x_next)
- if (x->x_canvas && glist_isvisible(x->x_canvas))
- canvas_dirty(x->x_canvas, 1);
+ if (x->x_glist && glist_isvisible(x->x_glist))
+ canvas_dirty(x->x_glist, 1);
}
}
@@ -223,9 +223,37 @@ static int tablecommon_quantile(t_tablecommon *cc, float f)
return (ndx);
}
+/* LATER binary files */
static void tablecommon_doread(t_tablecommon *cc, t_symbol *fn, t_canvas *cv)
{
/* FIXME */
+ t_binbuf *bb = binbuf_new();
+ int ac;
+ t_atom *av;
+ char buf[MAXPDSTRING];
+ if (!fn)
+ return; /* CHECKME complaint */
+ if (cv || (cv = cc->c_lastcanvas)) /* !cv: 'read' w/o arg */
+ canvas_makefilename(cv, fn->s_name, buf, MAXPDSTRING);
+ else
+ {
+ strncpy(buf, fn->s_name, MAXPDSTRING);
+ buf[MAXPDSTRING-1] = 0;
+ }
+ binbuf_read(bb, buf, "", 0);
+ if ((ac = binbuf_getnatom(bb)) &&
+ (av = binbuf_getvec(bb)) &&
+ av->a_type == A_SYMBOL &&
+ av->a_w.w_symbol == gensym("table"))
+ {
+ post("Table: %s read successful", fn->s_name); /* CHECKME */
+ /* FIXME */
+ }
+#if 0 /* FIXME */
+ else /* CHECKME complaint */
+ loud_error((t_pd *)cc, "invalid file %s", fn->s_name);
+#endif
+ binbuf_free(bb);
}
static void tablecommon_readhook(t_pd *z, t_symbol *fn, int ac, t_atom *av)
@@ -235,7 +263,23 @@ static void tablecommon_readhook(t_pd *z, t_symbol *fn, int ac, t_atom *av)
static void tablecommon_dowrite(t_tablecommon *cc, t_symbol *fn, t_canvas *cv)
{
- /* FIXME */
+ t_binbuf *bb = binbuf_new();
+ char buf[MAXPDSTRING];
+ int ndx, *ptr;
+ if (!fn)
+ return; /* CHECKME complaint */
+ if (cv || (cv = cc->c_lastcanvas)) /* !cv: 'write' w/o arg */
+ canvas_makefilename(cv, fn->s_name, buf, MAXPDSTRING);
+ else
+ {
+ strncpy(buf, fn->s_name, MAXPDSTRING);
+ buf[MAXPDSTRING-1] = 0;
+ }
+ binbuf_addv(bb, "s", gensym("table"));
+ for (ndx = 0, ptr = cc->c_table; ndx < cc->c_length; ndx++, ptr++)
+ binbuf_addv(bb, "i", *ptr);
+ binbuf_write(bb, buf, "", 0);
+ binbuf_free(bb);
}
static void tablecommon_writehook(t_pd *z, t_symbol *fn, int ac, t_atom *av)
@@ -365,7 +409,7 @@ static void table_bind(t_table *x, t_symbol *name)
{
pd_bind(&cc->c_pd, name);
/* LATER rethink canvas unpredictability */
- tablecommon_doread(cc, name, x->x_canvas);
+ tablecommon_doread(cc, name, x->x_glist);
}
else
{
@@ -641,20 +685,35 @@ static void table_fquantile(t_table *x, t_floatarg f)
(t_float)tablecommon_quantile(x->x_common, f));
}
-/* FIXME arguments (from, to) */
-/* CHECKED no remote dumping, symbol args bashed to 0 */
static void table_dump(t_table *x, t_symbol *s, int ac, t_atom *av)
{
t_tablecommon *cc = x->x_common;
+ int thelength = cc->c_length;
+ int *thetable = cc->c_table;
t_outlet *out = ((t_object *)x)->ob_outlet;
- int ndx;
- /* The usual way of traversing the table by incrementing a pointer is
- not robust, because calling outlet_float() may invalidate the pointer.
- The test below is simpler than generic selfmod detection ala coll,
- but behaviour may be different. LATER revisit, consider asserting
- invariance of cc->c_table and cc->c_length, instead. */
- for (ndx = 0; ndx < cc->c_length; ndx++)
- outlet_float(out, (t_float)cc->c_table[ndx]);
+ int ndx, nmx, *ptr;
+ /* CHECKED optional arguments: from, to, Negative 'from' causes
+ invalid output, symbols are bashed to zero for both arguments,
+ inconsistent warnings, etc. -- no strict emulation attempted below. */
+ if (ac && av->a_type == A_FLOAT)
+ ndx = tablecommon_getindex(cc, (int)av->a_w.w_float);
+ else
+ ndx = 0;
+ if (ac > 1 && av[1].a_type == A_FLOAT)
+ nmx = tablecommon_getindex(cc, (int)av[1].a_w.w_float);
+ else
+ nmx = thelength - 1;
+ for (ptr = thetable + ndx; ndx <= nmx; ndx++, ptr++)
+ {
+ /* Plain traversing by incrementing a pointer is not robust,
+ because calling outlet_float() may invalidate the pointer.
+ Continous storage does not require generic selfmod detection
+ (ala coll), so we can get away with the simpler test below. */
+ if (cc->c_length != thelength || cc->c_table != thetable)
+ break;
+ /* CHECKED no remote dumping */
+ outlet_float(out, (t_float)*ptr);
+ }
}
static void table_refer(t_table *x, t_symbol *s)
@@ -669,7 +728,7 @@ static void table_read(t_table *x, t_symbol *s)
{
t_tablecommon *cc = x->x_common;
if (s && s != &s_)
- tablecommon_doread(cc, s, x->x_canvas);
+ tablecommon_doread(cc, s, x->x_glist);
else
hammerpanel_open(cc->c_filehandle, 0);
}
@@ -678,9 +737,8 @@ static void table_write(t_table *x, t_symbol *s)
{
t_tablecommon *cc = x->x_common;
if (s && s != &s_)
- tablecommon_dowrite(cc, s, x->x_canvas);
+ tablecommon_dowrite(cc, s, x->x_glist);
else
- /* CHECKED default name is plain `Untitled' */
hammerpanel_save(cc->c_filehandle, 0, 0);
}
@@ -709,6 +767,7 @@ static void table_open(t_table *x)
int count = cc->c_length, col = 0;
/* LATER prepend "table: " */
hammereditor_open(cc->c_filehandle,
+ /* CHECKED default name is plain `Untitled' */
x->x_name ? x->x_name->s_name : "Untitled");
while (count--)
col = tablecommon_editorappend(cc, *bp++, buf, col);
@@ -754,7 +813,7 @@ static void *table_new(t_symbol *s)
loud_warning((t_pd *)x, 0, "Table is not ready yet");
warned = 1;
}
- x->x_canvas = canvas_getcurrent();
+ x->x_glist = canvas_getcurrent();
x->x_valueset = 0;
x->x_head = 0;
x->x_intraversal = 0; /* CHECKED */
diff --git a/cyclone/hammer/coll.c b/cyclone/hammer/coll.c
index a6d6476..850c2c7 100644
--- a/cyclone/hammer/coll.c
+++ b/cyclone/hammer/coll.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2002-2003 krzYszcz and others.
+/* Copyright (c) 2002-2004 krzYszcz and others.
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
@@ -16,6 +16,10 @@
#define COLL_DEBUG
+enum { COLL_HEADRESET,
+ COLL_HEADNEXT, COLL_HEADPREV, /* distinction not used, currently */
+ COLL_HEADDELETED };
+
typedef struct _collelem
{
int e_hasnumkey;
@@ -41,8 +45,8 @@ typedef struct _collcommon
t_hammerfile *c_filehandle;
t_collelem *c_first;
t_collelem *c_last;
- t_collelem *c_ahead;
- t_collelem *c_back;
+ t_collelem *c_head;
+ int c_headstate;
} t_collcommon;
typedef struct _coll
@@ -184,10 +188,12 @@ static void collcommon_takeout(t_collcommon *cc, t_collelem *ep)
ep->e_next->e_prev = ep->e_prev;
else
cc->c_last = ep->e_prev;
- if (cc->c_ahead == ep)
- cc->c_ahead = ep->e_next;
- if (cc->c_back == ep)
- cc->c_back = ep->e_prev;
+ if (cc->c_head == ep)
+ {
+ cc->c_head = ep->e_next; /* asymmetric, LATER rethink */
+ cc->c_headstate = COLL_HEADDELETED;
+ }
+
}
static void collcommon_modified(t_collcommon *cc, int relinked)
@@ -222,7 +228,8 @@ static void collcommon_clearall(t_collcommon *cc)
}
while (ep1 = ep2);
cc->c_first = cc->c_last = 0;
- cc->c_ahead = cc->c_back = 0;
+ cc->c_head = 0;
+ cc->c_headstate = COLL_HEADRESET;
collcommon_modified(cc, 1);
}
}
@@ -581,8 +588,6 @@ static int collcommon_frombinbuf(t_collcommon *cc, t_binbuf *bb)
static void collcommon_doread(t_collcommon *cc, t_symbol *fn, t_canvas *cv)
{
t_binbuf *bb;
- int ac;
- t_atom *av;
char buf[MAXPDSTRING];
if (!fn && !(fn = cc->c_filename)) /* !fn: 'readagain' */
return;
@@ -761,7 +766,8 @@ static void *collcommon_new(void)
t_collcommon *cc = (t_collcommon *)pd_new(collcommon_class);
cc->c_embedflag = 0;
cc->c_first = cc->c_last = 0;
- cc->c_ahead = cc->c_back = 0;
+ cc->c_head = 0;
+ cc->c_headstate = COLL_HEADRESET;
return (cc);
}
@@ -1203,70 +1209,59 @@ static void coll_swap(t_coll *x, t_symbol *s, int ac, t_atom *av)
else loud_messarg((t_pd *)x, s);
}
+/* CHECKED traversal direction change is consistent with the general rule:
+ 'next' always outputs e_next of a previous output, and 'prev' always
+ outputs e_prev, whether preceded by 'prev', or by 'next'. This is
+ currently implemented by pre-updating of the head (which is inhibited
+ if there was no previous output, i.e. after 'goto', 'end', or collection
+ initialization). CHECKME again. */
+
static void coll_next(t_coll *x)
{
t_collcommon *cc = x->x_common;
- if (!cc->c_ahead && !(cc->c_ahead = cc->c_first))
- return;
- coll_keyoutput(x, cc->c_ahead);
- if (cc->c_selfmodified && !cc->c_ahead)
- return;
- coll_dooutput(x, cc->c_ahead->e_size, cc->c_ahead->e_data);
- /* LATER think why c74 updates the heads prior to sendout
- (it seems so clumsy...) */
- if (!cc->c_ahead && !(cc->c_ahead = cc->c_first))
- {
- cc->c_back = 0;
- return;
- }
- if (cc->c_ahead->e_next)
- {
- cc->c_ahead = cc->c_ahead->e_next;
- if (!(cc->c_back = cc->c_ahead->e_prev)) /* LATER rethink */
- cc->c_back = cc->c_last;
- }
- else
+ if (cc->c_headstate != COLL_HEADRESET &&
+ cc->c_headstate != COLL_HEADDELETED) /* asymmetric, LATER rethink */
{
- /* CHECKED wraping */
- cc->c_back = cc->c_ahead;
- cc->c_ahead = 0;
+ if (cc->c_head)
+ cc->c_head = cc->c_head->e_next;
+ if (!cc->c_head && !(cc->c_head = cc->c_first)) /* CHECKED wrapping */
+ return;
}
+ else if (!cc->c_head && !(cc->c_head = cc->c_first))
+ return;
+ cc->c_headstate = COLL_HEADNEXT;
+ coll_keyoutput(x, cc->c_head);
+ if (cc->c_head)
+ coll_dooutput(x, cc->c_head->e_size, cc->c_head->e_data);
+ else if (!cc->c_selfmodified)
+ bug("coll_next"); /* LATER rethink */
}
static void coll_prev(t_coll *x)
{
t_collcommon *cc = x->x_common;
- if (!cc->c_back && !(cc->c_back = cc->c_last))
- return;
- coll_keyoutput(x, cc->c_back);
- if (cc->c_selfmodified && !cc->c_back)
- return;
- coll_dooutput(x, cc->c_back->e_size, cc->c_back->e_data);
- /* LATER think why c74 updates the heads prior to sendout
- (it seems so clumsy...) */
- if (!cc->c_back && !(cc->c_back = cc->c_last))
+ if (cc->c_headstate != COLL_HEADRESET)
{
- cc->c_ahead = 0;
- return;
- }
- if (cc->c_back->e_prev)
- {
- cc->c_back = cc->c_back->e_prev;
- if (!(cc->c_ahead = cc->c_back->e_next)) /* LATER rethink */
- cc->c_ahead = cc->c_first;
- }
- else
- {
- /* CHECKED wraping */
- cc->c_ahead = cc->c_back;
- cc->c_back = 0;
+ if (cc->c_head)
+ cc->c_head = cc->c_head->e_prev;
+ if (!cc->c_head && !(cc->c_head = cc->c_last)) /* CHECKED wrapping */
+ return;
}
+ else if (!cc->c_head && !(cc->c_head = cc->c_first))
+ return;
+ cc->c_headstate = COLL_HEADPREV;
+ coll_keyoutput(x, cc->c_head);
+ if (cc->c_head)
+ coll_dooutput(x, cc->c_head->e_size, cc->c_head->e_data);
+ else if (!cc->c_selfmodified)
+ bug("coll_prev"); /* LATER rethink */
}
static void coll_end(t_coll *x)
{
t_collcommon *cc = x->x_common;
- cc->c_back = cc->c_ahead = cc->c_last;
+ cc->c_head = cc->c_last;
+ cc->c_headstate = COLL_HEADRESET;
}
static void coll_goto(t_coll *x, t_symbol *s, int ac, t_atom *av)
@@ -1275,7 +1270,11 @@ static void coll_goto(t_coll *x, t_symbol *s, int ac, t_atom *av)
{
t_collelem *ep = coll_findkey(x, av, s);
if (ep)
- x->x_common->c_back = x->x_common->c_ahead = ep;
+ {
+ t_collcommon *cc = x->x_common;
+ cc->c_head = ep;
+ cc->c_headstate = COLL_HEADRESET;
+ }
}
else loud_messarg((t_pd *)x, s);
}
diff --git a/cyclone/hammer/funbuff.c b/cyclone/hammer/funbuff.c
index 5791b1e..3ce6080 100644
--- a/cyclone/hammer/funbuff.c
+++ b/cyclone/hammer/funbuff.c
@@ -444,7 +444,7 @@ static void *funbuff_new(t_symbol *s)
x->x_canvas = canvas_getcurrent();
x->x_valueset = 0;
x->x_pointer = 0;
- x->x_pointerset = 0;
+ x->x_pointerset = 0; /* CHECKME, rename to intraversal? */
x->x_lastdelta = 0;
x->x_embedflag = 0;
hammertree_init(&x->x_tree, 0);
diff --git a/test/cyclone/Table-test.pd b/test/cyclone/Table-test.pd
index a5f6eb4..9e4af55 100644
--- a/test/cyclone/Table-test.pd
+++ b/test/cyclone/Table-test.pd
@@ -1,17 +1,17 @@
#N canvas 278 182 656 317 12;
-#X msg 25 72 load;
-#X obj 97 102 Uzi;
-#X msg 97 72 100;
+#X msg 24 43 load;
+#X obj 100 73 Uzi;
+#X msg 100 43 100;
#X msg 29 222 size 100;
#X obj 119 256 print;
#X msg 157 102 next;
#X msg 159 137 prev;
-#X msg 148 72 goto \$1;
-#X floatatom 148 41 5 0 0 0 - - -;
-#X msg 313 72 fquantile \$1;
-#X floatatom 313 45 5 0 0 0 - - -;
-#X msg 441 72 quantile \$1;
-#X floatatom 441 45 5 0 0 0 - - -;
+#X msg 148 70 goto \$1;
+#X floatatom 148 43 5 0 0 0 - - -;
+#X msg 313 70 fquantile \$1;
+#X floatatom 313 43 5 0 0 0 - - -;
+#X msg 441 70 quantile \$1;
+#X floatatom 441 43 5 0 0 0 - - -;
#X obj 508 222 r test;
#X obj 508 256 print test;
#X msg 295 223 send test \$1;
@@ -23,10 +23,16 @@
#X obj 313 137 print;
#X obj 313 107 Table t;
#C restore;
-#X msg 261 72 bang;
+#X msg 261 73 bang;
#X msg 360 196 symbol length;
-#X msg 25 102 normal;
+#X msg 24 73 normal;
#X floatatom 159 184 5 0 0 0 - - -;
+#X msg 24 184 dump \$1 \$2;
+#X obj 24 154 pack;
+#X floatatom 24 120 5 0 0 0 - - -;
+#X floatatom 79 120 5 0 0 0 - - -;
+#X msg 79 154 dump;
+#X msg 404 107 sum \, min \, max;
#X connect 0 0 17 0;
#X connect 1 2 17 0;
#X connect 2 0 1 0;
@@ -48,3 +54,9 @@
#X connect 22 0 15 0;
#X connect 23 0 17 0;
#X connect 24 0 17 0;
+#X connect 25 0 17 0;
+#X connect 26 0 25 0;
+#X connect 27 0 26 0;
+#X connect 28 0 26 1;
+#X connect 29 0 17 0;
+#X connect 30 0 20 0;