changeset 12781:2a8036f0b585

(run_hook_with_args): Add gcpros. (run_hook_list_with_args): New function.
author Richard M. Stallman <rms@gnu.org>
date Sat, 05 Aug 1995 22:53:03 +0000
parents 2c1f71512d5d
children 029baa39289d
files src/eval.c
diffstat 1 files changed, 57 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c	Sat Aug 05 22:51:17 1995 +0000
+++ b/src/eval.c	Sat Aug 05 22:53:03 1995 +0000
@@ -1906,6 +1906,14 @@
   return run_hook_with_args (nargs, args, until_failure);
 }
 
+/* ARGS[0] should be a hook symbol.
+   Call each of the functions in the hook value, passing each of them
+   as arguments all the rest of ARGS (all NARGS - 1 elements).
+   COND specifies a condition to test after each call
+   to decide whether to stop.
+   The caller (or its caller, etc) must gcpro all of ARGS,
+   except that it isn't necessary to gcpro ARGS[0].  */
+
 Lisp_Object
 run_hook_with_args (nargs, args, cond)
      int nargs;
@@ -1913,11 +1921,14 @@
      enum run_hooks_condition cond;
 {
   Lisp_Object sym, val, ret;
+  struct gcpro gcpro1, gcpro2;
 
   sym = args[0];
   val = find_symbol_value (sym);
   ret = (cond == until_failure ? Qt : Qnil);
 
+  GCPRO2 (sym, val);
+
   if (EQ (val, Qunbound) || NILP (val))
     return ret;
   else if (!CONSP (val) || EQ (XCONS (val)->car, Qlambda))
@@ -1958,6 +1969,52 @@
       return ret;
     }
 }
+
+/* Run a hook symbol ARGS[0], but use FUNLIST instead of the actual
+   present value of that symbol.
+   Call each element of FUNLIST,
+   passing each of them the rest of ARGS.
+   The caller (or its caller, etc) must gcpro all of ARGS,
+   except that it isn't necessary to gcpro ARGS[0].  */
+
+Lisp_Object
+run_hook_list_with_args (funlist, nargs, args)
+     Lisp_Object funlist;
+     int nargs;
+     Lisp_Object *args;
+{
+  Lisp_Object sym;
+  Lisp_Object val;
+  struct gcpro gcpro1, gcpro2;
+
+  sym = args[0];
+  GCPRO2 (sym, val);
+
+  for (val = funlist; CONSP (val); val = XCONS (val)->cdr)
+    {
+      if (EQ (XCONS (val)->car, Qt))
+	{
+	  /* t indicates this hook has a local binding;
+	     it means to run the global binding too.  */
+	  Lisp_Object globals;
+
+	  for (globals = Fdefault_value (sym);
+	       CONSP (globals);
+	       globals = XCONS (globals)->cdr)
+	    {
+	      args[0] = XCONS (globals)->car;
+	      Ffuncall (nargs, args);
+	    }
+	}
+      else
+	{
+	  args[0] = XCONS (val)->car;
+	  Ffuncall (nargs, args);
+	}
+    }
+  UNGCPRO;
+  return Qnil;
+}
 
 /* Apply fn to arg */
 Lisp_Object