#include <stdio.h>
#include <stdlib.h>
#include "/home/gps/runtime/include/tcl.h"


#define TCL_OBJ_CMD_ARGS ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]

int fancy_eval (TCL_OBJ_CMD_ARGS) {
 if (2 != objc) {
  Tcl_WrongNumArgs (interp, 1, objv, "script");
  return TCL_ERROR;
 }

 return Tcl_EvalObjEx (interp, objv[1], 0);
}


int main (int argc, char *argv[]) {
 Tcl_Interp *interp;
 char cmd[] = "set method {set i 123; puts $i}; proc instance.handler m { fancy.eval $m };" \
  "instance.handler $method;" "set broken {puts $fuzzball}; instance.handler $broken; puts FOO;";

 Tcl_FindExecutable (argv[0]);
  
 interp = Tcl_CreateInterp ();

 if (TCL_OK != Tcl_Init (interp)) {
  fprintf (stderr, "error %s\n", Tcl_GetStringResult (interp));
  return EXIT_FAILURE;
 }

 Tcl_CreateObjCommand (interp, "fancy.eval", fancy_eval, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);

 if (TCL_OK != Tcl_EvalEx (interp, cmd, strlen (cmd), 0)) {
  fprintf (stderr, "error %s\n", Tcl_GetStringResult (interp));
 }
 
 return EXIT_SUCCESS;
}
