Update of /cvsroot/pure-data/externals/loaders/hexloader In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29287
Modified Files: hexloader.c Log Message: added a first support for loading patches; there is still the issue with implicit dependencies of patches not correctly resolved (if the patch depends on a lib it has to be loaded beforehand or via the [declare -lib])
Index: hexloader.c =================================================================== RCS file: /cvsroot/pure-data/externals/loaders/hexloader/hexloader.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** hexloader.c 17 Oct 2007 13:56:51 -0000 1.3 --- hexloader.c 17 Oct 2007 14:31:26 -0000 1.4 *************** *** 18,21 **** --- 18,24 ----
#include "m_pd.h" + + #if (PD_MINOR_VERSION >= 40) + #include "s_stuff.h" #include "g_canvas.h" *************** *** 40,43 **** --- 43,62 ----
+ #define HEXLOADER_PATCHES + + #ifdef HEXLOADER_PATCHES + void canvas_popabstraction(t_canvas *x); + static void*hexloader_fakenew(t_symbol *s, int argc, t_atom *argv); + t_pd pd_objectmaker; /* factory for creating "object" boxes */ + #endif + + typedef struct _filepath + { + t_symbol*filename; + t_symbol*pathname; + } t_filepath; + + + typedef void (*t_hexloader_setup)(void);
*************** *** 129,132 **** --- 148,152 ---- */
+ /* -------------------- utilities --------------------- */
*************** *** 553,557 ****
! static void*hexloader_new(t_symbol *s, int argc, t_atom *argv); /** * try to open a file (given via pathname+filename) as a patcher --- 573,577 ----
! /** * try to open a file (given via pathname+filename) as a patcher *************** *** 563,573 **** */
/* this only gets called if we have already found an abstraction-file */ ! static int hexloader_loadpatch(char*pathname, char*filename, char*altclassname, char*realclassname) { char fullfile[MAXPDSTRING]; sprintf(fullfile, "%s/%s", pathname, filename);
post("BUG: hexloader not loading patch: %s (not yet implemented)", fullfile); return 0; } --- 583,605 ---- */
+ /* this only gets called if we have already found an abstraction-file */ ! static t_filepath*hexloader_loadpatch(char*pathname, char*filename, char*altclassname, char*realclassname) { char fullfile[MAXPDSTRING]; sprintf(fullfile, "%s/%s", pathname, filename);
+ #ifdef HEXLOADER_PATCHES + class_addcreator((t_newmethod)hexloader_fakenew, gensym(realclassname), A_GIMME, 0); + { + t_filepath*result=getbytes(sizeof(t_filepath)); + result->filename=gensym(filename); + result->pathname=gensym(pathname); + return result; + } + + #else post("BUG: hexloader not loading patch: %s (not yet implemented)", fullfile); + #endif /* HEXLOADER_PATCHES */ return 0; } *************** *** 597,602 **** * @return 1 on success, 0 on failure */ ! static int hexloader_doloader(t_canvas *canvas, filelist_t*altnames0, char*classname) ! { int fd = -1; char dirbuf[MAXPDSTRING]; --- 629,634 ---- * @return 1 on success, 0 on failure */ ! ! static int hexloader_trylibraries(filelist_t*altnames0) { int fd = -1; char dirbuf[MAXPDSTRING]; *************** *** 624,627 **** --- 656,667 ---- }
+ return 0; + } + static t_filepath*hexloader_trypatches(filelist_t*altnames0, char*classname) { + int fd = -1; + char dirbuf[MAXPDSTRING]; + char*nameptr; + filelist_t*altnames=altnames0; + /* try patches */ altnames=altnames0; *************** *** 632,641 **** while(extent!=0) { if ((fd = open_via_path(".", altname, extent, dirbuf, &nameptr, MAXPDSTRING, 0)) >= 0) { close (fd); ! if(hexloader_loadpatch(dirbuf, nameptr, altname, classname)) { ! return 1; } } - extindex++; extent=patch_extent[extindex]; --- 672,682 ---- while(extent!=0) { if ((fd = open_via_path(".", altname, extent, dirbuf, &nameptr, MAXPDSTRING, 0)) >= 0) { + t_symbol*s; close (fd); ! t_filepath*fp=hexloader_loadpatch(dirbuf, nameptr, altname, classname); ! if(fp) { ! return fp; } } extindex++; extent=patch_extent[extindex]; *************** *** 643,646 **** --- 684,703 ---- altnames=altnames->next; } + + return 0; + } + + static int hexloader_doloader(t_canvas *canvas, filelist_t*altnames0, char*classname) + { + t_filepath*fp=0; + if(hexloader_trylibraries(altnames0)) + return 1; + + fp=hexloader_trypatches(altnames0, classname); + if(fp) { + freebytes(fp, sizeof(t_filepath)); + return 1; + } + return 0; } *************** *** 675,686 **** }
! static void*hexloader_new(t_symbol *s, int argc, t_atom *argv) ! { ! if(s==gensym("hexloader")) { ! t_hexloader*x = (t_hexloader*)pd_new(hexloader_class); ! return (x); }
! return 0; }
--- 732,775 ---- }
! #ifdef HEXLOADER_PATCHES ! static void*hexloader_fakenew(t_symbol*s, int argc, t_atom*argv) { ! t_pd*current = s__X.s_thing; ! t_filepath*fp=0; ! filelist_t*altnames=0; ! ! post("hexloader: disguising as '%s'", s->s_name); ! ! if(!pd_objectmaker) { ! post("BUG: no pd_objectmaker found"); ! return 0; }
! /* get alternatives */ ! altnames=hexloader_getalternatives(s->s_name); ! /* do the loading */ ! fp=hexloader_trypatches(altnames, s->s_name); ! /* clean up */ ! filelist_clear(altnames); ! ! if(fp) { ! canvas_setargs(argc, argv); ! binbuf_evalfile(fp->filename, fp->pathname); ! freebytes(fp, sizeof(t_filepath)); ! if (s__X.s_thing != current) ! canvas_popabstraction((t_canvas *)(s__X.s_thing)); ! canvas_setargs(0, 0); ! return pd_newest(); ! } else ! return 0; ! } ! #endif /* HEXLOADER_PATCHES */ ! ! #endif /* PD_MINOR_VERSION>=40 */ ! ! ! static void*hexloader_new(t_symbol *s, int argc, t_atom *argv) ! { ! t_hexloader*x = (t_hexloader*)pd_new(hexloader_class); ! return (x); }