]> git.donarmstrong.com Git - lilypond.git/blob - lily/translator.cc
patch::: 1.3.108.jcn3
[lilypond.git] / lily / translator.cc
1 /*
2   translator.cc -- implement Translator
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9
10 #include "translator.hh"
11 #include "debug.hh"
12 #include "translator-group.hh"
13
14 #include "moment.hh"
15 #include "ly-smobs.icc"
16
17 char const*
18 Translator::name() const
19 {
20   return classname(this);
21 }
22
23 Translator::~Translator ()
24 {
25 }
26
27 void
28 Translator::init ()
29 {
30   status_ = ORPHAN;
31   simple_trans_list_ = SCM_EOL;
32   trans_group_list_ = SCM_EOL;
33   properties_scm_ = SCM_EOL;
34   definition_ = SCM_EOL;
35   daddy_trans_l_ =0;
36 }
37
38 Translator::Translator ()
39 {
40   init ();
41   output_def_l_ = 0;
42   smobify_self ();
43
44 }
45
46 Translator::Translator (Translator const &s)
47   : Input (s)
48 {
49   init ();
50   output_def_l_ = s.output_def_l_;
51   type_str_ = s.type_str_;
52
53   smobify_self ();
54 }
55
56 bool
57 Translator::is_alias_b (String s) const
58 {
59   return s == type_str_;
60 }
61
62 bool
63 Translator::do_try_music (Music *)
64 {
65   return false;
66 }
67                             
68
69 Moment
70 Translator::now_mom () const
71 {
72   return daddy_trans_l_->now_mom ();
73 }
74
75
76 void
77 Translator::add_processing ()
78 {
79   if (status_ > ORPHAN)
80     return;
81   
82   do_add_processing ();
83   status_ = VIRGIN;
84 }
85
86 void
87 Translator::do_add_processing ()
88 {
89 }
90
91 void
92 Translator::creation_processing ()
93 {
94   if (status_ >= CREATION_INITED)
95     return ;
96   
97   do_creation_processing ();
98   status_ = CREATION_INITED;
99 }
100
101 void
102 Translator::post_move_processing ()
103 {
104   if (status_ >= MOVE_INITED)
105     return;
106
107   creation_processing ();
108   do_post_move_processing ();
109   status_ = MOVE_INITED;
110 }
111
112 void
113 Translator::removal_processing ()
114 {
115   if (status_ == ORPHAN)
116     return;
117   creation_processing ();
118   do_removal_processing ();
119 }
120
121 bool
122 Translator::try_music (Music * r)
123 {
124   if (status_ < MOVE_INITED)
125     post_move_processing ();
126
127   return do_try_music (r);
128 }
129
130
131 void
132 Translator::process_music ()
133 {
134   assert (0);
135   if (status_ < PROCESSED_REQS)
136     post_move_processing ();
137   else if (status_ >= PROCESSED_REQS)
138     return; 
139   
140   status_ = PROCESSED_REQS;
141   deprecated_process_music ();
142 }
143
144 //////////
145 static int te_vroeg = 0;
146 void
147 Translator::announces ()
148 {
149   #if 0
150   if (te_vroeg && te_vroeg < 2)
151     {
152       do_creation_processing ();
153       te_vroeg++;
154     }
155   #endif
156   if (status_ < PROCESSED_REQS)
157     post_move_processing ();
158   else if (status_ >= PROCESSED_REQS)
159     return;
160   
161   status_ = PROCESSED_REQS;
162   do_announces ();
163 }
164
165
166 void
167 Translator::pre_move_processing ()
168 {
169   do_pre_move_processing ();
170   status_ = CREATION_INITED;
171 }
172
173
174
175 Music_output_def *
176 Translator::output_def_l () const
177 {
178   return output_def_l_;
179 }
180
181 SCM
182 Translator::get_property (char const * id) const
183 {
184   return daddy_trans_l_->get_property (ly_symbol2scm (id));
185 }
186
187 SCM
188 Translator::get_property (SCM sym) const
189 {
190   return daddy_trans_l_->get_property (sym);
191 }
192
193 void
194 Translator:: do_pre_move_processing ()
195 {
196 }
197
198 void
199 Translator::do_post_move_processing ()
200 {
201 }
202
203 void
204 Translator::deprecated_process_music ()
205 {
206 }
207
208 void
209 Translator::do_announces ()
210 {
211 }
212
213 ////////////
214 void
215 Translator::do_creation_processing ()
216 {
217   te_vroeg++;
218 }
219
220 void
221 Translator::do_removal_processing ()
222 {
223 }
224
225
226 /*
227
228   SMOBS
229
230 */
231 SCM
232 Translator::mark_smob (SCM sm)
233 {
234   Translator * me = (Translator*) SCM_CELL_WORD_1(sm);
235   scm_gc_mark (me->simple_trans_list_);
236   scm_gc_mark (me->trans_group_list_);
237   scm_gc_mark (me->definition_);  
238   scm_gc_mark (me->properties_scm_);  
239
240   return me->properties_scm_;
241 }
242
243
244 int
245 Translator::print_smob (SCM s, SCM port, scm_print_state *)
246 {
247   Translator *sc = (Translator *) gh_cdr (s);
248      
249   scm_puts ("#<Translator ", port);
250   scm_puts ((char *)sc->name (), port);
251   scm_display (sc->simple_trans_list_, port);
252   /*
253     don't try to print properties, that is too much hassle.
254    */
255   scm_puts (" >", port);
256
257   
258   
259   return 1;
260 }
261
262
263
264 IMPLEMENT_UNSMOB(Translator, translator);
265 IMPLEMENT_SMOBS(Translator);
266 IMPLEMENT_DEFAULT_EQUAL_P(Translator);