]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/translator-group.cc
patch::: 1.3.35.jcn1
[lilypond.git] / lily / translator-group.cc
index 2959bb7280135c59f170f0f03743aaadff22bdc8..2a071f2e9a9d31d27273deddb6d833f41aa216c8 100644 (file)
@@ -3,14 +3,14 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c)  1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 
 #include "music-output-def.hh"
 #include "translator-group.hh"
 #include "translator.hh"
 #include "debug.hh"
-#include "rational.hh"
+#include "moment.hh"
 #include "dictionary-iter.hh"
 
 #include "killing-cons.tcc"
@@ -40,13 +40,16 @@ Translator_group::Translator_group()
 void
 Translator_group::check_removal()
 {
-  Link_array<Translator_group> groups (group_l_arr ());
-  
-  for (int i =0; i < groups.size(); i++)
+  Cons<Translator> *next =0;
+  for (Cons<Translator> *p = trans_p_list_.head_; p; p = next)
     {
-      groups[i]->check_removal();
-      if (groups[i]->removable_b())
-       terminate_translator (groups[i]);
+      next = p->next_;
+      if (Translator_group *trg =  dynamic_cast <Translator_group *> (p->car_))
+       {
+         trg->check_removal ();
+         if (trg->removable_b())
+           terminate_translator (trg);
+       }
     }
 }
 
@@ -75,11 +78,11 @@ void
 Translator_group::add_last_element (String s)
 {
   if (!get_translator_l (s))
-    error ("Program has no such type");
+    error (_ ("Program has no such type"));
 
   for (int i=consists_end_str_arr_.size (); i--; )
     if (consists_end_str_arr_[i] == s)
-      warning (_f("Already contains a `%s\'", s));
+      warning (_f ("Already contains: `%s'", s));
       
   consists_end_str_arr_.push (s);
 }
@@ -88,13 +91,13 @@ void
 Translator_group::set_element (String s, bool add)
 {
   if (!get_translator_l (s))
-    error ("Program has no such type");
+    error (_ ("Program has no such type"));
 
   if (add)
     {
       for (int i=consists_str_arr_.size (); i--; )
        if (consists_str_arr_[i] == s)
-         warning (_f("Already contains a `%s\'", s));
+         warning (_f("Already contains: `%s'", s));
       
       consists_str_arr_.push (s);
     }
@@ -126,11 +129,11 @@ Translator_group::find_existing_translator_l (String n, String id)
   if (is_alias_b (n) && (id_str_ == id || id.empty_b ()))
     return this;
 
-  Link_array<Translator_group> groups (group_l_arr ());
   Translator_group* r = 0;
-  for (int i =0; !r && i < groups.size(); i++)
+  for (Cons<Translator> *p = trans_p_list_.head_; !r && p; p = p->next_)
     {
-      r = groups[i]->find_existing_translator_l (n,id);
+      if (Translator_group *trg =  dynamic_cast <Translator_group *> (p->car_))
+       r = trg->find_existing_translator_l (n, id);
     }
 
   return r;
@@ -204,24 +207,34 @@ Translator_group::find_create_translator_l (String n, String id)
     ret = daddy_trans_l_->find_create_translator_l (n,id);
   else
     {
-      warning (_f ("can't find or create `%s\' called `%s\'", n, id));
+      warning (_f ("can't find or create `%s' called `%s'", n, id));
       ret =0;
     }
   return ret;
 }
 
-
 bool
-Translator_group::do_try_music (Music* req_l)
+Translator_group::try_music_on_nongroup_children (Music *m)
 {
   bool hebbes_b =false;
 
-  Link_array<Translator> nongroups (nongroup_l_arr ());
+  for (Cons<Translator> *p = trans_p_list_.head_; !hebbes_b && p; p = p->next_)
+    {
+      if (!dynamic_cast <Translator_group *> (p->car_))
+       {
+         hebbes_b = p->car_->try_music (m);
+       }
+    }
+  return hebbes_b;
+}
+
+bool
+Translator_group::do_try_music (Music* m)
+{
+  bool hebbes_b = try_music_on_nongroup_children (m);
   
-  for (int i =0; !hebbes_b && i < nongroups.size() ; i++)
-    hebbes_b =nongroups[i]->try_music (req_l);
   if (!hebbes_b && daddy_trans_l_)
-    hebbes_b = daddy_trans_l_->try_music (req_l);
+    hebbes_b = daddy_trans_l_->try_music (m);
   return hebbes_b ;
 }
 
@@ -240,37 +253,13 @@ Translator_group::ancestor_l (int level)
   return daddy_trans_l_->ancestor_l (level-1);
 }
 
-Link_array<Translator_group>
-Translator_group::group_l_arr () const
-{
-  Link_array<Translator_group> groups;
-  for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
-    {
-      if (dynamic_cast <Translator_group *> (p->car_))
-       groups.push (dynamic_cast <Translator_group *> (p->car_));
-    }
-  return groups;
-}
 
