]> git.donarmstrong.com Git - lilypond.git/blob - lily/input-translator.cc
patch::: 0.0.74pre.jcn1: pats
[lilypond.git] / lily / input-translator.cc
1 /*
2   input-translator.cc -- implement Input_translator
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 //#include "translator-admin.hh"
10 #include "debug.hh"
11 #include "engraver.hh"
12 #include "input-translator.hh"
13 #include "parray.hh"
14 #include "input-translator.hh"
15 #include "engraver-group.hh"
16 #include "performer-group-performer.hh"
17
18 bool
19 Input_translator::is_name_b(String n)
20 {
21     for (int i=0; i < alias_str_arr_.size(); i++)
22         if (alias_str_arr_[i] == n)
23             return true;
24     return false;
25 }
26
27 void
28 Input_translator::print() const
29 {
30 #ifndef NPRINT
31     mtor << base_str_ <<" " << type_str_<<" {\n";
32     mtor << "Consists of ";
33     for (int i=0; i< consists_str_arr_.size(); i++)
34         mtor << consists_str_arr_[i] << ',';
35     if (contains_itrans_p_list_.size())
36         mtor << "\nContains " ;
37     for (PCursor<Input_translator*> i(contains_itrans_p_list_.top()); i.ok(); i++) 
38         i->print();
39     mtor << "}\n";
40 #endif 
41 }
42
43
44
45 Input_translator *
46 Input_translator::recursive_find(String nm)
47 {
48     if ( is_name_b( nm) )
49         return this;
50
51     Input_translator * r =0;
52     // what bout for() ?
53     PCursor<Input_translator*> i(contains_itrans_p_list_.top());
54     for (; !r &&i.ok(); i++) {
55         if (i->recursive_find(nm))
56             r = i.ptr();
57     }
58
59     return r;
60 }
61
62 Input_translator *
63 Input_translator::find_itrans_l(String nm)
64 {
65     for (PCursor<Input_translator*> i(contains_itrans_p_list_.top()); i.ok(); i++) 
66         if (i->is_name_b( nm))
67             return i;
68
69     return 0;
70 }
71
72
73 Engraver_group_engraver *
74 Input_translator::get_group_engraver_p()
75 {
76     assert (base_str_ == "Engraver");
77     Engraver_group_engraver * grav_p = (Engraver_group_engraver*)
78         get_engraver_p(type_str_);
79
80     for (int i=0; i < consists_str_arr_.size(); i++) {
81         grav_p->add( get_engraver_p( consists_str_arr_[i]) );
82     }
83     grav_p->itrans_l_ = this;
84     grav_p->id_str_ = default_id_str_;
85     return grav_p;
86 }
87
88 Performer_group_performer*
89 Input_translator::get_group_performer_p()
90 {    
91     assert (base_str_ == "Performer");
92     Performer_group_performer * perf_p = (Performer_group_performer*)
93         get_performer_p(type_str_);
94
95     for (int i=0; i < consists_str_arr_.size(); i++) {
96         perf_p->add( get_performer_p( consists_str_arr_[i]) );
97     }
98     perf_p->itrans_l_ = this;
99     perf_p->id_str_ = default_id_str_;
100     return perf_p;
101 }
102
103 bool
104 Input_translator::accept_req_b()
105 {
106     return ! contains_itrans_p_list_.size();
107 }
108
109 void
110 Input_translator::add(Input_translator *ip)
111 {
112     contains_itrans_p_list_.bottom().add(ip);
113 }
114
115 Input_translator*
116 Input_translator::get_default_itrans_l()
117 {
118     if ( contains_itrans_p_list_.size() )
119         return contains_itrans_p_list_.top();
120     else
121         return 0;
122 }
123
124
125 Input_translator_list::Input_translator_list(Input_translator_list const &s)
126 {
127     for (PCursor<Input_translator*> pc(s); pc.ok(); pc++) {
128         Input_translator *q = pc;
129         Input_translator *p=new Input_translator(*q) ; 
130         bottom().add(p);
131     }
132 }