]> git.donarmstrong.com Git - lilypond.git/blob - lily/translator-group-initializer.cc
b7a5aecf282ee8ac5b203a104330a1322edea5f6
[lilypond.git] / lily / translator-group-initializer.cc
1         /*   
2   translator-group-initializer.cc --  implement Translator_group_initializer
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #include "translator-group.hh"
11 #include "warn.hh"
12
13
14 void
15 Translator_group_initializer::set_acceptor (Translator *me,SCM name, bool add)
16 {
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_);
21 }
22
23
24 SCM
25 Translator_group_initializer::modify_definition (SCM list, SCM str, bool add)
26 {
27   String s = ly_scm2string (str);
28   if (!get_translator_l (s))
29     error (_ ("Program has no such type"));
30
31   if (add)
32     {
33       if (scm_memq (str, list) != SCM_BOOL_F)
34         {
35           warning (_f("Already contains: `%s'", s));
36           warning (_f("Not adding translator: `%s'", s));
37         }
38       else
39         list= gh_cons (str, list);
40     }
41   else
42     {
43       list = scm_delete_x (str, list);
44     }
45   return list;
46 }
47
48
49
50 void
51 Translator_group_initializer::remove_element (Translator *me,SCM s)
52 {
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);
55 }
56
57 void
58 Translator_group_initializer::add_element (Translator *me,SCM s)
59 {
60   me->consists_name_list_ = modify_definition (me->consists_name_list_, s, true);
61 }
62
63 void
64 Translator_group_initializer::add_last_element (Translator *me,SCM s)
65 {
66   me->end_consists_name_list_ = modify_definition (me->end_consists_name_list_, s, true);
67 }
68 void
69 Translator_group_initializer::add_push_property (Translator * me,
70                                                  SCM props, SCM syms,  SCM vals)
71 {
72   me->property_pushes_ = gh_cons (gh_list (props, syms, vals, SCM_UNDEFINED),
73                                   me->property_pushes_);
74 }
75
76 void
77 Translator_group_initializer::add_pop_property (Translator * me,
78                                                  SCM props, SCM syms)
79 {
80   me->property_pushes_ = gh_cons (gh_list (props, syms, SCM_UNDEFINED),
81                                   me->property_pushes_);
82 }
83
84 /*
85   Do it. SYMS maybe a symbol or a list of symbols. VAL is
86   SCM_UNDEFINED in case of a pop
87 */
88 void
89 Translator_group_initializer::apply_pushpop_property (Translator *trans, SCM syms, SCM eprop, SCM val)
90 {
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);
95 }