X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;ds=sidebyside;f=base%2Fscriptinv.c;h=644459a0f0ec8ebd261ea39c10d399df2509dcc3;hb=500e760d7840a4968afc8a0d720d0019a5e422b4;hp=b27654e8b41827192966642af16480394a699346;hpb=ed7354bcb695fcf3ee3f5cea14be209fbb99f161;p=chiark-tcl.git diff --git a/base/scriptinv.c b/base/scriptinv.c index b27654e..644459a 100644 --- a/base/scriptinv.c +++ b/base/scriptinv.c @@ -1,45 +1,56 @@ /* */ -#include "hbytes.h" +#include "chiark-tcl-base.h" -void scriptinv_init(ScriptToInvoke *si) { +void cht_scriptinv_init(ScriptToInvoke *si) { si->obj= 0; + si->xargs= 0; } -void scriptinv_cancel(ScriptToInvoke *si) { - if (si->obj) { - Tcl_DecrRefCount(si->obj); - si->obj= 0; - } +void cht_scriptinv_cancel(ScriptToInvoke *si) { + if (si->obj) { Tcl_DecrRefCount(si->obj); si->obj= 0; } + if (si->xargs) { Tcl_DecrRefCount(si->xargs); si->xargs= 0; } } -int scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip, Tcl_Obj *newscript) { - int rc; +int cht_scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip, + Tcl_Obj *newscript, Tcl_Obj *xargs) { + int rc, xlength; - scriptinv_cancel(si); - - rc= Tcl_ListObjLength(ip, newscript, &si->llength); - if (rc) return rc; + cht_scriptinv_cancel(si); + rc= Tcl_ListObjLength(ip, newscript, &si->llength); if (rc) return rc; Tcl_IncrRefCount(newscript); + + if (xargs) { + rc= Tcl_ListObjLength(ip, xargs, &xlength); if (rc) return rc; + Tcl_IncrRefCount(xargs); + si->llength += xlength; + } + si->obj= newscript; + si->xargs= xargs; si->ip= ip; return 0; } -void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv) { +int cht_scriptinv_invoke_fg(ScriptToInvoke *si, int argc, + Tcl_Obj *const *argv) { Tcl_Obj *invoke=0; int i, rc; assert(si->obj); - for (i=0; iobj); Tcl_IncrRefCount(invoke); - rc= Tcl_ListObjReplace(si->ip,invoke,si->llength,0,argc,argv); - for (i=0; ixargs) { + rc= Tcl_ListObjAppendList(si->ip, invoke, si->xargs); + if (rc) goto x_rc; + } + + rc= Tcl_ListObjReplace(si->ip, invoke,si->llength,0, argc,argv); if (rc) goto x_rc; rc= Tcl_EvalObjEx(si->ip,invoke,TCL_EVAL_GLOBAL|TCL_EVAL_DIRECT); @@ -48,6 +59,13 @@ void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv) { rc= 0; x_rc: + for (i=0; iip); + return rc; } + +void cht_scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj *const *argv) { + int rc; + rc= cht_scriptinv_invoke_fg(si, argc, argv); + if (rc) Tcl_BackgroundError(si->ip); +}