[PD-cvs] SF.net SVN: pure-data:[10390] trunk/externals/iem/iemguts/src
zmoelnig at users.sourceforge.net
zmoelnig at users.sourceforge.net
Wed Nov 26 12:13:07 CET 2008
Revision: 10390
http://pure-data.svn.sourceforge.net/pure-data/?rev=10390&view=rev
Author: zmoelnig
Date: 2008-11-26 11:13:07 +0000 (Wed, 26 Nov 2008)
Log Message:
-----------
moved general functions into a header-file for reusability
Modified Paths:
--------------
trunk/externals/iem/iemguts/src/savebangs.c
Added Paths:
-----------
trunk/externals/iem/iemguts/src/iemguts-objlist.h
Added: trunk/externals/iem/iemguts/src/iemguts-objlist.h
===================================================================
--- trunk/externals/iem/iemguts/src/iemguts-objlist.h (rev 0)
+++ trunk/externals/iem/iemguts/src/iemguts-objlist.h 2008-11-26 11:13:07 UTC (rev 10390)
@@ -0,0 +1,153 @@
+/******************************************************
+ *
+ * iemguts - implementation file
+ *
+ * copyleft (c) IOhannes m zm\xF6lnig
+ *
+ * 2008:forum::f\xFCr::uml\xE4ute:2008
+ *
+ * institute of electronic music and acoustics (iem)
+ *
+ ******************************************************
+ *
+ * license: GNU General Public License v.2
+ *
+ ******************************************************/
+
+/* this file implements some helperr functions for dealing with lists of
+ * objects (containing other objects)
+ *
+ * used for callbacks to enumerated objects without $0 tricks
+ */
+
+/*
+ * TODO: documentation
+ */
+
+#include "m_pd.h"
+
+
+/* ------------------------- helper methods for callbacks ---------------------------- */
+
+typedef struct _iemguts_objlist {
+ const t_pd*obj;
+ struct _iemguts_objlist*next;
+} t_iemguts_objlist;
+
+typedef struct _iemguts_canvaslist {
+ const t_pd*parent;
+ t_iemguts_objlist*obj;
+
+ struct _iemguts_canvaslist*next;
+} t_iemguts_canvaslist;
+
+static t_iemguts_canvaslist*s_canvaslist=0;
+
+
+static t_iemguts_canvaslist*findCanvas(const t_pd*parent) {
+ t_iemguts_canvaslist*list=s_canvaslist;
+ if(0==parent || 0==list)
+ return 0;
+
+ for(list=s_canvaslist; list; list=list->next) {
+ if(parent == list->parent) {
+ return list;
+ }
+ }
+ return 0;
+}
+
+static t_iemguts_canvaslist*addCanvas(const t_pd*parent)
+{
+ t_iemguts_canvaslist*list=findCanvas(parent);
+ if(!list) {
+ list=(t_iemguts_canvaslist*)getbytes(sizeof(t_iemguts_canvaslist));
+ list->parent=parent;
+ list->obj=0;
+ list->next=0;
+
+ if(0==s_canvaslist) {
+ /* new list */
+ s_canvaslist=list;
+ } else {
+ /* add to the end of existing list */
+ t_iemguts_canvaslist*dummy=s_canvaslist;
+ while(dummy->next)
+ dummy=dummy->next;
+ dummy->next = list;
+ }
+ }
+ return list;
+}
+
+static t_iemguts_objlist*objectsInCanvas(const t_pd*parent) {
+ t_iemguts_canvaslist*list=findCanvas(parent);
+ if(list)
+ return list->obj;
+
+ return 0;
+}
+
+static void addObjectToCanvas(const t_pd*parent, const t_pd*obj) {
+ t_iemguts_canvaslist*p=addCanvas(parent);
+ t_iemguts_objlist*list=0;
+ t_iemguts_objlist*entry=0;
+ if(!p || !obj)
+ return;
+ list=p->obj;
+
+ if(list&&obj==list->obj)
+ return;
+
+ while(list && list->next) {
+ if(obj==list->obj) /* obj already in list */
+ return;
+ list=list->next;
+ }
+
+ /* we are at the end of the list that does not contain obj yet, so add it */
+ entry=(t_iemguts_objlist*)getbytes(sizeof(t_iemguts_objlist));
+ entry->obj=obj;
+ entry->next=0;
+ if(list) {
+ list->next=entry;
+ } else {
+ p->obj=entry;
+ }
+}
+
+static void removeObjectFromCanvas(const t_pd*parent, const t_pd*obj) {
+ t_iemguts_canvaslist*p=findCanvas(parent);
+ t_iemguts_objlist*list=0, *last=0, *next=0;
+ if(!p || !obj)return;
+ list=p->obj;
+ if(!list)
+ return;
+
+ while(list && obj!=list->obj) {
+ last=list;
+ list=list->next;
+ }
+
+ if(!list) /* couldn't find this object */
+ return;
+
+ next=list->next;
+
+ if(last)
+ last->next=next;
+ else
+ p->obj=next;
+
+ freebytes((void*)list, sizeof(t_iemguts_objlist));
+ list=0;
+}
+
+static void removeObjectFromCanvases(const t_pd*obj) {
+ t_iemguts_canvaslist*parents=s_canvaslist;
+
+ while(parents) {
+ removeObjectFromCanvas(parents->parent, obj);
+ parents=parents->next;
+ }
+}
Modified: trunk/externals/iem/iemguts/src/savebangs.c
===================================================================
--- trunk/externals/iem/iemguts/src/savebangs.c 2008-11-26 09:51:01 UTC (rev 10389)
+++ trunk/externals/iem/iemguts/src/savebangs.c 2008-11-26 11:13:07 UTC (rev 10390)
@@ -33,134 +33,10 @@
* else we get weird duplicates (most likely due to the "$0" trick
*/
-#include "m_pd.h"
+#include "iemguts-objlist.h"
#include "g_canvas.h"
-/* ------------------------- helper methods for callbacks ---------------------------- */
-typedef struct _savebangs_objlist {
- const t_pd*obj;
- struct _savebangs_objlist*next;
-} t_savebangs_objlist;
-typedef struct _savebangs_canvaslist {
- const t_pd*parent;
- t_savebangs_objlist*obj;
-
- struct _savebangs_canvaslist*next;
-} t_savebangs_canvaslist;
-
-static t_savebangs_canvaslist*s_canvaslist=0;
-
-
-static t_savebangs_canvaslist*findCanvas(const t_pd*parent) {
- t_savebangs_canvaslist*list=s_canvaslist;
- if(0==parent || 0==list)
- return 0;
-
- for(list=s_canvaslist; list; list=list->next) {
- if(parent == list->parent) {
- return list;
- }
- }
- return 0;
-}
-
-static t_savebangs_canvaslist*addCanvas(const t_pd*parent)
-{
- t_savebangs_canvaslist*list=findCanvas(parent);
- if(!list) {
- list=(t_savebangs_canvaslist*)getbytes(sizeof(t_savebangs_canvaslist));
- list->parent=parent;
- list->obj=0;
- list->next=0;
-
- if(0==s_canvaslist) {
- /* new list */
- s_canvaslist=list;
- } else {
- /* add to the end of existing list */
- t_savebangs_canvaslist*dummy=s_canvaslist;
- while(dummy->next)
- dummy=dummy->next;
- dummy->next = list;
- }
- }
- return list;
-}
-
-static t_savebangs_objlist*objectsInCanvas(const t_pd*parent) {
- t_savebangs_canvaslist*list=findCanvas(parent);
- if(list)
- return list->obj;
-
- return 0;
-}
-
-static void addObjectToCanvas(const t_pd*parent, const t_pd*obj) {
- t_savebangs_canvaslist*p=addCanvas(parent);
- t_savebangs_objlist*list=0;
- t_savebangs_objlist*entry=0;
- if(!p || !obj)
- return;
- list=p->obj;
-
- if(list&&obj==list->obj)
- return;
-
- while(list && list->next) {
- if(obj==list->obj) /* obj already in list */
- return;
- list=list->next;
- }
-
- /* we are at the end of the list that does not contain obj yet, so add it */
- entry=(t_savebangs_objlist*)getbytes(sizeof(t_savebangs_objlist));
- entry->obj=obj;
- entry->next=0;
- if(list) {
- list->next=entry;
- } else {
- p->obj=entry;
- }
-}
-
-static void removeObjectFromCanvas(const t_pd*parent, const t_pd*obj) {
- t_savebangs_canvaslist*p=findCanvas(parent);
- t_savebangs_objlist*list=0, *last=0, *next=0;
- if(!p || !obj)return;
- list=p->obj;
- if(!list)
- return;
-
- while(list && obj!=list->obj) {
- last=list;
- list=list->next;
- }
-
- if(!list) /* couldn't find this object */
- return;
-
- next=list->next;
-
- if(last)
- last->next=next;
- else
- p->obj=next;
-
- freebytes((void*)list, sizeof(t_savebangs_objlist));
- list=0;
-}
-
-static void removeObjectFromCanvases(const t_pd*obj) {
- t_savebangs_canvaslist*parents=s_canvaslist;
-
- while(parents) {
- removeObjectFromCanvas(parents->parent, obj);
- parents=parents->next;
- }
-}
-
-
/* ------------------------- helper methods for savefunctions ---------------------------- */
typedef struct _savefuns {
@@ -218,12 +94,12 @@
}
}
-static void savebangs_bangem(t_savebangs_objlist*objs, int pst);
+static void savebangs_bangem(t_iemguts_objlist*objs, int pst);
static void savebangs_savefn(t_gobj*z, t_binbuf*b) {
/* z is the parent abstraction;
- * we maintain a list of all [savebangs] within such each parent, in order to call all of them
+ * we maintain a list of all [savebangs] within such each parent, in order to call all of them
*/
- t_savebangs_objlist*obj=objectsInCanvas((t_pd*)z);
+ t_iemguts_objlist*obj=objectsInCanvas((t_pd*)z);
savebangs_bangem(obj, 0);
orig_savefn(z, b);
savebangs_bangem(obj, 1);
@@ -249,7 +125,7 @@
outlet_bang(x->x_post);
}
-static void savebangs_bangem(t_savebangs_objlist*objs, int pst) {
+static void savebangs_bangem(t_iemguts_objlist*objs, int pst) {
while(objs) {
t_savebangs*x=(t_savebangs*)objs->obj;
savebangs_bangs(x, pst);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Pd-cvs
mailing list