+
+
+/* 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) ();
+ }
+}