]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/translator-def.cc
* VERSION (MY_PATCH_LEVEL): make 1.7.0
[lilypond.git] / lily / translator-def.cc
index 9c8ffb0d3a5b4954e4f2ea11da2a3f0e75dd3fee..14a4fe5404eefcb4baedc78924d88ca97be8696e 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2000--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 2000--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
   
  */
 
@@ -12,7 +12,6 @@
 #include "translator-group.hh"
 #include "warn.hh"
 #include "music-output-def.hh"
-
 #include "ly-smobs.icc"
 
 int
@@ -41,17 +40,6 @@ Translator_def::mark_smob (SCM smob)
   return me->type_name_;
 }
 
-SCM push_sym;
-SCM assign_sym;
-
-static void
-foo_init ()
-{
-  push_sym = scm_permanent_object (ly_symbol2scm ("push"));
-  assign_sym = scm_permanent_object (ly_symbol2scm ("assign"));
-}
-
-ADD_SCM_INIT_FUNC (transdef, foo_init);
 
 Translator_def::Translator_def ()
 {
@@ -62,7 +50,11 @@ Translator_def::Translator_def ()
   end_consists_name_list_ = SCM_EOL;
   property_ops_ = SCM_EOL;
   type_name_ = SCM_EOL;
+
+  smobify_self();
+  
 }
+
 Translator_def::~Translator_def ()
 {
 }
@@ -70,11 +62,21 @@ Translator_def::~Translator_def ()
 Translator_def::Translator_def (Translator_def const & s)
   : Input (s)
 {
+  type_aliases_ = SCM_EOL;
+  translator_group_type_ = SCM_EOL;
+  accepts_name_list_ = SCM_EOL;   
+  consists_name_list_ = SCM_EOL;
+  end_consists_name_list_ = SCM_EOL;
+  property_ops_ = SCM_EOL;
+  type_name_ = SCM_EOL;
+
+  
+  smobify_self();
   consists_name_list_ = scm_list_copy (s.consists_name_list_);
   end_consists_name_list_ = scm_list_copy (s.end_consists_name_list_);
   accepts_name_list_ = scm_list_copy (s.accepts_name_list_);
   property_ops_ = scm_list_copy (s.property_ops_);
-  type_aliases_ = s.type_aliases_;
+  type_aliases_ = scm_list_copy (s.type_aliases_);
   translator_group_type_ = s.translator_group_type_;
   type_name_ = s.type_name_;
 }
