]> git.donarmstrong.com Git - lilypond.git/blob - lily/input-engraver.cc
release: 0.0.72pre
[lilypond.git] / lily / input-engraver.cc
1 /*
2   input-engraver.cc -- implement Input_engraver
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-engraver.hh"
12 #include "parray.hh"
13 #include "input-engraver.hh"
14 #include "engraver-group.hh"
15
16 bool
17 Input_engraver::is_name_b(String n)
18 {
19     bool b = (n == name_str_);
20     for (int i=0; !b && i < alias_str_arr_.size(); i++)
21         b = b || (alias_str_arr_[i] == n);
22     return b;
23 }
24
25 void
26 Input_engraver::print() const
27 {
28 #ifndef NPRINT
29     mtor << "name " << name_str_;
30     mtor << "Consists of ";
31     for (int i=0; i< consists_str_arr_.size(); i++)
32         mtor << consists_str_arr_[i] << ',';
33     mtor << "contains " ;
34     for (iter(contains_igrav_p_list_.top(), i); i.ok(); i++) 
35         i->print();
36 #endif 
37 }
38
39 /*
40   UGH. Global.
41  */
42 Link_array<Input_engraver> igravs_p_arr;
43
44 void
45 add_global_input_engraver(Input_engraver *grav_p)
46 {
47     igravs_p_arr.push(grav_p);
48 }
49
50 Input_engraver *
51 lookup_grav(String nm)
52 {
53     for (int i=0; i < igravs_p_arr.size(); i++)
54         if (igravs_p_arr[i]->is_name_b(nm))
55             return igravs_p_arr[i];
56
57     error("can't find reg `" + nm + "'");
58 }
59
60
61
62 Input_engraver *
63 Input_engraver::recursive_find(String nm)
64 {
65     if ( is_name_b( nm) )
66         return this;
67
68     Input_engraver * r =0;
69     for (iter(contains_igrav_p_list_.top(), i); !r &&i.ok(); i++)
70         r = i->recursive_find(nm);
71
72     return r;
73 }
74 Input_engraver *
75 Input_engraver::find_igrav_l(String nm)
76 {
77     for (iter(contains_igrav_p_list_.top(), i); i.ok(); i++)
78         if (i->is_name_b( nm))
79             return i;
80
81     return 0;
82 }
83
84
85 Engraver_group_engraver *
86 Input_engraver::get_group_engraver_p()
87 {
88     Engraver_group_engraver * grav_p = (Engraver_group_engraver*)
89         get_engraver_p(name_str_);
90
91     
92      
93     for (int i=0; i < consists_str_arr_.size(); i++) {
94         grav_p->add( get_engraver_p( consists_str_arr_[i]) );
95     }
96     grav_p -> igrav_l_ = this;
97     return grav_p;
98 }
99
100
101 bool
102 Input_engraver::accept_req_b()
103 {
104     return ! contains_igrav_p_list_.size();
105 }
106
107 void
108 Input_engraver::add(Input_engraver *ip)
109 {
110     contains_igrav_p_list_.bottom().add(ip);
111 }
112
113 Input_engraver*
114 Input_engraver::get_default_igrav_l()
115 {
116     return contains_igrav_p_list_.top();
117 }