#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*)
{
void
Context_def::add_context_mod (SCM mod)
{
- SCM tag = gh_car (mod);
+ SCM tag = ly_car (mod);
if (ly_symbol2scm ("description") == tag)
{
- description_ = gh_cadr (mod);
+ description_ = ly_cadr (mod);
return ;
}
- SCM sym = gh_cadr (mod);
- if (gh_string_p (sym))
+ SCM sym = ly_cadr (mod);
+ if (ly_c_string_p (sym))
sym = scm_string_to_symbol (sym);
if (ly_symbol2scm ("consists") == tag
if (!get_translator (sym))
error (_f ("Program has no such type: `%s'", ly_symbol2string (sym).to_str0 ()));
else
- translator_mods_ = gh_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_ = gh_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 ("assign") == tag
|| ly_symbol2scm ("unset") == tag)
{
- property_ops_ = gh_cons (mod, property_ops_);
+ property_ops_ = scm_cons (mod, property_ops_);
}
else if (ly_symbol2scm ("alias") == tag)
{
- context_aliases_ = gh_cons (sym, context_aliases_);
+ context_aliases_ = scm_cons (sym, context_aliases_);
}
else if (ly_symbol2scm ("translator-type") == tag)
{
SCM mods = scm_reverse_x (scm_list_copy (accept_mods_),
user_mod);
SCM acc = SCM_EOL;
- for (SCM s = mods; gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = mods; ly_c_pair_p (s); s = ly_cdr (s))
{
- SCM tag = gh_caar (s);
- SCM sym = gh_cadar (s);
+ SCM tag = ly_caar (s);
+ SCM sym = ly_cadar (s);
if (tag == ly_symbol2scm ("accepts"))
- acc = gh_cons (sym, acc);
+ acc = scm_cons (sym, acc);
else if (tag == ly_symbol2scm ("denies"))
acc = scm_delete_x (sym, acc);
}
Link_array<Context_def>
Context_def::path_to_acceptable_context (SCM type_sym, Music_output_def* odef) const
{
- assert (gh_symbol_p (type_sym));
+ assert (ly_c_symbol_p (type_sym));
SCM accepted = get_accepted (SCM_EOL);
Link_array<Context_def> accepteds;
- for (SCM s = accepted; gh_pair_p (s); s = ly_cdr (s))
+ for (SCM s = accepted; ly_c_pair_p (s); s = ly_cdr (s))
{
Context_def *t = unsmob_context_def (odef->find_context_def (ly_car (s)));
if (!t)
/*
don't check aliases, because \context Staff should not create RhythmicStaff.
*/
- if (gh_equal_p (accepteds[i]->get_context_name (), type_sym))
+ if (ly_c_equal_p (accepteds[i]->get_context_name (), type_sym))
{
best_result.push (accepteds[i]);
return best_result;
SCM mods = scm_reverse_x (scm_list_copy (translator_mods_),
user_mod);
- for (SCM s = mods; gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = mods; ly_c_pair_p (s); s = ly_cdr (s))
{
- SCM tag = gh_caar (s);
- SCM arg = gh_cadar (s);
+ SCM tag = ly_caar (s);
+ SCM arg = ly_cadar (s);
- if (gh_string_p (arg))
+ if (ly_c_string_p (arg))
arg = scm_string_to_symbol (arg);
if (ly_symbol2scm ("consists") == tag)
- l1 = gh_cons (arg, l1);
+ l1 = scm_cons (arg, l1);
else if (ly_symbol2scm ("consists-end") == tag)
- l2 = gh_cons (arg, l2);
+ l2 = scm_cons (arg, l2);
else if (ly_symbol2scm ("remove") == tag)
{
l1 = scm_delete_x (arg, l1);
}
+SCM
+filter_performers (SCM l)
+{
+ for (SCM *tail = &l; ly_c_pair_p (*tail); tail = SCM_CDRLOC (*tail))
+ {
+ if (dynamic_cast<Performer*> (unsmob_translator (ly_car (*tail))))
+ {
+ *tail = ly_cdr (*tail);
+ if (!ly_c_pair_p (*tail))
+ break ;
+ }
+ }
+ return l;
+}
+
+
+SCM
+filter_engravers (SCM l)
+{
+ SCM *tail = &l;
+ for (; ly_c_pair_p (*tail) ; tail = SCM_CDRLOC (*tail))
+ {
+ if (dynamic_cast<Engraver*> (unsmob_translator (ly_car (*tail))))
+ {
+ *tail = ly_cdr (*tail);
+ if (!ly_c_pair_p (*tail))
+ break ;
+ }
+ }
+ return l;
+}
+
+
Context *
Context_def::instantiate (SCM ops)
{
Translator * g = get_translator (translator_group_type_);
g = g->clone ();
- g->simple_trans_list_ = names_to_translators (trans_names, tg);
+ g->simple_trans_list_ = SCM_EOL;
+
+ for (SCM s = trans_names; ly_c_pair_p (s) ; s = ly_cdr (s))
+ {
+ Translator * t = get_translator (ly_car (s));
+ if (!t)
+ warning (_f ("can't find: `%s'", s));
+ else
+ {
+ Translator * tr = t->clone ();
+ SCM str = tr->self_scm ();
+ g->simple_trans_list_ = scm_cons (str, g->simple_trans_list_);
+ tr->daddy_context_ = tg;
+ scm_gc_unprotect_object (str);
+ }
+ }
+
+
+
tg->implementation_ = g->self_scm ();
+ if (dynamic_cast<Engraver*> (g))
+ g->simple_trans_list_ = filter_performers (g->simple_trans_list_);
+ else if (dynamic_cast<Performer*> (g))
+ g->simple_trans_list_ = filter_engravers (g->simple_trans_list_);
+
g->daddy_context_ = tg;
tg->aliases_ = context_aliases_ ;
{
SCM l = SCM_EOL;
- l = gh_cons (gh_cons (ly_symbol2scm ("consists"),
+ l = scm_cons (scm_cons (ly_symbol2scm ("consists"),
get_translator_names (SCM_EOL)), l);
- l = gh_cons (gh_cons (ly_symbol2scm ("description"), description_), l);
- l = gh_cons (gh_cons (ly_symbol2scm ("aliases"), context_aliases_), l);
- l = gh_cons (gh_cons (ly_symbol2scm ("accepts"), get_accepted (SCM_EOL)), l);
- l = gh_cons (gh_cons (ly_symbol2scm ("property-ops"), property_ops_), l);
- l = gh_cons (gh_cons (ly_symbol2scm ("context-name"), context_name_), l);
-
- if (gh_symbol_p (translator_group_type_))
- l = gh_cons (gh_cons (ly_symbol2scm ("group-type"), translator_group_type_), 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 (ly_c_symbol_p (translator_group_type_))
+ l = scm_cons (scm_cons (ly_symbol2scm ("group-type"), translator_group_type_), l);
return l;
}