+
+
+SCM
+find_acknowledge_engravers (SCM gravlist, SCM meta_alist)
+{
+ SCM ifaces = gh_cdr (scm_assoc (ly_symbol2scm ("interfaces"), meta_alist));
+
+ SCM l = SCM_EOL;
+ for (SCM s = gravlist; ly_pair_p (s); s = ly_cdr (s))
+ {
+ Translator* tr = unsmob_translator (ly_car (s));
+ if (engraver_valid (tr, ifaces))
+ l = scm_cons (tr->self_scm (), l);
+ }
+ l = scm_reverse_x (l, SCM_EOL);
+
+ return l;
+}
+
+
+/* c&p engraver-group.cc */
+void
+recurse_down_engravers (Context * c, Engraver_method ptr, bool context_first)
+{
+ Engraver_group_engraver * tg
+ = dynamic_cast<Engraver_group_engraver*> (unsmob_translator (c->implementation_));
+
+
+ if (!context_first)
+ {
+ engraver_each (tg->get_simple_trans_list (),
+ ptr);
+
+ (tg->*ptr) ();
+ }
+
+ for (SCM s = c->context_list_ ; gh_pair_p (s);
+ s =gh_cdr (s))
+ {
+ recurse_down_engravers (unsmob_context (gh_car (s)), ptr, context_first);
+ }
+
+ if (context_first)
+ {
+ engraver_each (tg->get_simple_trans_list (),
+ ptr);
+ (tg->*ptr) ();
+ }
+}
+
+
+void
+engraver_each (SCM list, Engraver_method method)
+{
+ for (SCM p = list; gh_pair_p (p); p = ly_cdr (p))
+ {
+ Engraver * e = dynamic_cast<Engraver*>(unsmob_translator (ly_car (p)));
+ if (e)
+ (e->*method) ();
+ }
+}