]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.1.45
authorfred <fred>
Sun, 24 Mar 2002 20:02:16 +0000 (20:02 +0000)
committerfred <fred>
Sun, 24 Mar 2002 20:02:16 +0000 (20:02 +0000)
lily/change-iterator.cc
lily/translator-group.cc

index c6ebf2907f41548c37853df1d4a1341a08cdbc16..883e963e9f3d29b00a62c96f353c5bddd8fa5b6d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  change-iterator.cc -- implement 
+  change-iterator.cc -- implement Change_iterator
 
   source file of the GNU LilyPond music typesetter
 
@@ -9,12 +9,28 @@
 #include "change-iterator.hh"
 #include "translator-group.hh"
 #include "change-translator.hh"
+#include "debug.hh"
 
 Change_iterator::Change_iterator (Change_translator *change_l)
 {
   change_l_ = change_l;
 }
 
+void
+Change_iterator::error (String reason)
+{
+  String to_type = change_l_->change_to_type_str_;
+  String to_id =  change_l_->change_to_id_str_;
+
+  String warn1 = 
+    _ ("Can't change ") + to_type 
+    + _(" to ") + "`" + to_id + "\': " + reason;
+  String warn2= "Change_iterator::process_and_next (): " + report_to_l ()->type_str_ + " = `"
+    + report_to_l ()->id_str_ + "\': ";
+  warning (warn2);
+  change_l_->warning (warn1);
+}
+
 /*
   move to construct_children ?
  */
@@ -23,20 +39,42 @@ Change_iterator::process_and_next (Moment m)
 {
   Translator_group * current = report_to_l ();
   Translator_group * last = 0;
-  while  (current && current->type_str_ != change_l_->change_to_type_str_)
+
+  String to_type = change_l_->change_to_type_str_;
+  String to_id =  change_l_->change_to_id_str_;
+
+  /* find the type  of translator that we're changing.
+     
+     If \translator Staff = bass, then look for Staff = *
+   */
+  while  (current && current->type_str_ != to_type)
     {
       last = current;
       current = current->daddy_trans_l_;
     }
-  if (current) 
-    {
-      Translator_group * dest = 
-       report_to_l ()->find_create_translator_l (change_l_->change_to_type_str_, 
-                                                 change_l_->change_to_id_str_);
-      current->remove_translator_p (last);
-      dest->add (last);
-    }
   
+  
+  if (current) 
+    if (last)
+      {
+       Translator_group * dest = 
+         report_to_l ()->find_create_translator_l (to_type, to_id);
+       current->remove_translator_p (last);
+       dest->add (last);
+      }
+    else
+      {
+       
+       /*
+         We could change the current translator's id, but that would make 
+         errors hard to catch
+         
+          last->translator_id_str_  = change_l_->change_to_id_str_;
+       */
+       error ("I'm one myself");
+      }
+  else
+    error ("None of these in my family.");
   Music_iterator::process_and_next (m);
 }
 
index dfd31f8469db116f61d83013e7bf8b2e838a4940..8918a4854394371100c68f1be1f20d4dad425914 100644 (file)
@@ -215,6 +215,8 @@ Translator_group::terminate_translator (Translator*r_l)
 Translator *
 Translator_group::remove_translator_p (Translator*trans_l)
 {
+  assert (trans_l);
+  
   PCursor<Translator*> trans_cur (trans_p_list_.find (trans_l));
   Translator * t =  trans_cur.remove_p();
   /*