diff options
author | mescalinum <mescalinum@users.sourceforge.net> | 2009-08-29 18:48:03 +0000 |
---|---|---|
committer | mescalinum <mescalinum@users.sourceforge.net> | 2009-08-29 18:48:03 +0000 |
commit | ba069019909c54f3c90b7fec51c145f88cf99e3e (patch) | |
tree | 7c4c145db150737cff0a928452920af64670d799 | |
parent | 8b65741620bae448b96eb8ce59b85a7b1bb36c44 (diff) |
add proxy inlet. still some unresolved TypeError, will continue the work tomorrow
svn path=/trunk/externals/tclpd/; revision=12134
-rw-r--r-- | Makefile | 9 | ||||
-rw-r--r-- | pdlib.tcl | 9 | ||||
-rw-r--r-- | tcl.i | 12 | ||||
-rw-r--r-- | tcl_class.cxx | 19 | ||||
-rw-r--r-- | tcl_extras.h | 15 | ||||
-rw-r--r-- | tcl_loader.cxx | 17 | ||||
-rw-r--r-- | tcl_setup.cxx | 17 |
7 files changed, 69 insertions, 29 deletions
@@ -37,7 +37,7 @@ clean:: .SUFFIXES: .cxx .o -SRCS = tcl_wrap.cxx tcl_typemap.cxx tcl_class.cxx tcl_setup.cxx tcl_loader.cxx +SRCS = tcl_wrap.cxx tcl_typemap.cxx tcl_class.cxx tcl_proxyinlet.cxx tcl_setup.cxx tcl_loader.cxx OBJS = ${SRCS:.cxx=.o} tcl_wrap.cxx:: tcl.i tcl_extras.h Makefile @@ -46,5 +46,10 @@ tcl_wrap.cxx:: tcl.i tcl_extras.h Makefile .cxx.o:: tcl_extras.h Makefile $(CXX) $(CFLAGS) $(INCLUDES) -xc++ -c $< -$(LIBNAME)$(PDSUF):: tcl_extras.h Makefile $(OBJS) +$(LIBNAME)$(PDSUF):: tcl_extras.h Makefile $(OBJS) pdlib_tcl_syntax $(LDSHARED) $(CFLAGS) -o $(LIBNAME)$(PDSUF) $(OBJS) $(LDSOFLAGS) + +pdlib_tcl_syntax: pdlib.tcl + @echo -n "checking pdlib.tcl for syntax..." + @tclsh pdlib.tcl >/dev/null 2>&1 + @echo " OK" @@ -30,9 +30,10 @@ namespace eval ::pd { #lappend _($self:x_inlet) [symbolinlet_new [tclpd_get_object $self] $ptr] } list { - set ptr [new_t_alist] - alist_init $ptr - alist_list $ptr 0 3 {some test args} + set ptr [new_t_proxyinlet] + proxyinlet_init $ptr + #proxyinlet_list $ptr [gensym list] 2 {{symbol foo} {symbol bar}} + inlet_new [tclpd_get_object $self] [$ptr cget -pd] 0 {} lappend _($self:p_inlet) $ptr lappend _($self:t_inlet) "list" } @@ -60,7 +61,7 @@ namespace eval ::pd { variable _ set p_inlet [lindex $_($self:p_inlet) [expr $n-1]] if {$_($self:t_inlet) == {list}} { - return [$p_inlet value] + return [$p_inlet argv] } else { return [$p_inlet value] } @@ -60,8 +60,12 @@ %typemap(in) t_atom * { t_atom *a = (t_atom*)getbytes(sizeof(t_atom)); - if(tcl_to_pd($input, a) == TCL_ERROR) + if(tcl_to_pd($input, a) == TCL_ERROR) { +#ifdef DEBUG + post("Tcl SWIG: typemap(in) error"); +#endif return TCL_ERROR; + } $1 = a; } @@ -71,8 +75,12 @@ %typemap(out) t_atom* { Tcl_Obj* res_obj; - if(pd_to_tcl($1, &res_obj) == TCL_ERROR) + if(pd_to_tcl($1, &res_obj) == TCL_ERROR) { +#ifdef DEBUG + post("Tcl SWIG: typemap(out) error"); +#endif return TCL_ERROR; + } Tcl_SetObjResult(tcl_for_pd, res_obj); } diff --git a/tcl_class.cxx b/tcl_class.cxx index a95bf5c..bb070f9 100644 --- a/tcl_class.cxx +++ b/tcl_class.cxx @@ -33,20 +33,22 @@ t_tcl* tclpd_new(t_symbol *classsym, int ac, t_atom *at) { av[1] = self->self; for(int i=0; i<ac; i++) { if(pd_to_tcl(&at[i], &av[2+i]) == TCL_ERROR) { - post("tcl error: %s\n", Tcl_GetStringResult(tcl_for_pd)); + //post("tcl error: %s\n", Tcl_GetStringResult(tcl_for_pd)); + tclpd_interp_error(TCL_ERROR); pd_free((t_pd *)self); return 0; } } - if (Tcl_EvalObjv(tcl_for_pd,ac+2,av,0) != TCL_OK) { - post("tcl error: %s\n", Tcl_GetStringResult(tcl_for_pd)); + if(Tcl_EvalObjv(tcl_for_pd,ac+2,av,0) != TCL_OK) { + //post("tcl error: %s\n", Tcl_GetStringResult(tcl_for_pd)); + tclpd_interp_error(TCL_ERROR); pd_free((t_pd *)self); return 0; } return self; } -void tclpd_free (t_tcl *self) { +void tclpd_free(t_tcl *self) { #ifdef DEBUG post("tclpd_free called"); #endif @@ -62,14 +64,17 @@ void tclpd_anything(t_tcl *self, t_symbol *s, int ac, t_atom *at) { Tcl_IncrRefCount(av[1]); for(int i=0; i<ac; i++) { if(pd_to_tcl(&at[i], &av[2+i]) == TCL_ERROR) { - post("Tcl error: %s\n", Tcl_GetStringResult(tcl_for_pd)); + //post("Tcl error: %s\n", Tcl_GetStringResult(tcl_for_pd)); + tclpd_interp_error(TCL_ERROR); return; } } int result = Tcl_EvalObjv(tcl_for_pd,ac+2,av,0); Tcl_DecrRefCount(av[1]); - if (result != TCL_OK) - post("Tcl error: %s\n", Tcl_GetStringResult(tcl_for_pd)); + if (result != TCL_OK) { + //post("Tcl error: %s\n", Tcl_GetStringResult(tcl_for_pd)); + tclpd_interp_error(TCL_ERROR); + } } /* Tcl glue: */ diff --git a/tcl_extras.h b/tcl_extras.h index e3546c6..a540dad 100644 --- a/tcl_extras.h +++ b/tcl_extras.h @@ -11,6 +11,20 @@ typedef struct _t_tcl { Tcl_Obj *self; } t_tcl; +typedef struct _t_proxyinlet { + t_pd pd; + int argc; + t_atom* argv; +} t_proxyinlet; + +/* tcl_proxyinlet.cxx */ +void proxyinlet_init(t_proxyinlet* x); +void proxyinlet_clear(t_proxyinlet* x); +void proxyinlet_list(t_proxyinlet* x, t_symbol* s, int argc, t_atom* argv); +void proxyinlet_anything(t_proxyinlet* x, t_symbol* s, int argc, t_atom* argv); +void proxyinlet_clone(t_proxyinlet* x, t_proxyinlet* y); +void proxyinlet_setup(void); + /* tcl_wrap.cxx */ extern "C" int Tclpd_SafeInit(Tcl_Interp *interp); @@ -21,6 +35,7 @@ int tcl_to_pd (Tcl_Obj* input, t_atom* output); /* tcl_setup.cxx */ extern Tcl_Interp *tcl_for_pd; extern "C" void tclpd_setup(void); +void tclpd_interp_error(int result); /* tcl_class.cxx */ t_class* tclpd_class_new(char *name, int flags); diff --git a/tcl_loader.cxx b/tcl_loader.cxx index e7f22ff..5358ff5 100644 --- a/tcl_loader.cxx +++ b/tcl_loader.cxx @@ -52,21 +52,10 @@ gotone: snprintf(&b[0], MAXPDSTRING+10, "source %s", filename); int result = Tcl_Eval(tcl_for_pd, b); if(result == TCL_OK) { - post("Tcl_loader: loaded %s", filename); + post("Tcl loader: loaded %s", filename); } else { - post("Tcl_loader: error trying to load %s", filename); - post("Error: %s", Tcl_GetStringResult(tcl_for_pd)); - post("(see stderr for details)"); - - fprintf(stderr, "------------------- Tcl error: -------------------\n"); - Tcl_Obj* dict = Tcl_GetReturnOptions(tcl_for_pd, result); - Tcl_Obj* errorInfo = NULL; - Tcl_Obj* errorInfoK = Tcl_NewStringObj("-errorinfo", -1); - Tcl_IncrRefCount(errorInfoK); - Tcl_DictObjGet(tcl_for_pd, dict, errorInfoK, &errorInfo); - Tcl_DecrRefCount(errorInfoK); - fprintf(stderr, "%s\n", Tcl_GetStringFromObj(errorInfo, 0)); - fprintf(stderr, "--------------------------------------------------\n"); + post("Tcl loader: error trying to load %s", filename); + tclpd_interp_error(result); return 0; } diff --git a/tcl_setup.cxx b/tcl_setup.cxx index 28d6778..15eb3c3 100644 --- a/tcl_setup.cxx +++ b/tcl_setup.cxx @@ -15,6 +15,8 @@ void tclpd_setup(void) { post("Tcl loader v0.1.1 - 08.2009"); + proxyinlet_setup(); + tcl_for_pd = Tcl_CreateInterp(); Tcl_Init(tcl_for_pd); Tclpd_SafeInit(tcl_for_pd); @@ -51,3 +53,18 @@ void tclpd_setup(void) { sys_register_loader(tclpd_do_load_lib); } + +void tclpd_interp_error(int result) { + post("Tcl error: %s", Tcl_GetStringResult(tcl_for_pd)); + post(" (see stderr for details)"); + + fprintf(stderr, "------------------- Tcl error: -------------------\n"); + Tcl_Obj* dict = Tcl_GetReturnOptions(tcl_for_pd, result); + Tcl_Obj* errorInfo = NULL; + Tcl_Obj* errorInfoK = Tcl_NewStringObj("-errorinfo", -1); + Tcl_IncrRefCount(errorInfoK); + Tcl_DictObjGet(tcl_for_pd, dict, errorInfoK, &errorInfo); + Tcl_DecrRefCount(errorInfoK); + fprintf(stderr, "%s\n", Tcl_GetStringFromObj(errorInfo, 0)); + fprintf(stderr, "--------------------------------------------------\n"); +} |