file reorg, pathnames.h, paths.h
[unix-history] / usr / src / old / dbx / runtime.c
index f8631c0..5bc63ea 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)runtime.c  5.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)runtime.c  5.3 (Berkeley) %G%";
 #endif not lint
 
 static char rcsid[] = "$Header: runtime.c,v 1.5 84/12/26 10:41:52 linton Exp $";
 #endif not lint
 
 static char rcsid[] = "$Header: runtime.c,v 1.5 84/12/26 10:41:52 linton Exp $";
@@ -801,7 +801,11 @@ Node arglist;
     int argc, args_size;
 
     savesp = sp;
     int argc, args_size;
 
     savesp = sp;
-    argc = evalargs(proc, arglist);
+    if (varIsSet("$unsafecall")) {
+       argc = unsafe_evalargs(proc, arglist);
+    } else {
+       argc = evalargs(proc, arglist);
+    }
     args_size = sp - savesp;
     setreg(STKP, reg(STKP) - args_size);
     dwrite(savesp, reg(STKP), args_size);
     args_size = sp - savesp;
     setreg(STKP, reg(STKP) - args_size);
     dwrite(savesp, reg(STKP), args_size);
@@ -952,6 +956,28 @@ Node arglist;
     return count;
 }
 
     return count;
 }
 
+/*
+ * Evaluate an argument list without concern for matching the formal
+ * parameters of a function in type or quantity.  Useful for functions
+ * like C's printf().
+ */
+
+private integer unsafe_evalargs(proc, arglist)
+Symbol proc;
+Node arglist;
+{
+    Node p;
+    Integer count;
+
+    count = 0;
+    for (p = arglist; p != nil; p = p->value.arg[1]) {
+       assert(p->op == O_COMMA);
+       eval(p->value.arg[0]);
+       ++count;
+    }
+    return count;
+}
+
 public procreturn(f)
 Symbol f;
 {
 public procreturn(f)
 Symbol f;
 {
@@ -979,7 +1005,7 @@ Symbol f;
     } else {
        putchar('\n');
        printname(stdout, f);
     } else {
        putchar('\n');
        printname(stdout, f);
-       printf(" returns successfully\n", symname(f));
+       printf("%s returns successfully\n", symname(f));
     }
     erecover();
 }
     }
     erecover();
 }