lilypond-1.3.122
[lilypond.git] / lily / translator-group-initializer.cc
blobb7a5aecf282ee8ac5b203a104330a1322edea5f6
1 /*
2 translator-group-initializer.cc -- implement Translator_group_initializer
4 source file of the GNU LilyPond music typesetter
6 (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
8 */
10 #include "translator-group.hh"
11 #include "warn.hh"
14 void
15 Translator_group_initializer::set_acceptor (Translator *me,SCM name, bool add)
17 if (add)
18 me->accepts_name_list_ = gh_append2 (me->accepts_name_list_, gh_cons (name, SCM_EOL));
19 else
20 me->accepts_name_list_ = scm_delete_x (name, me->accepts_name_list_);
24 SCM
25 Translator_group_initializer::modify_definition (SCM list, SCM str, bool add)
27 String s = ly_scm2string (str);
28 if (!get_translator_l (s))
29 error (_ ("Program has no such type"));
31 if (add)
33 if (scm_memq (str, list) != SCM_BOOL_F)
35 warning (_f("Already contains: `%s'", s));
36 warning (_f("Not adding translator: `%s'", s));
38 else
39 list= gh_cons (str, list);
41 else
43 list = scm_delete_x (str, list);
45 return list;
50 void
51 Translator_group_initializer::remove_element (Translator *me,SCM s)
53 me->end_consists_name_list_ = modify_definition (me->end_consists_name_list_, s, false);
54 me->consists_name_list_ = modify_definition (me->consists_name_list_, s, false);
57 void
58 Translator_group_initializer::add_element (Translator *me,SCM s)
60 me->consists_name_list_ = modify_definition (me->consists_name_list_, s, true);
63 void
64 Translator_group_initializer::add_last_element (Translator *me,SCM s)
66 me->end_consists_name_list_ = modify_definition (me->end_consists_name_list_, s, true);
68 void
69 Translator_group_initializer::add_push_property (Translator * me,
70 SCM props, SCM syms, SCM vals)
72 me->property_pushes_ = gh_cons (gh_list (props, syms, vals, SCM_UNDEFINED),
73 me->property_pushes_);
76 void
77 Translator_group_initializer::add_pop_property (Translator * me,
78 SCM props, SCM syms)
80 me->property_pushes_ = gh_cons (gh_list (props, syms, SCM_UNDEFINED),
81 me->property_pushes_);
85 Do it. SYMS maybe a symbol or a list of symbols. VAL is
86 SCM_UNDEFINED in case of a pop
88 void
89 Translator_group_initializer::apply_pushpop_property (Translator *trans, SCM syms, SCM eprop, SCM val)
91 if (gh_symbol_p (syms))
92 dynamic_cast<Translator_group*>(trans)->execute_single_pushpop_property (syms, eprop, val);
93 else for (SCM s = syms; gh_pair_p (s); s = gh_cdr (s))
94 dynamic_cast<Translator_group*>(trans)->execute_single_pushpop_property (gh_car (s), eprop, val);