]> git.donarmstrong.com Git - lilypond.git/blob - lily/input-register.cc
release: 0.0.71pre
[lilypond.git] / lily / input-register.cc
1 /*
2   input-register.cc -- implement Input_register
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 "register.hh"
11 #include "input-register.hh"
12 #include "parray.hh"
13 #include "input-register.hh"
14 #include "register-group.hh"
15
16 bool
17 Input_register::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_register::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_ireg_p_list_.top(), i); i.ok(); i++) 
35         i->print();
36 #endif 
37 }
38
39 /*
40   UGH. Global.
41  */
42 Link_array<Input_register> iregs_p_arr;
43
44 void
45 add_global_input_register(Input_register *reg_p)
46 {
47     iregs_p_arr.push(reg_p);
48 }
49
50 Input_register *
51 lookup_reg(String nm)
52 {
53     for (int i=0; i < iregs_p_arr.size(); i++)
54         if (iregs_p_arr[i]->is_name_b(nm))
55             return iregs_p_arr[i];
56
57     error("can't find reg `" + nm + "'");
58 }
59
60
61
62 Input_register *
63 Input_register::recursive_find(String nm)
64 {
65     if ( is_name_b( nm) )
66         return this;
67
68     Input_register * r =0;
69     for (iter(contains_ireg_p_list_.top(), i); !r &&i.ok(); i++)
70         r = i->recursive_find(nm);
71
72     return r;
73 }
74 Input_register *
75 Input_register::find_ireg_l(String nm)
76 {
77     for (iter(contains_ireg_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 Register_group_register *
86 Input_register::get_group_register_p()
87 {
88     Register_group_register * reg_p = (Register_group_register*)
89         get_register_p(name_str_);
90
91     
92      
93     for (int i=0; i < consists_str_arr_.size(); i++) {
94         reg_p->add( get_register_p( consists_str_arr_[i]) );
95     }
96     reg_p -> ireg_l_ = this;
97     return reg_p;
98 }
99
100
101 bool
102 Input_register::accept_req_b()
103 {
104     return ! contains_ireg_p_list_.size();
105 }
106
107 void
108 Input_register::add(Input_register *ip)
109 {
110     contains_ireg_p_list_.bottom().add(ip);
111 }
112
113 Input_register*
114 Input_register::get_default_ireg_l()
115 {
116     return contains_ireg_p_list_.top();
117 }