chiark / gitweb /
default resolvers
[chiark-tcl.git] / base / scriptinv.c
index b27654e8b41827192966642af16480394a699346..cdaec8b3011af0f8610623b75a9b687932483df0 100644 (file)
@@ -14,16 +14,23 @@ void scriptinv_cancel(ScriptToInvoke *si) {
   }
 }
 
-int scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip, Tcl_Obj *newscript) {
-  int rc;
+int 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;
-
+  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;
 }  
@@ -35,10 +42,16 @@ void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv) {
   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);
+  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);
   for (i=0; i<argc; i++) { Tcl_DecrRefCount(argv[i]); argv[i]= 0; }
   if (rc) goto x_rc;