X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fscore.cc;h=962f820257c3402e4dfc6557450cebc35579283e;hb=9943c08d29026b5a582e15d661c9a0d0b5e37501;hp=b9027e9288c6ecff777a30c9b9f05412f5bf1b75;hpb=c21d49df60cb97801ab33ab8a1bad6f2c81cd820;p=lilypond.git diff --git a/lily/score.cc b/lily/score.cc index b9027e9288..962f820257 100644 --- a/lily/score.cc +++ b/lily/score.cc @@ -3,17 +3,16 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2001 Han-Wen Nienhuys */ -#include +#include "ly-smobs.icc" +#include "scm-hash.hh" #include "score.hh" #include "debug.hh" #include "music-output-def.hh" #include "music-output.hh" -#include "source.hh" -#include "source-file.hh" #include "music-iterator.hh" #include "music.hh" #include "global-translator.hh" @@ -27,29 +26,41 @@ TODO: junkme. */ -Score::Score() - : Input() +Score::Score () + : Input () { header_p_ = 0; - music_p_ = 0; + music_ = SCM_EOL; errorlevel_i_ = 0; + smobify_self (); } Score::Score (Score const &s) : Input (s) { - music_p_ = (s.music_p_) ? s.music_p_->clone() : 0; + music_ = SCM_EOL; + header_p_ = 0; + smobify_self (); + + Music * m =unsmob_music (s.music_); + music_ = m?m->clone ()->self_scm () : SCM_EOL; + scm_unprotect_object (music_); + for (int i=0; i < s.def_p_arr_.size (); i++) - def_p_arr_.push(s.def_p_arr_[i]->clone()); + def_p_arr_.push (s.def_p_arr_[i]->clone ()); errorlevel_i_ = s.errorlevel_i_; - header_p_ = (s.header_p_) ? new Scope (*s.header_p_): 0; + if (s.header_p_) + { + header_p_ = (s.header_p_) ? new Scheme_hash_table (*s.header_p_): 0; + + scm_unprotect_object (header_p_->self_scm ()); + } + } -Score::~Score() +Score::~Score () { - delete header_p_; - junk_pointer_array (def_p_arr_); - delete music_p_; + } void @@ -58,25 +69,27 @@ Score::run_translator (Music_output_def *odef_l) Cpu_timer timer; - Global_translator * trans_p = odef_l->get_global_translator_p(); + Global_translator * trans_p = odef_l->get_global_translator_p (); if (!trans_p) { - non_fatal_error (_("no toplevel translator")); + programming_error ("no toplevel translator"); return ; } - progress_indication ("\n" + _("Interpreting music...")); - trans_p->final_mom_ = music_p_->length_mom (); + progress_indication (_ ("Interpreting music...")); + Music * music = unsmob_music (music_); + + trans_p->final_mom_ = music->length_mom (); - Music_iterator * iter = Music_iterator::static_get_iterator_p (music_p_); - iter->init_translator(music_p_, trans_p); + Music_iterator * iter = Music_iterator::static_get_iterator_p (music); + iter->init_translator (music, trans_p); - iter->construct_children(); + iter->construct_children (); - if (! iter->ok()) + if (! iter->ok ()) { delete iter; - warning (_("Need music in a score")); + warning (_ ("Need music in a score")); errorlevel_i_ =1; return ; } @@ -92,16 +105,20 @@ Score::run_translator (Music_output_def *odef_l) warning (_ ("Errors found/*, not processing score*/")); } - Music_output * output = trans_p->get_output_p(); - delete trans_p; - if(verbose_global_b) + Music_output * output = trans_p->get_output_p (); + scm_unprotect_object (trans_p->self_scm ()); + + if (verbose_global_b) progress_indication (_f ("elapsed time: %.2f seconds", timer.read ())); - output->header_l_ = header_p_; - output->origin_str_ = location_str(); + if (!header_p_) + header_p_ = new Scheme_hash_table; // ugh + Scope bla (header_p_); + output->header_l_ = &bla; + output->origin_str_ = location_str (); progress_indication ("\n"); - output->process(); + output->process (); delete output ; /* @@ -109,20 +126,20 @@ Score::run_translator (Music_output_def *odef_l) the system. */ - scm_gc(); + scm_gc (); } void -Score::process() +Score::process () { - if (!music_p_) + if (!unsmob_music (music_)) return; - print(); + for (int i=0; i < def_p_arr_.size (); i++) { if (no_paper_global_b - && dynamic_cast(def_p_arr_[i])) + && dynamic_cast (def_p_arr_[i])) continue; run_translator (def_p_arr_[i]); } @@ -130,20 +147,33 @@ Score::process() + void -Score::print() const +Score::add_output (Music_output_def *pap_p) { -#ifndef NPRINT - DEBUG_OUT << "score {\n"; - music_p_ -> print (); - for (int i=0; i < def_p_arr_.size (); i++) - def_p_arr_[i]->print(); - DEBUG_OUT << "}\n"; -#endif + def_p_arr_.push (pap_p); } -void -Score::add_output (Music_output_def *pap_p) +IMPLEMENT_SMOBS (Score); +IMPLEMENT_DEFAULT_EQUAL_P (Score); +IMPLEMENT_UNSMOB (Score, score); + +SCM +Score::mark_smob (SCM s) { - def_p_arr_.push(pap_p); + Score * sc = (Score*) SCM_CELL_WORD_1 (s); + if (sc->header_p_) + scm_gc_mark (sc->header_p_->self_scm ()); + for (int i = sc->def_p_arr_.size (); i--;) + scm_gc_mark (sc->def_p_arr_[i]->self_scm ()); + + return sc->music_; +} + +int +Score::print_smob (SCM s, SCM p, scm_print_state*) +{ + scm_puts ("#", p); + + return 1; }