]> git.donarmstrong.com Git - lilypond.git/blob - lily/input-translator.cc
release: 0.1.9
[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   DOUT << base_str_ <<" " << type_str_<<" {\n";
33   DOUT << "Consists of ";
34   for (int i=0; i< consists_str_arr_.size(); i++)
35         DOUT << consists_str_arr_[i] << ',';
36   if (contains_itrans_p_list_.size())
37         DOUT << "\nContains " ;
38   for (PCursor<Input_translator*> i (contains_itrans_p_list_.top()); i.ok (); i++) 
39         i->print();
40   DOUT << "}\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     {
57         if (i->recursive_find (nm))
58             r = i.ptr();
59     }
60
61   return r;
62 }
63
64 Input_translator *
65 Input_translator::find_itrans_l (String nm)
66 {
67   for (PCursor<Input_translator*> i (contains_itrans_p_list_.top()); i.ok (); i++) 
68         if (i->is_name_b (nm))
69             return i;
70
71   return 0;
72 }
73
74
75 Engraver_group_engraver *
76 Input_translator::get_group_engraver_p()
77 {
78   assert (base_str_ == "Engraver");
79   Engraver_group_engraver * grav_p = (Engraver_group_engraver*)
80         get_engraver_p (type_str_);
81
82   for (int i=0; i < consists_str_arr_.size(); i++) 
83     {
84         grav_p->add (get_engraver_p (consists_str_arr_[i]));
85     }
86   grav_p->itrans_l_ = this;
87   grav_p->id_str_ = default_id_str_;
88   return grav_p;
89 }
90
91 Performer_group_performer*
92 Input_translator::get_group_performer_p()
93 {    
94   assert (base_str_ == "Performer");
95   Performer_group_performer * perf_p = (Performer_group_performer*)
96         get_performer_p (type_str_);
97
98   for (int i=0; i < consists_str_arr_.size(); i++) 
99     {
100         perf_p->add (get_performer_p (consists_str_arr_[i]));
101     }
102   perf_p->itrans_l_ = this;
103   perf_p->id_str_ = default_id_str_;
104   return perf_p;
105 }
106
107 bool
108 Input_translator::accept_req_b()
109 {
110   return ! contains_itrans_p_list_.size();
111 }
112
113 void
114 Input_translator::add (Input_translator *ip)
115 {
116   contains_itrans_p_list_.bottom().add (ip);
117 }
118
119 Input_translator*
120 Input_translator::get_default_itrans_l()
121 {
122   if ( contains_itrans_p_list_.size())
123         return contains_itrans_p_list_.top();
124   else
125         return 0;
126 }
127
128
129 Input_translator_list::Input_translator_list (Input_translator_list const &s)
130 {
131   for (PCursor<Input_translator*> pc (s); pc.ok(); pc++) 
132     {
133         Input_translator *q = pc;
134         Input_translator *p=new Input_translator (*q) ; 
135         bottom().add (p);
136     }
137 }