]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/context.cc
release commit
[lilypond.git] / lily / context.cc
index df3766b82a13ec0b3078cc91022dd583d46b0bad..6b539519e1629af16abbb30e92071835a17ba6e0 100644 (file)
@@ -11,7 +11,7 @@
 #include "context-def.hh"
 #include "context.hh"
 #include "warn.hh"
-#include "music-output-def.hh"
+#include "output-def.hh"
 #include "scm-hash.hh"
 #include "main.hh"
 #include "ly-smobs.icc"
@@ -21,22 +21,20 @@ bool
 Context::is_removable () const
 {
   return context_list_ == SCM_EOL && ! iterator_count_ &&
-         !dynamic_cast<Score_context const*> (this)
-    ;
+         !dynamic_cast<Score_context const*> (this);
 }
 
-
 void
 Context::check_removal ()
 {
-  for (SCM p = context_list_; gh_pair_p (p); p = gh_cdr (p))
+  for (SCM p = context_list_; scm_is_pair (p); p = ly_cdr (p))
     {
       Context *trg =  unsmob_context (ly_car (p));
 
       trg->check_removal ();
       if (trg->is_removable ())
        {
-         recurse_down_translators (trg, &Translator::finalize, false);
+         recurse_over_translators (trg, &Translator::finalize, UP);
          remove_context (trg);
        }
     }
@@ -57,8 +55,8 @@ void
 Context::add_context (Context*t)
 {
   SCM ts = t->self_scm ();
-  context_list_ = gh_append2 (context_list_,
-                             gh_cons (ts, SCM_EOL));
+  context_list_ = ly_append2 (context_list_,
+                             scm_cons (ts, SCM_EOL));
   
   t->daddy_context_ = this;
   if (!t->init_)
@@ -69,12 +67,12 @@ Context::add_context (Context*t)
       Context_def * td = unsmob_context_def (t->definition_);
 
       /*
-       this can not move before add_context(), because \override
+       this can not move before add_context (), because \override
        operations require that we are in the hierarchy.
       */
       td->apply_default_property_operations (t);
 
-      recurse_down_translators (t, &Translator::initialize, true);
+      recurse_over_translators (t, &Translator::initialize, DOWN);
     }
 }
 
@@ -82,6 +80,7 @@ Context::Context ()
 {
   daddy_context_ = 0;
   init_ = false;
+  aliases_ = SCM_EOL;
   iterator_count_  = 0;
   implementation_ = SCM_EOL;
   properties_scm_ = SCM_EOL;
@@ -91,34 +90,25 @@ Context::Context ()
   
   smobify_self ();
 
-  Scheme_hash_table *tab = new Scheme_hash_table ;
-  properties_scm_ = tab->self_scm ();
-  scm_gc_unprotect_object (tab->self_scm ());
+  properties_scm_ = (new Scheme_hash_table)->self_scm ();
+  scm_gc_unprotect_object (properties_scm_);
 }
 