-Link_array<Translator>
-Translator_group::nongroup_l_arr () const
-{
-  Link_array<Translator> groups;
-  for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
-    {
-      if (!dynamic_cast <Translator_group *> (p->car_))
-       groups.push (p->car_);
-    }
-  return groups;
-}
-/**
-   End translator: call "destructor", remove from hierarchy, and delete
- */
+
+
 
 void
 Translator_group::terminate_translator (Translator*r_l)
 {
-  DOUT << "Removing " << classname (r_l) << " at " << now_mom () << '\n';
   r_l->removal_processing();
   Translator * trans_p =remove_translator_p (r_l);
 
@@ -303,11 +292,10 @@ Translator_group::remove_translator_p (Translator*trans_l)
 Translator*
 Translator_group::get_simple_translator (String type) const
 {
-  Link_array<Translator> nongroups (nongroup_l_arr ());
-  for (int i=0; i < nongroups.size(); i++)
+  for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
     {
-      if (classname (nongroups[i]) == type)
-       return nongroups[i];
+      if (classname (p->car_) == type)
+       return p->car_;
     }
   if (daddy_trans_l_)
     return daddy_trans_l_->get_simple_translator (type);
@@ -331,7 +319,7 @@ Translator_group::get_default_interpreter()
       Translator*t = output_def_l ()->find_translator_l (accepts_str_arr_[0]);
       if (!t)
        {
-         warning (_f ("can't find or create `%s\'", accepts_str_arr_[0]));
+         warning (_f ("can't find or create: `%s'", accepts_str_arr_[0]));
          t = this;
        }
       Translator_group * g= dynamic_cast <Translator_group*>(t->clone ());
@@ -364,26 +352,24 @@ void
 Translator_group::do_print() const
 {
 #ifndef NPRINT
-  if (!check_debug)
+  if (!flower_dstream)
     return ;
-  for (Dictionary_iter<Scalar> i (properties_dict_); i.ok (); i++)
-    {
-      DOUT << i.key () << "=" << i.val () << '\n';
-    }
+
+  gh_display (properties_dict_.self_scm_);
   if (status == ORPHAN)
     {
-      DOUT << "consists of: ";
+      DEBUG_OUT << "consists of: ";
       for (int i=0; i < consists_str_arr_.size (); i++)
-       DOUT << consists_str_arr_[i] << ", ";
-      DOUT << "\naccepts: ";
+       DEBUG_OUT << consists_str_arr_[i] << ", ";
+      DEBUG_OUT << "\naccepts: ";
       for (int i=0; i < accepts_str_arr_.size (); i++)
-       DOUT << accepts_str_arr_[i] << ", ";
+       DEBUG_OUT << accepts_str_arr_[i] << ", ";
     }
   else
     {
       if (id_str_.length_i ())
-       DOUT << "ID: " << id_str_ ;
-      DOUT << " iterators: " << iterator_count_<< '\n';
+       DEBUG_OUT << "ID: " << id_str_ ;
+      DEBUG_OUT << " iterators: " << iterator_count_<< '\n';
     }
   each (&Translator::print);
 #endif
@@ -402,9 +388,9 @@ Translator_group::do_post_move_processing ()
 }
 
 void
-Translator_group::do_process_requests ()
+Translator_group::do_process_music ()
 {
-  each (&Translator::process_requests);
+  each (&Translator::process_music);
 }
 
 void
@@ -427,7 +413,7 @@ Translator_group::do_add_processing ()
       String s = consists_str_arr_[i];
       Translator * t = output_def_l ()->find_translator_l (s);
       if (!t)
-       warning (_f ("can't find `%s\'", s));
+       warning (_f ("can't find: `%s'", s));
       else
        add_translator (t->clone ());
     }
@@ -436,35 +422,29 @@ Translator_group::do_add_processing ()
        String s = consists_end_str_arr_[i];
        Translator * t = output_def_l ()->find_translator_l (s);
        if (!t)
-        warning (_f ("can't find `%s\'", s));
+        warning (_f ("can't find: `%s'", s));
        else
         add_translator (t->clone ());
     }
 }
 
-Scalar
-Translator_group::get_property (String id,
-                               Translator_group **where_l) const
+SCM
+Translator_group::get_property (SCM sym) const
 {
-  if (properties_dict_.elem_b (id))
+  if (properties_dict_.elem_b (sym))
     {
-      if (where_l)
-       *where_l = (Translator_group*) this; // ugh
-      return properties_dict_[id];
+      return properties_dict_.get (sym);
     }
 
-#if 1
   if (daddy_trans_l_)
-    return daddy_trans_l_->get_property (id, where_l);
-#endif
+    return daddy_trans_l_->get_property (sym);
   
-  if (where_l)
-    *where_l = 0;
-  return "";
+
+  return SCM_UNDEFINED;
 }
 
 void
-Translator_group::set_property (String id, Scalar val)
+Translator_group::set_property (String id, SCM val)
 {
-  properties_dict_[id] = val;
+  properties_dict_.set (ly_symbol2scm (id.ch_C()), val);
 }