X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fcontext-def.cc;h=82b32ef4b7774b090fd44f84c3231cdf6c8b38b6;hb=77dba2aad902de14961ca17d32e3551eba7bab08;hp=72d13e6276643c614d5323d91c410771443df29d;hpb=a501f5946426488804ca2b03ab986f9c2b94ab99;p=lilypond.git diff --git a/lily/context-def.cc b/lily/context-def.cc index 72d13e6276..82b32ef4b7 100644 --- a/lily/context-def.cc +++ b/lily/context-def.cc @@ -1,55 +1,22 @@ /* translator-def.cc -- implement Context_def - + source file of the GNU LilyPond music typesetter - + (c) 2000--2004 Han-Wen Nienhuys - - */ +*/ -/* - TODO: should junk this class an replace by - a single list of context modifications? - */ +/* TODO: should junk this class an replace by + a single list of context modifications? */ -#include "lily-proto.hh" #include "context-def.hh" -#include "translator-group.hh" -#include "warn.hh" -#include "music-output-def.hh" -#include "ly-smobs.icc" -#include "score-context.hh" -#include "performer.hh" #include "engraver.hh" - -int -Context_def::print_smob (SCM smob, SCM port, scm_print_state*) -{ - Context_def* me = (Context_def*) SCM_CELL_WORD_1 (smob); - - scm_puts ("#context_name_, port); - scm_puts (">", port); - return 1; -} - - -SCM -Context_def::mark_smob (SCM smob) -{ - Context_def* me = (Context_def*) SCM_CELL_WORD_1 (smob); - - scm_gc_mark (me->description_); - scm_gc_mark (me->context_aliases_); - scm_gc_mark (me->accept_mods_); - scm_gc_mark (me->translator_mods_); - scm_gc_mark (me->property_ops_); - scm_gc_mark (me->translator_group_type_); - - return me->context_name_; -} - +#include "output-def.hh" +#include "performer.hh" +#include "score-context.hh" +#include "translator-group.hh" +#include "warn.hh" Context_def::Context_def () { @@ -66,10 +33,6 @@ Context_def::Context_def () context_name_ = ly_symbol2scm (""); } -Context_def::~Context_def () -{ -} - Context_def::Context_def (Context_def const & s) : Input (s) { @@ -92,19 +55,52 @@ Context_def::Context_def (Context_def const & s) context_name_ = s.context_name_; } +Context_def::~Context_def () +{ +} + +#include "ly-smobs.icc" +IMPLEMENT_SMOBS (Context_def); +IMPLEMENT_DEFAULT_EQUAL_P (Context_def); + +int +Context_def::print_smob (SCM smob, SCM port, scm_print_state*) +{ + Context_def* me = (Context_def*) SCM_CELL_WORD_1 (smob); + + scm_puts ("#context_name_, port); + scm_puts (">", port); + return 1; +} + +SCM +Context_def::mark_smob (SCM smob) +{ + Context_def* me = (Context_def*) SCM_CELL_WORD_1 (smob); + + scm_gc_mark (me->description_); + scm_gc_mark (me->context_aliases_); + scm_gc_mark (me->accept_mods_); + scm_gc_mark (me->translator_mods_); + scm_gc_mark (me->property_ops_); + scm_gc_mark (me->translator_group_type_); + + return me->context_name_; +} void Context_def::add_context_mod (SCM mod) { - SCM tag = ly_car (mod); - if (ly_symbol2scm ("description") == tag) + SCM tag = scm_car (mod); + if (ly_symbol2scm ("description") == tag) { - description_ = ly_cadr (mod); - return ; + description_ = scm_cadr (mod); + return; } - SCM sym = ly_cadr (mod); - if (is_string (sym)) + SCM sym = scm_cadr (mod); + if (scm_is_string (sym)) sym = scm_string_to_symbol (sym); if (ly_symbol2scm ("consists") == tag @@ -112,43 +108,30 @@ Context_def::add_context_mod (SCM mod) || ly_symbol2scm ("remove") == tag) { if (!get_translator (sym)) - error (_f ("Program has no such type: `%s'", ly_symbol2string (sym).to_str0 ())); + error (_f ("Program has no such type: `%s'", + ly_symbol2string (sym).to_str0 ())); else - translator_mods_ = scm_cons (scm_list_2 (tag, sym), translator_mods_ ); + 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_); - } + accept_mods_ = scm_cons (scm_list_2 (tag, sym), accept_mods_); else if (ly_symbol2scm ("poppush") == tag || ly_symbol2scm ("pop") == tag || ly_symbol2scm ("push") == tag || ly_symbol2scm ("assign") == tag || ly_symbol2scm ("unset") == tag) - { - property_ops_ = scm_cons (mod, property_ops_); - } + property_ops_ = scm_cons (mod, property_ops_); else if (ly_symbol2scm ("alias") == tag) - { - context_aliases_ = scm_cons (sym, context_aliases_); - } + context_aliases_ = scm_cons (sym, context_aliases_); else if (ly_symbol2scm ("translator-type") == tag) - { - translator_group_type_ = sym; - } + translator_group_type_ = sym; else if (ly_symbol2scm ("context-name") == tag) - { - context_name_ = sym; - } + context_name_ = sym; else - { - programming_error ("Unknown context mod tag."); - } + programming_error ("Unknown context mod tag."); } - - SCM Context_def::get_context_name () const { @@ -158,13 +141,12 @@ Context_def::get_context_name () const SCM Context_def::get_accepted (SCM user_mod) const { - SCM mods = scm_reverse_x (scm_list_copy (accept_mods_), - user_mod); + SCM mods = scm_reverse_x (scm_list_copy (accept_mods_), user_mod); SCM acc = SCM_EOL; - for (SCM s = mods; is_pair (s); s = ly_cdr (s)) + for (SCM s = mods; scm_is_pair (s); s = scm_cdr (s)) { - SCM tag = ly_caar (s); - SCM sym = ly_cadar (s); + SCM tag = scm_caar (s); + SCM sym = scm_cadar (s); if (tag == ly_symbol2scm ("accepts")) acc = scm_cons (sym, acc); else if (tag == ly_symbol2scm ("denies")) @@ -173,36 +155,31 @@ Context_def::get_accepted (SCM user_mod) const return acc; } - Link_array -Context_def::path_to_acceptable_context (SCM type_sym, Music_output_def* odef) const +Context_def::path_to_acceptable_context (SCM type_sym, Output_def *odef) const { - assert (is_symbol (type_sym)); + assert (scm_is_symbol (type_sym)); SCM accepted = get_accepted (SCM_EOL); Link_array accepteds; - for (SCM s = accepted; is_pair (s); s = ly_cdr (s)) - { - Context_def *t = unsmob_context_def (odef->find_context_def (ly_car (s))); - if (!t) - continue; + 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); - } Link_array best_result; for (int i=0; i < accepteds.size (); i++) { - /* - don't check aliases, because \context Staff should not create RhythmicStaff. - */ - if (is_equal (accepteds[i]->get_context_name (), type_sym)) + /* do not check aliases, because \context Staff should not + create RhythmicStaff. */ + if (ly_c_equal_p (accepteds[i]->get_context_name (), type_sym)) { best_result.push (accepteds[i]); return best_result; } } - + int best_depth= INT_MAX; for (int i=0; i < accepteds.size (); i++) { @@ -215,10 +192,8 @@ Context_def::path_to_acceptable_context (SCM type_sym, Music_output_def* odef) c result.insert (g,0); best_result = result; - /* - this following line was added in 1.9.3, but hsould've been - there all along... Let's hope it doesn't cause nightmares. - */ + /* this following line was added in 1.9.3, but hsould've been + there all along... Let's hope it doesn't cause nightmares. */ best_depth = result.size (); } } @@ -226,106 +201,114 @@ Context_def::path_to_acceptable_context (SCM type_sym, Music_output_def* odef) c return best_result; } -IMPLEMENT_SMOBS (Context_def); -IMPLEMENT_DEFAULT_EQUAL_P (Context_def); - - SCM Context_def::get_translator_names (SCM user_mod) const { SCM l1 = SCM_EOL; - SCM l2 = SCM_EOL; - SCM mods = scm_reverse_x (scm_list_copy (translator_mods_), - user_mod); + SCM mods = scm_reverse_x (scm_list_copy (translator_mods_), user_mod); - for (SCM s = mods; is_pair (s); s = ly_cdr (s)) + for (SCM s = mods; scm_is_pair (s); s = scm_cdr (s)) { - SCM tag = ly_caar (s); - SCM arg = ly_cadar (s); + SCM tag = scm_caar (s); + SCM arg = scm_cadar (s); - if (is_string (arg)) + if (scm_is_string (arg)) arg = scm_string_to_symbol (arg); if (ly_symbol2scm ("consists") == tag) l1 = scm_cons (arg, l1); - else if (ly_symbol2scm ("consists-end") == tag) - l2 = scm_cons (arg, l2); else if (ly_symbol2scm ("remove") == tag) { l1 = scm_delete_x (arg, l1); - l2 = scm_delete_x (arg, l2); } } - return scm_append_x (scm_list_2 (l1, l2)); + return l1; } - SCM -filter_performers (SCM l) +filter_performers (SCM ell) { - for (SCM *tail = &l; is_pair (*tail); tail = SCM_CDRLOC (*tail)) + for (SCM *tail = ℓ scm_is_pair (*tail); tail = SCM_CDRLOC (*tail)) { - if (dynamic_cast (unsmob_translator (ly_car (*tail)))) + if (dynamic_cast (unsmob_translator (scm_car (*tail)))) { - *tail = ly_cdr (*tail); + *tail = scm_cdr (*tail); + if (!scm_is_pair (*tail)) + break ; } } - return l; + return ell; } - SCM -filter_engravers (SCM l) +filter_engravers (SCM ell) { - for (SCM *tail = &l; is_pair (*tail) ; tail = SCM_CDRLOC (*tail)) + SCM *tail = ℓ + for (; scm_is_pair (*tail) ; tail = SCM_CDRLOC (*tail)) { - if (dynamic_cast (unsmob_translator (ly_car (*tail)))) + if (dynamic_cast (unsmob_translator (scm_car (*tail)))) { - *tail = ly_cdr (*tail); + *tail = scm_cdr (*tail); + if (!scm_is_pair (*tail)) + break ; } } - return l; + return ell; } Context * -Context_def::instantiate (SCM ops) +Context_def::instantiate (SCM ops, Object_key const *key) { - Context * tg = 0; + Context *tg = 0; if (context_name_ == ly_symbol2scm ("Score")) - tg = new Score_context (); + tg = new Score_context (key); else - tg = new Context (); + tg = new Context (key); tg->definition_ = self_scm (); SCM trans_names = get_translator_names (ops); - Translator * g = get_translator (translator_group_type_); - g = g->clone (); - - g->simple_trans_list_ = SCM_EOL; + Translator_group *g = dynamic_cast + (get_translator (translator_group_type_)); + g = dynamic_cast (g->clone ()); - for (SCM s = trans_names; is_pair (s) ; s = ly_cdr (s)) + SCM trans_list = SCM_EOL; + + for (SCM s = trans_names; scm_is_pair (s) ; s = scm_cdr (s)) { - Translator * t = get_translator (ly_car (s)); + Translator *t = get_translator (scm_car (s)); if (!t) warning (_f ("can't find: `%s'", s)); else { - Translator * tr = t->clone (); + Translator *tr = t->clone (); SCM str = tr->self_scm (); - g->simple_trans_list_ = scm_cons (str, g->simple_trans_list_); + + if (tr->must_be_last ()) + { + SCM cons = scm_cons (str, SCM_EOL); + if (scm_is_pair (trans_list)) + scm_set_cdr_x (scm_last_pair (trans_list), cons); + else + trans_list= cons; + } + else + { + trans_list = scm_cons (str, trans_list); + } + tr->daddy_context_ = tg; scm_gc_unprotect_object (str); } } - - + g->simple_trans_list_ = trans_list; + tg->implementation_ = g->self_scm (); if (dynamic_cast (g)) g->simple_trans_list_ = filter_performers (g->simple_trans_list_); @@ -337,17 +320,15 @@ Context_def::instantiate (SCM ops) scm_gc_unprotect_object (g->self_scm ()); - tg->accepts_list_ = get_accepted (ops); - + tg->accepts_list_ = get_accepted (ops); + return tg; } - SCM Context_def::clone_scm () const { - Context_def * t = new Context_def (*this); - + Context_def *t = new Context_def (*this); SCM x = t->self_scm (); scm_gc_unprotect_object (x); return x; @@ -356,9 +337,8 @@ Context_def::clone_scm () const SCM Context_def::make_scm () { - Context_def* t = new Context_def; - - SCM x =t->self_scm (); + Context_def *t = new Context_def; + SCM x = t->self_scm (); scm_gc_unprotect_object (x); return x; } @@ -366,25 +346,28 @@ Context_def::make_scm () void Context_def::apply_default_property_operations (Context *tg) { - apply_property_operations (tg , property_ops_); + apply_property_operations (tg, property_ops_); } SCM Context_def::to_alist () const { - SCM l = SCM_EOL; - - l = scm_cons (scm_cons (ly_symbol2scm ("consists"), - get_translator_names (SCM_EOL)), l); - l = scm_cons (scm_cons (ly_symbol2scm ("description"), description_), l); - l = scm_cons (scm_cons (ly_symbol2scm ("aliases"), context_aliases_), l); - l = scm_cons (scm_cons (ly_symbol2scm ("accepts"), get_accepted (SCM_EOL)), l); - l = scm_cons (scm_cons (ly_symbol2scm ("property-ops"), property_ops_), l); - l = scm_cons (scm_cons (ly_symbol2scm ("context-name"), context_name_), l); - - if (is_symbol (translator_group_type_)) - l = scm_cons (scm_cons (ly_symbol2scm ("group-type"), translator_group_type_), l); - - return l; + SCM ell = SCM_EOL; + + ell = scm_cons (scm_cons (ly_symbol2scm ("consists"), + get_translator_names (SCM_EOL)), ell); + ell = scm_cons (scm_cons (ly_symbol2scm ("description"), description_), ell); + ell = scm_cons (scm_cons (ly_symbol2scm ("aliases"), context_aliases_), ell); + ell = scm_cons (scm_cons (ly_symbol2scm ("accepts"), get_accepted (SCM_EOL)), + ell); + ell = scm_cons (scm_cons (ly_symbol2scm ("property-ops"), property_ops_), + ell); + ell = scm_cons (scm_cons (ly_symbol2scm ("context-name"), context_name_), + ell); + + if (scm_is_symbol (translator_group_type_)) + ell = scm_cons (scm_cons (ly_symbol2scm ("group-type"), + translator_group_type_), ell); + return ell; }