From 547f002d6e53a4882845e04d89dcd059da7efdbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Wed, 26 Nov 2008 11:13:07 +0000 Subject: moved general functions into a header-file for reusability svn path=/trunk/externals/iem/iemguts/; revision=10390 --- src/iemguts-objlist.h | 153 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/savebangs.c | 134 ++----------------------------------------- 2 files changed, 158 insertions(+), 129 deletions(-) create mode 100644 src/iemguts-objlist.h (limited to 'src') diff --git a/src/iemguts-objlist.h b/src/iemguts-objlist.h new file mode 100644 index 0000000..fedfdf1 --- /dev/null +++ b/src/iemguts-objlist.h @@ -0,0 +1,153 @@ +/****************************************************** + * + * iemguts - implementation file + * + * copyleft (c) IOhannes m zmölnig + * + * 2008:forum::für::umläute: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; + } +} diff --git a/src/savebangs.c b/src/savebangs.c index df16711..0704bfb 100644 --- a/src/savebangs.c +++ b/src/savebangs.c @@ -33,133 +33,9 @@ * 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 ---------------------------- */ @@ -218,12 +94,12 @@ static void orig_savefn(t_gobj*z, t_binbuf*b) } } -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 @@ static void savebangs_bangs(t_savebangs*x, int pst) 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); -- cgit v1.2.1