From 17ec1deb74e2e934dc11fb4d9a2f8c6cef34c5a7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 9 Jul 2007 20:45:58 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r7949, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/moonlib/; revision=7950 --- relativepath.c | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 relativepath.c (limited to 'relativepath.c') diff --git a/relativepath.c b/relativepath.c new file mode 100644 index 0000000..f599222 --- /dev/null +++ b/relativepath.c @@ -0,0 +1,146 @@ +/* +Copyright (C) 2002 Antoine Rousseau + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +/*#include */ +#include "m_pd.h" +#include "g_canvas.h" + +#include +#include +#include +#include +#include +#include + +extern t_canvas *canvas_list; /* list of all root canvases */ +extern int canvas_getdollarzero( void); + +struct _canvasenvironment +{ + t_symbol *ce_dir; /* directory patch lives in */ + int ce_argc; /* number of "$" arguments */ + t_atom *ce_argv; /* array of "$" arguments */ + int ce_dollarzero; /* value of "$0" */ +}; + +typedef struct _relativepath +{ + t_object x_obj; + t_canvas *x_canvas; + int x_dolzero; + int x_realized; +}t_relativepath; + +t_class *relativepath_class; + +void relativepath_setup(void); + +static t_glist *getcanvas(t_glist *can,int d0) +{ + t_canvas *retcan=0; + t_gobj *ob; + + if((can->gl_env)&&(can->gl_env->ce_dollarzero==d0)){ + return can; + } + + ob=can->gl_list; + while(ob&&(retcan==0)) { + if (pd_class(&ob->g_pd) == canvas_class) + retcan=getcanvas((t_glist *)ob,d0); + ob=ob->g_next; + } + + if((!retcan)&&(can->gl_next)) retcan=getcanvas((t_glist *)can->gl_next,d0); + return retcan; +} + +static void relativepath_symbol(t_relativepath *x,t_symbol *sym) +{ + t_canvas *can=0; + t_symbol *s=sym; + char *instr=sym->s_name,*outstr=instr, + *candir, + canname[MAXPDSTRING],totaldir[MAXPDSTRING], + *cnamedir; + unsigned int n,i=0; + + if(!x->x_realized) can=(t_canvas*)getcanvas(canvas_list,x->x_dolzero); + if(can) { + x->x_canvas = can; + x->x_realized = 1; + //post("found $0 canvas : %x %d ",x->x_canvas, x->x_canvas->gl_env->ce_dollarzero ); + } + + if(!instr) return; + + candir=canvas_getdir(x->x_canvas)->s_name; + if(!candir) candir=""; + + strcpy(canname,x->x_canvas->gl_name->s_name); + //post("canname=%s",canname); + cnamedir=dirname(canname); + + if (strcmp(cnamedir,".")) { + sprintf(totaldir,"%s/%s",candir,cnamedir); + } + else + strcpy(totaldir,candir); + + //post("dir=%s",totaldir); + + n=strlen(totaldir); + if(strlen(instr)<=n) goto end; + + while(ix_obj.ob_outlet,s); +} + + +static void *relativepath_new(t_float dolzero) +{ + t_relativepath *x = (t_relativepath *)pd_new(relativepath_class); + int d0; + + outlet_new(&x->x_obj, 0); + x->x_canvas = canvas_getcurrent(); + x->x_dolzero = dolzero; + x->x_realized=dolzero?0:1; + + return (void *)x; +} + +void relativepath_setup(void) +{ + relativepath_class = class_new(gensym("relativepath"),(t_newmethod)relativepath_new, + 0, sizeof(t_relativepath), 0,A_DEFFLOAT,0); + + class_addsymbol(relativepath_class, relativepath_symbol); +} + -- cgit v1.2.1