/*
*/
-#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; i<argc; i++) Tcl_IncrRefCount(argv[i]);
+
invoke= Tcl_DuplicateObj(si->obj);
Tcl_IncrRefCount(invoke);
- rc= Tcl_ListObjReplace(si->ip,invoke,si->llength,0,argc,argv);
- for (i=0; i<argc; i++) { Tcl_DecrRefCount(argv[i]); argv[i]= 0; }
+ if (si->xargs) {
+ 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);
rc= 0;
x_rc:
+ for (i=0; i<argc; i++) Tcl_DecrRefCount(argv[i]);
if (invoke) Tcl_DecrRefCount(invoke);
- if (rc) Tcl_BackgroundError(si->ip);
+ 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);
+}