From 066a639c0bb28d759c017ab2e00624dfb0a64b3f Mon Sep 17 00:00:00 2001 From: mescalinum Date: Fri, 28 Aug 2009 21:34:18 +0000 Subject: improve errors printouts, and cleanup svn path=/trunk/externals/tclpd/; revision=12132 --- tcl_loader.cxx | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) (limited to 'tcl_loader.cxx') diff --git a/tcl_loader.cxx b/tcl_loader.cxx index d4b45d1..fececed 100644 --- a/tcl_loader.cxx +++ b/tcl_loader.cxx @@ -7,18 +7,22 @@ extern "C" int tclpd_do_load_lib(t_canvas *canvas, char *objectname) char filename[MAXPDSTRING], dirbuf[MAXPDSTRING], *classname, *nameptr; int fd; - if (classname = strrchr(objectname, '/')) + + if ((classname = strrchr(objectname, '/')) != NULL) classname++; - else classname = objectname; - if (sys_onloadlist(objectname)) - { + else + classname = objectname; + + if(sys_onloadlist(objectname)) { post("%s: already loaded", objectname); return (1); } + /* try looking in the path for (objectname).(tcl) ... */ if ((fd = canvas_open(canvas, objectname, ".tcl", dirbuf, &nameptr, MAXPDSTRING, 1)) >= 0) goto gotone; + /* next try (objectname)/(classname).(tcl) ... */ strncpy(filename, objectname, MAXPDSTRING); filename[MAXPDSTRING-2] = 0; @@ -28,7 +32,9 @@ extern "C" int tclpd_do_load_lib(t_canvas *canvas, char *objectname) if ((fd = canvas_open(canvas, filename, ".tcl", dirbuf, &nameptr, MAXPDSTRING, 1)) >= 0) goto gotone; - return (0); + + return 0; + gotone: close(fd); class_set_extern_dir(gensym(dirbuf)); @@ -42,13 +48,28 @@ gotone: // load tcl: char b[MAXPDSTRING+10]; snprintf(&b[0], MAXPDSTRING+10, "source %s", filename); - if (Tcl_Eval(tcl_for_pd,b) == TCL_OK) - post("Tcl_loader: loaded %s", b); - else - post("Tcl_loader: error trying to load %s", b); + int result = Tcl_Eval(tcl_for_pd, b); + if(result == TCL_OK) { + 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"); + return 0; + } class_set_extern_dir(&s_); sys_putonloadlist(objectname); - return (1); + return 1; } -- cgit v1.2.1