+
+/* 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 *> (c->implementation ());
+
+ if (!context_first)
+ {
+ engraver_each (tg->get_simple_trans_list (),
+ ptr);
+
+ (tg->*ptr) ();
+ }
+
+ for (SCM s = c->children_contexts (); scm_is_pair (s);
+ s = scm_cdr (s))
+ {
+ recurse_down_engravers (unsmob_context (scm_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; scm_is_pair (p); p = scm_cdr (p))
+ {
+ Engraver *e = dynamic_cast<Engraver *> (unsmob_translator (scm_car (p)));
+ if (e)
+ (e->*method) ();
+ }
+}