chiark / gitweb /
working on compiling out of troglodyte; before relegage maskmap
[chiark-tcl.git] / base / scriptinv.c
index 1ac7e82ea14967943949bdf7f21f42aa2d236394..3bc383d9c847cf2857573f0efc7bd8784ca3f7f8 100644 (file)
@@ -1,31 +1,31 @@
 /*
  */
 
 /*
  */
 
-#include "hbytes.h"
+#include "chiark-tcl-base.h"
 
 
-void scriptinv_init(ScriptToInvoke *si) {
+void cht_scriptinv_init(ScriptToInvoke *si) {
   si->obj= 0;
   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,
+int cht_scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip,
                  Tcl_Obj *newscript, Tcl_Obj *xargs) {
                  Tcl_Obj *newscript, Tcl_Obj *xargs) {
-  int rc;
+  int rc, xlength;
   
   
-  scriptinv_cancel(si);
+  cht_scriptinv_cancel(si);
 
   rc= Tcl_ListObjLength(ip, newscript, &si->llength);  if (rc) return rc;
   Tcl_IncrRefCount(newscript);
 
   if (xargs) {
 
   rc= Tcl_ListObjLength(ip, newscript, &si->llength);  if (rc) return rc;
   Tcl_IncrRefCount(newscript);
 
   if (xargs) {
-    rc= Tcl_ListObjLength(ip, xargs, &si->llength);  if (rc) return rc;
+    rc= Tcl_ListObjLength(ip, xargs, &xlength);  if (rc) return rc;
     Tcl_IncrRefCount(xargs);
     Tcl_IncrRefCount(xargs);
+    si->llength += xlength;
   }
 
   si->obj= newscript;
   }
 
   si->obj= newscript;
@@ -34,13 +34,13 @@ int scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip,
   return 0;
 }  
   
   return 0;
 }  
   
-void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv) {
+void cht_scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj *const *argv) {
   Tcl_Obj *invoke=0;
   int i, rc;
 
   assert(si->obj);
   Tcl_Obj *invoke=0;
   int i, rc;
 
   assert(si->obj);
-
   for (i=0; i<argc; i++) Tcl_IncrRefCount(argv[i]);
   for (i=0; i<argc; i++) Tcl_IncrRefCount(argv[i]);
+
   invoke= Tcl_DuplicateObj(si->obj);
   Tcl_IncrRefCount(invoke);
 
   invoke= Tcl_DuplicateObj(si->obj);
   Tcl_IncrRefCount(invoke);
 
@@ -50,7 +50,6 @@ void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv) {
   }
 
   rc= Tcl_ListObjReplace(si->ip, invoke,si->llength,0, argc,argv);
   }
 
   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;
 
   rc= Tcl_EvalObjEx(si->ip,invoke,TCL_EVAL_GLOBAL|TCL_EVAL_DIRECT);
   if (rc) goto x_rc;
 
   rc= Tcl_EvalObjEx(si->ip,invoke,TCL_EVAL_GLOBAL|TCL_EVAL_DIRECT);
@@ -59,6 +58,7 @@ void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv) {
   rc= 0;
   
 x_rc:
   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);
 }
   if (invoke) Tcl_DecrRefCount(invoke);
   if (rc) Tcl_BackgroundError(si->ip);
 }