#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include /* for malloc */ #include "tcl.h" int _tcl_argc; char *_tcl_argv[] = { "tclsh", }; Tcl_Interp *interp = NULL; #define DECREF(x) { Tcl_DecrRefCount(x); } #define PERROR printf #ifndef SvPV_nolen static STRLEN n_a; #define SvPV_nolen(x) SvPV(x,n_a) #endif /**************************** * SV* Tcl2Pl(Tcl_Obj *obj) * * Converts Tcl Objects to Perl data structures * ****************************/ SV* Tcl2Pl (char *result, char *perl_class) { /* Here is how it does it: * o If obj is a String, Integer, or Float, we convert it to an SV; * o If obj is a List or Tuple, we convert it to an AV; * o If obj is a Dictionary, we convert it to an HV. */ SV *s2; s2 = newSVpv(result,0); return s2; } /**************************** * Tcl_Obj* Pl2Py(SV *obj) * * Converts a Perl data structures to a Tcl Object ****************************/ char *Pl2Tcl (SV *obj) { char *str; str = (char *)SvPV(obj, PL_na); return str; } MODULE = Inline::Tcl PACKAGE = Inline::Tcl BOOT: interp = Tcl_CreateInterp(); Tcl_Init(interp); PROTOTYPES: DISABLE void _Inline_parse_tcl_namespace() PREINIT: Tcl_Obj *listPtr, *elemObjPtr; Tcl_Obj **objvPtr; char *result; int objc,i; AV* functions = newAV(); PPCODE: /* * Get the pattern and find the "effective namespace" in which to * list commands. */ if (TCL_ERROR == Tcl_Eval(interp, "info commands") ) { PERROR("Namespace: Eval Error\n"); } listPtr = Tcl_GetObjResult(interp); /* error check ? */ if (TCL_ERROR == Tcl_ListObjGetElements(interp, listPtr, &objc, &objvPtr)){ PERROR("Namespace: List error\n"); } if (TCL_ERROR == Tcl_ListObjLength(interp, listPtr, &objc) ) { PERROR("Namespace: List Length error\n"); } for (i=0;i