# HG changeset patch # User Richard M. Stallman # Date 807663183 0 # Node ID 2a8036f0b585ebdc38662340225acabd3627362d # Parent 2c1f71512d5da7fc51b359bff0b319ebee647aa0 (run_hook_with_args): Add gcpros. (run_hook_list_with_args): New function. diff -r 2c1f71512d5d -r 2a8036f0b585 src/eval.c --- 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