[PD-cvs] externals/hcs import.c,NONE,1.1 import-help.pd,NONE,1.1

Hans-Christoph Steiner eighthave at users.sourceforge.net
Sun Nov 26 07:01:16 CET 2006


Update of /cvsroot/pure-data/externals/hcs
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23547

Added Files:
	import.c import-help.pd 
Log Message:
moved import to here from loaders; got both 0.39 and 0.40 behaviors working, 0.40 uses patch-local namespace, 0.39 uses global (making it the same as [classpath])

--- NEW FILE: import.c ---
/*
 * This object loads libraries and libdirs from within a patch. It is the
 * first small step towards a patch-specific namespace.  Currently, it just
 * adds things to the global path.  It is a reimplementation of a similar/same
 * idea from Guenter Geiger's [using] object.   <hans at at.or.at>
 *
 * This object currently depends on the packages/patches/libdir-0.38-4.patch
 * for sys_load_lib_dir().
 */

#include "m_pd.h"
#include "s_stuff.h"
#include "g_canvas.h"

#include <string.h>

/* WARNING: KLUDGE!  */
/*
 * this struct is not publically defined (its in g_canvas.c) so I need to
 * include this here.  Its from Pd 0.41-test03 2006-11-19. */
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" */
    t_namelist *ce_path;   /* search path */
};


static char *version = "$Revision: 1.1 $";

t_int import_instance_count;

#define DEBUG(x)
//#define DEBUG(x) x 

/*------------------------------------------------------------------------------
 *  CLASS DEF
 */
static t_class *import_class;

typedef struct _import
{
	t_object            x_obj;
	t_canvas            *x_canvas;
	t_namelist          *x_top;
	t_namelist          *x_current;
	char                x_classpath_root[MAXPDSTRING];
	t_outlet            *x_data_outlet;
	t_outlet            *x_status_outlet;
} t_import;


static int load_library(t_import *x, char *library_name)
{
	DEBUG(post("load_library"););
#if (PD_MINOR_VERSION >= 40)
    if (!sys_load_lib(x->x_canvas, library_name)) return 0;
#else
/* sys_load_lib_dir is only used on Pd-extended < 0.40 */
    if (!sys_load_lib(sys_libdir->s_name, library_name))
        if (!sys_load_lib_dir(sys_libdir->s_name, library_name)) 
            return 0;
#endif /* (PD_MINOR_VERSION >= 40) */
	return 1;
}


static void load_arguments(t_import *x, int argc, t_atom *argv)
{
    t_symbol *library_name;
    
    while (argc--) {
        switch (argv->a_type) {
        case A_FLOAT:
            post("[import] ERROR: floats not supported: %f",
				 atom_getfloat(argv));
            break;
        case A_SYMBOL:
            library_name = atom_getsymbol(argv);
            if (!load_library(x,library_name->s_name))
				post("[import]: ERROR: can't load library in %s", 
					 library_name->s_name);
			else
				post("[import] loaded library: %s",library_name->s_name);
            break;
        default:
            post("[import] ERROR: Unsupported atom type");
        }
        argv++;
    }
}


static void import_output(t_import* x)
{
	DEBUG(post("import_output"););
	char buffer[MAXPDSTRING];

	if(x->x_current)
	{
		post("current string: %s",  x->x_current->nl_string);
		strncpy(buffer, x->x_current->nl_string, MAXPDSTRING);
		post("current string buffer: %s",  buffer);
		outlet_symbol( x->x_data_outlet, gensym(buffer) );
		x->x_current = x->x_current->nl_next;
	}
	else 
		outlet_bang(x->x_status_outlet);
}


static void import_reset(t_import* x) 
{
/* on >= 0.40, this class uses the patch-local paths, on older versions
 * before that existed, this class uses the global classpath */
#if (PD_MINOR_VERSION >= 40)
	x->x_top = canvas_getenv(x->x_canvas)->ce_path;
#else
	x->x_top = sys_searchpath;
#endif /* (PD_MINOR_VERSION >= 40) */
	x->x_current = x->x_top;
}


static void *import_new(t_symbol *s, int argc, t_atom *argv)
{
    t_import *x = (t_import *)pd_new(import_class);
	t_symbol *currentdir;

	if(import_instance_count == 0) 
	{
		post("[import] %s",version);  
		post("\twritten by Hans-Christoph Steiner <hans at at.or.at>");
		post("\tcompiled on "__DATE__" at "__TIME__ " ");
		post("\tcompiled against Pd version %d.%d.%d", PD_MAJOR_VERSION, 
			 PD_MINOR_VERSION, PD_BUGFIX_VERSION);
	}
	import_instance_count++;

	strncpy(x->x_classpath_root, sys_libdir->s_name, MAXPDSTRING - 7);
	strcat(x->x_classpath_root, "/extra");

	x->x_data_outlet = outlet_new(&x->x_obj, &s_symbol);
	x->x_status_outlet = outlet_new(&x->x_obj, 0);

	x->x_canvas = canvas_getcurrent();
	load_arguments(x,argc,argv);
	import_reset(x);
	
	return (x);
}


static void import_free(t_import *x)
{
  /* TODO: look into freeing the namelist.  It probably does not need to
   * happen, since this class is just copying the pointer of an existing
   * namelist that is handled elsewhere. */

/* TODO: perhaps this should remove any libs that this instance had added to
 * the namespace */
}


void import_setup(void)
{
    import_class = class_new(gensym("import"), (t_newmethod)import_new,
                             (t_method)import_free,
                             sizeof(t_import), 
                             CLASS_DEFAULT, 
                             A_GIMME, 
                             0);
	/* add inlet atom methods */
	class_addbang(import_class,(t_method) import_output);
	
	/* add inlet selector methods */
	class_addmethod(import_class,(t_method) import_reset,
					gensym("reset"), 0);
}

--- NEW FILE: import-help.pd ---
#N canvas 476 83 473 364 10;
#X msg 21 102 bang;
#X obj 21 150 import ext13 memento rradical;
#X text 247 315 released under the GNU GPL;
#X msg 33 126 reset;
#X symbolatom 32 176 0 0 0 0 - - -;
#X obj 21 202 print;
#X text 68 101 get next item in list of loaded libs;
#X text 80 125 start at the top of the list again;
#X text 18 22 [import] loads libraries from the patch. On Pd 0.4 or
greater \, it loads the library into the patch's local namespace. On
older versions \, it loads the libraries into the global namespace.
;
#X text 29 239 Sending bangs to [import] makes it output the loaded
libraries one at a time.;
#X text 18 301 (C) Copyright 2004-6 Hans-Christoph Steiner <hans at at.or.at>
;
#X connect 0 0 1 0;
#X connect 1 0 4 0;
#X connect 1 0 5 0;
#X connect 3 0 1 0;





More information about the Pd-cvs mailing list