@@ -95,7 +97,7 @@ SCM
 Translator_def::modify_definition (SCM list, SCM str, bool add)
 {
   String s = ly_scm2string (str);
-  if (!get_translator_l (s))
+  if (!get_translator (s))
     error (_ ("Program has no such type"));
 
   if (add)
@@ -138,67 +140,64 @@ Translator_def::add_last_element (SCM s)
 void
 Translator_def::add_push_property (SCM props, SCM syms,  SCM vals)
 {
-  this->property_ops_ = gh_cons (scm_list_n (push_sym, props, syms, vals, SCM_UNDEFINED),
+  this->property_ops_ = gh_cons (scm_list_n (ly_symbol2scm ("push"), props, syms, vals, SCM_UNDEFINED),
                                 this->property_ops_);
 }
 
 void
 Translator_def::add_pop_property (SCM props, SCM syms)
 {
-  this->property_ops_ = gh_cons (scm_list_n (push_sym, props, syms, SCM_UNDEFINED),
+  this->property_ops_ = gh_cons (scm_list_n (ly_symbol2scm ("push"), props, syms, SCM_UNDEFINED),
                                 this->property_ops_);
 }
 
 /*
-  Do it. SYMS maybe a symbol or a list of symbols. VAL is
-  SCM_UNDEFINED in case of a pop
+  Do it. SYM is single symbol. VAL is SCM_UNDEFINED in case of a pop
 */
 void
-Translator_def::apply_pushpop_property (Translator_group* me,SCM syms, SCM eprop, SCM val)
+Translator_def::apply_pushpop_property (Translator_group* me,SCM sym, SCM eprop, SCM val)
 {
-  if (gh_symbol_p (syms))
-    dynamic_cast<Translator_group*> (me)->execute_single_pushpop_property (syms, eprop, val);
-  else for (SCM s = syms; gh_pair_p (s); s = ly_cdr (s))
-    dynamic_cast<Translator_group*> (me)->execute_single_pushpop_property (ly_car (s), eprop, val);
+  dynamic_cast<Translator_group*> (me)
+    ->execute_single_pushpop_property (sym, eprop, val);
 }
 
 
 
 Link_array<Translator_def>
-Translator_def::path_to_acceptable_translator (SCM type_str, Music_output_def* odef) const
+Translator_def::path_to_acceptable_translator (SCM type_string, Music_output_def* odef) const
 {
-  assert (gh_string_p (type_str));
+  assert (gh_string_p (type_string));
   
-  Link_array<Translator_def> accepted_arr;
+  Link_array<Translator_def> accepteds;
   for (SCM s = accepts_name_list_; gh_pair_p (s); s = ly_cdr (s))
     {
-      Translator_def *t = unsmob_translator_def (odef->find_translator_l (ly_car (s)));
+      Translator_def *t = unsmob_translator_def (odef->find_translator (ly_car (s)));
       if (!t)
        continue;
-      accepted_arr.push (t);
+      accepteds.push (t);
     }
 
   Link_array<Translator_def> best_result;
-  for (int i=0; i < accepted_arr.size (); i++)
+  for (int i=0; i < accepteds.size (); i++)
     {
 
       /*
        don't check aliases, because \context Staff should not create RhythmicStaff.
       */
-      if (gh_equal_p (accepted_arr[i]->type_name_, type_str))
+      if (gh_equal_p (accepteds[i]->type_name_, type_string))
        {
-         best_result.push (accepted_arr[i]);
+         best_result.push (accepteds[i]);
          return best_result;
        }
     }
       
   int best_depth= INT_MAX;
-  for (int i=0; i < accepted_arr.size (); i++)
+  for (int i=0; i < accepteds.size (); i++)
     {
-      Translator_def * g = accepted_arr[i];
+      Translator_def * g = accepteds[i];
 
       Link_array<Translator_def> result
-       = g->path_to_acceptable_translator (type_str, odef);
+       = g->path_to_acceptable_translator (type_string, odef);
       if (result.size () && result.size () < best_depth)
        {
          result.insert (g,0);
@@ -219,7 +218,7 @@ trans_list (SCM namelist, Translator_group*tg)
   SCM l = SCM_EOL;
   for (SCM s = namelist; gh_pair_p (s) ; s = ly_cdr (s))
     {
-      Translator * t = get_translator_l (ly_scm2string (ly_car (s)));
+      Translator * t = get_translator (ly_scm2string (ly_car (s)));
       if (!t)
        warning (_f ("can't find: `%s'", s));
       else
@@ -228,8 +227,8 @@ trans_list (SCM namelist, Translator_group*tg)
          SCM str = tr->self_scm ();
          l = gh_cons (str, l);
 
-         tr->daddy_trans_l_ = tg;
-         tr->output_def_l_  = tg->output_def_l_;
+         tr->daddy_trans_ = tg;
+         tr->output_def_  = tg->output_def_;
 
          scm_gc_unprotect_object (str);
        }
@@ -241,13 +240,17 @@ trans_list (SCM namelist, Translator_group*tg)
 Translator_group *
 Translator_def::instantiate (Music_output_def* md)
 {
-  Translator * g = get_translator_l (ly_scm2string (translator_group_type_));
+  Translator * g = get_translator (ly_scm2string (translator_group_type_));
   g = g->clone (); 
 
   Translator_group *tg = dynamic_cast<Translator_group*> (g);
-  tg->output_def_l_ = md;
+  tg->output_def_ = md;
   tg->definition_ = self_scm ();
-  tg->type_str_ = ly_scm2string (type_name_);
+  tg->type_string_ = ly_scm2string (type_name_);
+
+  /*
+    TODO: ugh. we're reversing CONSISTS_NAME_LIST_ here
+   */
   SCM l1 = trans_list (consists_name_list_, tg);
   SCM l2 =trans_list (end_consists_name_list_,tg);
   l1 = scm_reverse_x (l1, l2);
@@ -268,14 +271,14 @@ Translator_def::apply_property_operations (Translator_group*tg)
       SCM type = ly_car (entry);
       entry = ly_cdr (entry); 
       
-      if (type == push_sym)
+      if (type == ly_symbol2scm ("push"))
        {
          SCM val = ly_cddr (entry);
          val = gh_pair_p (val) ? ly_car (val) : SCM_UNDEFINED;
 
          apply_pushpop_property (tg, ly_car (entry), ly_cadr (entry), val);
        }
-      else if (type == assign_sym)
+      else if (type == ly_symbol2scm ("assign"))
        {
          tg->internal_set_property (ly_car (entry), ly_cadr (entry));
        }
@@ -286,20 +289,22 @@ SCM
 Translator_def::clone_scm () const
 {
   Translator_def * t = new Translator_def (*this);
-  return t->unprotected_smobify_self ();
+  scm_gc_unprotect_object (t->self_scm());
+  return t->self_scm();
 }
 
 SCM
 Translator_def::make_scm ()
 {
   Translator_def* t = new Translator_def;
-  return t->unprotected_smobify_self ();
+  scm_gc_unprotect_object (t->self_scm());
+  return t->self_scm();
 }
 
 void
 Translator_def::add_property_assign (SCM nm, SCM val)
 {
-  this->property_ops_ = gh_cons (scm_list_n (assign_sym, scm_string_to_symbol (nm), val, SCM_UNDEFINED),
+  this->property_ops_ = gh_cons (scm_list_n (ly_symbol2scm ("assign"), scm_string_to_symbol (nm), val, SCM_UNDEFINED),
                                 this->property_ops_);
 }
 
@@ -315,7 +320,7 @@ Translator_def::default_child_context_name ()
 }
 
 SCM
-Translator_def::to_alist ()const
+Translator_def::to_alist () const
 {
   SCM l = SCM_EOL;