-Context *
-Context::find_existing_context (SCM n, String id)
-{
-  if ((is_alias (n) && (id_string_ == id || id.is_empty ())) || n == ly_symbol2scm ("Current"))
-    return this;
-
-  Context* r = 0;
-  for (SCM p = context_list_; !r && gh_pair_p (p); p = ly_cdr (p))
-    {
-      Context *  t = unsmob_context (ly_car (p));
-      
-      r = dynamic_cast<Context*> (t)->find_existing_context (n, id);
-    }
-
-  return r;
-}
 
 
 Context*
 Context::find_create_context (SCM n, String id,
                              SCM operations)
 {
-  Context * existing = find_existing_context (n,id);
+  /*
+    Don't create multiple score contexts.
+   */
+  if (dynamic_cast<Global_context*> (this)
+      && dynamic_cast<Global_context*> (this)->get_score_context ())
+    return get_score_context ()->find_create_context (n, id, operations);
+    
+  
+  Context * existing = find_context_below (this, n,id);
   if (existing)
     return existing;
 
@@ -161,8 +151,12 @@ Context::find_create_context (SCM n, String id,
       return current;
     }
 
+  /*
+    Don't go up to Global_context, because global goes down to
+    Score_context
+   */
   Context *ret = 0;
-  if (daddy_context_)
+  if (daddy_context_ && !dynamic_cast<Global_context*> (daddy_context_))
     ret = daddy_context_->find_create_context (n, id, operations);
   else
     {
@@ -178,10 +172,10 @@ Context::find_create_context (SCM n, String id,
   none.
 */
 SCM
-default_child_context_name (Context const *tg)
+Context::default_child_context_name () const
 {
-  return gh_pair_p (tg->accepts_list_)
-    ? ly_car (scm_last_pair (tg->accepts_list_))
+  return scm_is_pair (accepts_list_)
+    ? ly_car (scm_last_pair (accepts_list_))
     : SCM_EOL;
 }
 
@@ -189,7 +183,7 @@ default_child_context_name (Context const *tg)
 bool
 Context::is_bottom_context () const
 {
-  return !gh_symbol_p (default_child_context_name (this));
+  return !scm_is_symbol (default_child_context_name ());
 }
 
 Context*
@@ -197,8 +191,8 @@ Context::get_default_interpreter ()
 {
   if (!is_bottom_context ())
     {
-      SCM nm = default_child_context_name (this);
-      SCM st = get_output_def ()->find_context_def (nm);
+      SCM nm = default_child_context_name ();
+      SCM st = find_context_def (get_output_def (), nm);
 
       Context_def *t = unsmob_context_def (st);
       if (!t)
@@ -250,11 +244,22 @@ bool
 Context::is_alias (SCM sym) const
 {
   if (sym == ly_symbol2scm ("Bottom")
-      && !gh_pair_p (accepts_list_))
+      && !scm_is_pair (accepts_list_))
+    return true;
+  if (sym == unsmob_context_def (definition_)->get_context_name ())
     return true;
-  return unsmob_context_def (definition_)->is_alias (sym);
+  
+  return scm_c_memq (sym, aliases_) != SCM_BOOL_F;
+}
+
+void
+Context::add_alias (SCM sym)
+{
+  aliases_ = scm_cons (sym, aliases_);
 }
 
+
+
 void
 Context::internal_set_property (SCM sym, SCM val)
 {
@@ -293,19 +298,19 @@ Context::remove_context (Context*trans)
  */
 Context *
 find_context_below (Context * where,
-                   String type, String id)
+                   SCM type, String id)
 {
-  if (where->is_alias (ly_symbol2scm (type.to_str0 ())))
+  if (where->is_alias (type))
     {
-      if (id == "" || where->id_string_ == id)
+      if (id == "" || where->id_string () == id)
        return where;
     }
   
   Context * found = 0;
-  for (SCM s = where->context_list_;
-       !found && gh_pair_p (s); s = gh_cdr (s))
+  for (SCM s = where->children_contexts ();
+       !found && scm_is_pair (s); s = ly_cdr (s))
     {
-      Context * tr = unsmob_context (gh_car (s));
+      Context * tr = unsmob_context (ly_car (s));
 
       found = find_context_below (tr, type, id);
     }
@@ -316,7 +321,7 @@ find_context_below (Context * where,
 SCM
 Context::properties_as_alist () const
 {
-  return properties_dict()->to_alist();
+  return properties_dict ()->to_alist ();
 }
 
 String
@@ -338,14 +343,14 @@ Context::get_score_context () const
     return 0;
 }
 
-Music_output_def *
+Output_def *
 Context::get_output_def () const
 {
   return  (daddy_context_)
     ? daddy_context_->get_output_def () : 0;
 }
 
-Context::~Context()
+Context::~Context ()
 {
   
 }
@@ -353,7 +358,7 @@ Context::~Context()
 Moment
 Context::now_mom () const
 {
-  return daddy_context_->now_mom();
+  return daddy_context_->now_mom ();
 }
 
 int
@@ -377,17 +382,8 @@ Context::print_smob (SCM s, SCM port, scm_print_state *)
   
 
   scm_puts (" ", port);
-  scm_display (sc->implementation_, port);
-  
-#if 0
-  Translator * tr = unsmob_translator (sc->implementation_);
-  if  (Translator_group *tg = dynamic_cast<Translator_group*> (tr))
-    scm_display (tg->get_simple_trans_list (), port);
-#endif
-  
-  /*
-    don't try to print properties, that is too much hassle.
-   */
+
+  scm_display (sc->context_list_, port);
   scm_puts (" >", port);
   
   return 1;
@@ -399,6 +395,7 @@ Context::mark_smob (SCM sm)
   Context * me = (Context*) SCM_CELL_WORD_1 (sm);
   
   scm_gc_mark (me->context_list_);
+  scm_gc_mark (me->aliases_);
   scm_gc_mark (me->definition_);  
   scm_gc_mark (me->properties_scm_);  
   scm_gc_mark (me->accepts_list_);
@@ -409,12 +406,12 @@ Context::mark_smob (SCM sm)
 
 IMPLEMENT_SMOBS (Context);
 IMPLEMENT_DEFAULT_EQUAL_P (Context);
-IMPLEMENT_TYPE_P(Context,"ly:context?");
+IMPLEMENT_TYPE_P (Context,"ly:context?");
 
 bool
 Context::try_music (Music* m)
 {
-  Translator*  t = unsmob_translator (implementation_);
+  Translator*  t = implementation ();
   if (!t)
     return false;
   
@@ -438,3 +435,15 @@ Context::get_global_context () const
   programming_error ("No Global context!");
   return 0;
 }
+
+Context*
+Context::get_parent_context () const
+{
+  return daddy_context_;
+}
+
+Translator_group*
+Context::implementation () const
+{
+  return dynamic_cast<Translator_group*> (unsmob_translator (implementation_));
+}