X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftranslator-group.cc;h=e85ced8d6d905edc9adcd1396b8f0fae8dd201bb;hb=7a9aad3db6fe6ee35bbcda9d9096b5d0df7ef639;hp=6768de18c70143865e4660a4ca99119159f5d6ee;hpb=baf32731650d510882eeb52d02f4ca0c816c7c29;p=lilypond.git diff --git a/lily/translator-group.cc b/lily/translator-group.cc index 6768de18c7..e85ced8d6d 100644 --- a/lily/translator-group.cc +++ b/lily/translator-group.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2002 Han-Wen Nienhuys + (c) 1997--2003 Han-Wen Nienhuys */ #include "music-output-def.hh" @@ -14,6 +14,7 @@ #include "scm-hash.hh" #include "translator-def.hh" #include "main.hh" +#include "music.hh" Translator_group::Translator_group (Translator_group const&s) : Translator (s) @@ -34,7 +35,7 @@ Translator_group::properties_dict () const Translator_group::~Translator_group () { - //assert (removable_b ()); + //assert (is_removable ()); } @@ -58,7 +59,7 @@ Translator_group::check_removal () Translator_group *trg = dynamic_cast (unsmob_translator (ly_car (p))); trg->check_removal (); - if (trg->removable_b ()) + if (trg->is_removable ()) terminate_translator (trg); } } @@ -98,15 +99,15 @@ Translator_group::add_fresh_group_translator (Translator*t) bool -Translator_group::removable_b () const +Translator_group::is_removable () const { return trans_group_list_ == SCM_EOL && ! iterator_count_; } Translator_group * -Translator_group::find_existing_translator (String n, String id) +Translator_group::find_existing_translator (SCM n, String id) { - if ((is_alias_b (n) && (id_string_ == id || id.empty_b ())) || n == "Current") + if ((is_alias (n) && (id_string_ == id || id.is_empty ())) || n == ly_symbol2scm ("Current")) return this; Translator_group* r = 0; @@ -121,17 +122,15 @@ Translator_group::find_existing_translator (String n, String id) } - - Translator_group* -Translator_group::find_create_translator (String n, String id) +Translator_group::find_create_translator (SCM n, String id) { Translator_group * existing = find_existing_translator (n,id); if (existing) return existing; Link_array path - = unsmob_translator_def (definition_)->path_to_acceptable_translator (scm_makfrom0str ((char*)n.to_str0 ()), get_output_def ()); + = unsmob_translator_def (definition_)->path_to_acceptable_translator (n, get_output_def ()); if (path.size ()) { @@ -156,24 +155,12 @@ Translator_group::find_create_translator (String n, String id) ret = daddy_trans_->find_create_translator (n,id); else { - warning (_f ("can't find or create `%s' called `%s'", n, id)); + warning (_f ("can't find or create `%s' called `%s'", ly_symbol2string (n).to_str0 (), id)); ret =0; } return ret; } -bool -Translator_group::try_music_on_nongroup_children (Music *m) -{ - bool hebbes_b =false; - - for (SCM p = simple_trans_list_; !hebbes_b && gh_pair_p (p); p = ly_cdr (p)) - { - hebbes_b = unsmob_translator (ly_car (p))->try_music (m); - } - return hebbes_b; -} - bool Translator_group::try_music (Music* m) { @@ -181,6 +168,7 @@ Translator_group::try_music (Music* m) if (!hebbes_b && daddy_trans_) hebbes_b = daddy_trans_->try_music (m); + return hebbes_b ; } @@ -202,7 +190,7 @@ Translator_group::get_ancestor (int level) void Translator_group::terminate_translator (Translator*r) { - r->removal_processing (); + r->finalize (); /* Return value ignored. GC does the rest. */ @@ -226,8 +214,7 @@ Translator_group::remove_translator (Translator*trans) bool Translator_group::is_bottom_translator_b () const { - return !gh_string_p (unsmob_translator_def (definition_)->default_child_context_name ()); - + return !gh_symbol_p (unsmob_translator_def (definition_)->default_child_context_name ()); } Translator_group* @@ -327,7 +314,7 @@ Translator_group::unset_property (SCM sym) entry from a translator property list by name of PROP */ void -Translator_group::execute_single_pushpop_property (SCM prop, SCM eltprop, SCM val) +Translator_group::execute_pushpop_property (SCM prop, SCM eltprop, SCM val) { if (gh_symbol_p (prop)) { @@ -355,8 +342,12 @@ Translator_group::execute_single_pushpop_property (SCM prop, SCM eltprop, SCM va { SCM prev = internal_get_property (prop); + /* + TODO: should have scm_equal_something () for reverting + autobeam properties. + */ SCM newprops= SCM_EOL ; - while (gh_pair_p (prev) && ly_caar (prev) != eltprop) + while (gh_pair_p (prev) && !SCM_EQ_P(ly_caar (prev), eltprop)) { newprops = gh_cons (ly_car (prev), newprops); prev = ly_cdr (prev); @@ -373,8 +364,6 @@ Translator_group::execute_single_pushpop_property (SCM prop, SCM eltprop, SCM va - - /* STUBS */ @@ -399,40 +388,82 @@ Translator_group::do_announces () void Translator_group::initialize () { + SCM tab = scm_make_vector (gh_int2scm (19), SCM_BOOL_F); + set_property ("acceptHashTable", tab); each (&Translator::initialize); } void Translator_group::finalize () { - each (&Translator::removal_processing); + each (&Translator::finalize); } -LY_DEFINE(ly_get_context_property, - "ly-get-context-property", 2, 0, 0, - (SCM context, SCM name), - "retrieve the value of @var{sym} from context @var{tr}") + + +bool translator_accepts_any_of (Translator*tr, SCM ifaces) { - Translator *t = unsmob_translator (context); - Translator_group* tr= dynamic_cast (t); - SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "Translator group"); - SCM_ASSERT_TYPE(gh_symbol_p (name), name, SCM_ARG2, __FUNCTION__, "symbol"); + SCM ack_ifs = scm_assoc (ly_symbol2scm ("events-accepted"), + tr->translator_description()); + ack_ifs = gh_cdr (ack_ifs); + for (SCM s = ifaces; ly_pair_p (s); s = ly_cdr (s)) + if (scm_memq (ly_car (s), ack_ifs) != SCM_BOOL_F) + return true; + return false; +} - return tr->internal_get_property (name); - +SCM +find_accept_translators (SCM gravlist, SCM ifaces) +{ + SCM l = SCM_EOL; + for (SCM s = gravlist; ly_pair_p (s); s = ly_cdr (s)) + { + Translator* tr = unsmob_translator (ly_car (s)); + if (translator_accepts_any_of (tr, ifaces)) + l = scm_cons (tr->self_scm (), l); + } + l = scm_reverse_x (l, SCM_EOL); + + return l; } -LY_DEFINE(ly_set_context_property, - "ly-set-context-property", 3, 0, 0, - (SCM context, SCM name, SCM val), - "set value of property @var{sym} in context @var{tr} to @var{val}. -") +bool +Translator_group::try_music_on_nongroup_children (Music *m ) { - Translator *t = unsmob_translator (context); - Translator_group* tr= dynamic_cast (t); + SCM tab = get_property ("acceptHashTable"); + SCM name = scm_sloppy_assq (ly_symbol2scm ("name"), + m->get_property_alist (false)); - SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "Context"); - tr->internal_set_property (name, val); + if (!gh_pair_p (name)) + return false; - return SCM_UNSPECIFIED; + name = gh_cdr (name); + SCM accept_list = scm_hashq_ref (tab, name, SCM_UNDEFINED); + if (accept_list == SCM_BOOL_F) + { + accept_list = find_accept_translators (simple_trans_list_, + m->get_mus_property ("types")); + scm_hashq_set_x (tab, name, accept_list); + } + + for (SCM p = accept_list; gh_pair_p (p); p = ly_cdr (p)) + { + Translator * t = unsmob_translator (ly_car (p)); + if (t && t->try_music (m)) + return true; + } + return false; +} + +SCM +Translator_group::properties_as_alist () const +{ + return properties_dict()->to_alist(); +} + +String +Translator_group::context_name () const +{ + Translator_def * td = unsmob_translator_def (definition_ ); + return ly_symbol2string (td->type_name_); }