#include <tcl.h> /** * puts [set a [expr {20 * 30}] */ void EvalString(Tcl_Interp *interp) { Tcl_Obj *result; char script[] = "set a [expr {20 * 30}]"; if (Tcl_Eval(interp, script) != TCL_OK) { fprintf(stderr, "Error was: %s\n", Tcl_GetStringResult(interp)); return; } result = Tcl_GetObjResult(interp); printf("%s\n", Tcl_GetStringFromObj(result, NULL)); } /** * puts [set a [expr {30 * 30}]] */ void EvalStringObj(Tcl_Interp *interp) { Tcl_Obj *script; Tcl_Obj *result; script = Tcl_NewStringObj("set a [expr {30 * 30}]", -1); Tcl_IncrRefCount(script); Tcl_EvalObjEx(interp, script, 0); result = Tcl_GetObjResult(interp); printf("%s\n", Tcl_GetStringFromObj(result, NULL)); } /** * puts {hello world} */ void EvalListObj(Tcl_Interp *interp) { Tcl_Obj *cmd; cmd = Tcl_NewObj(); Tcl_ListObjAppendElement(interp, cmd, Tcl_NewStringObj("puts", -1)); Tcl_ListObjAppendElement(interp, cmd, Tcl_NewStringObj("hello world", -1)); Tcl_IncrRefCount(cmd); Tcl_EvalObjEx(interp, cmd, 0); Tcl_DecrRefCount(cmd); } /** * puts [set a 32] */ void Eval(Tcl_Interp *interp) { int i; Tcl_Obj *scriptArr[3]; Tcl_Obj *resultObj; int result; scriptArr[0] = Tcl_NewStringObj("set", 3); scriptArr[1] = Tcl_NewStringObj("a", 1); scriptArr[2] = Tcl_NewIntObj(32); for (i = 0; i < 3; ++i) { Tcl_IncrRefCount(scriptArr[i]); } Tcl_EvalObjv(interp, 3, scriptArr, 0); for (i = 0; i < 3; ++i) { Tcl_DecrRefCount(scriptArr[i]); } resultObj = Tcl_GetObjResult(interp); Tcl_IncrRefCount(resultObj); Tcl_GetIntFromObj(interp, resultObj, &result); Tcl_DecrRefCount(resultObj); printf("%d\n", result); } int main(int argc, char *argv[]) { Tcl_Interp *interp; interp = Tcl_CreateInterp(); EvalString(interp); EvalStringObj(interp); EvalListObj(interp); Eval(interp); Tcl_DeleteInterp(interp); return 0; }
9
21
2014
21
2014