X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fcontext-def.cc;h=fee67b661d043ad86a7777039fd84c7fabc53bb4;hb=9f3572d98bb948c9689cd1f75401a029451fa001;hp=738da30f81dbd9dad330dbe7e7e7da9e765d1c0c;hpb=f8f86f7e61fbea1b289f98f26e6253532dc4a356;p=lilypond.git diff --git a/lily/context-def.cc b/lily/context-def.cc index 738da30f81..fee67b661d 100644 --- a/lily/context-def.cc +++ b/lily/context-def.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2005 Han-Wen Nienhuys + (c) 2000--2006 Han-Wen Nienhuys */ /* TODO: should junk this class an replace by @@ -11,16 +11,16 @@ #include "context-def.hh" +#include "engraver-group.hh" #include "engraver.hh" +#include "international.hh" #include "output-def.hh" +#include "performer-group.hh" #include "performer.hh" #include "score-context.hh" #include "translator-group.hh" #include "warn.hh" -#include "engraver-group-engraver.hh" -#include "performer-group-performer.hh" - Context_def::Context_def () { context_aliases_ = SCM_EOL; @@ -121,15 +121,14 @@ Context_def::add_context_mod (SCM mod) { if (!get_translator (sym)) error (_f ("program has no such type: `%s'", - ly_symbol2string (sym).to_str0 ())); + ly_symbol2string (sym).c_str ())); else translator_mods_ = scm_cons (scm_list_2 (tag, sym), translator_mods_); } else if (ly_symbol2scm ("accepts") == tag || ly_symbol2scm ("denies") == tag) accept_mods_ = scm_cons (scm_list_2 (tag, sym), accept_mods_); - else if (ly_symbol2scm ("poppush") == tag - || ly_symbol2scm ("pop") == tag + else if (ly_symbol2scm ("pop") == tag || ly_symbol2scm ("push") == tag || ly_symbol2scm ("assign") == tag || ly_symbol2scm ("unset") == tag) @@ -193,42 +192,42 @@ Context_def::get_default_child (SCM user_mod) const return name; } -Link_array +vector Context_def::path_to_acceptable_context (SCM type_sym, Output_def *odef) const { assert (scm_is_symbol (type_sym)); SCM accepted = get_accepted (SCM_EOL); - Link_array accepteds; + vector accepteds; for (SCM s = accepted; scm_is_pair (s); s = scm_cdr (s)) if (Context_def *t = unsmob_context_def (find_context_def (odef, scm_car (s)))) - accepteds.push (t); + accepteds.push_back (t); - Link_array best_result; - for (int i = 0; i < accepteds.size (); i++) + vector best_result; + for (vsize i = 0; i < accepteds.size (); i++) { /* do not check aliases, because \context Staff should not create RhythmicStaff. */ if (ly_is_equal (accepteds[i]->get_context_name (), type_sym)) { - best_result.push (accepteds[i]); + best_result.push_back (accepteds[i]); return best_result; } } - int best_depth = INT_MAX; - for (int i = 0; i < accepteds.size (); i++) + vsize best_depth = INT_MAX; + for (vsize i = 0; i < accepteds.size (); i++) { Context_def *g = accepteds[i]; - Link_array result + vector result = g->path_to_acceptable_context (type_sym, odef); if (result.size () && result.size () < best_depth) { best_depth = result.size (); - result.insert (g, 0); + result.insert (result.begin (), g); best_result = result; } } @@ -299,6 +298,7 @@ Context_def::instantiate (SCM ops, Object_key const *key) context = new Context (key); context->definition_ = self_scm (); + context->definition_mods_ = ops; SCM trans_names = get_translator_names (ops); @@ -309,7 +309,7 @@ Context_def::instantiate (SCM ops, Object_key const *key) { Translator *t = get_translator (scm_car (s)); if (!t) - warning (_f ("can't find: `%s'", s)); + warning (_f ("can't find: `%s'", ly_symbol2string (scm_car (s)).c_str ())); else { Translator *tr = t->clone (); @@ -344,9 +344,8 @@ Context_def::instantiate (SCM ops, Object_key const *key) else if (dynamic_cast (g)) g->simple_trans_list_ = filter_engravers (g->simple_trans_list_); - g->context_ = context; context->aliases_ = context_aliases_; - + g->connect_to_context (context); g->unprotect (); context->accepts_list_ = get_accepted (ops);