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