X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmusic-output-def.cc;h=e2c32b6dd25a6cffa1119369c0f78d1ff917eb80;hb=6b93aa32e32d736202d803c68f5156cc253a5f7c;hp=edc315cb7b708a6b87dcf3f79c428a368af1064a;hpb=c0270765c0df9cceda34a6584f7da324eed5fc2a;p=lilypond.git diff --git a/lily/music-output-def.cc b/lily/music-output-def.cc index edc315cb7b..e2c32b6dd2 100644 --- a/lily/music-output-def.cc +++ b/lily/music-output-def.cc @@ -3,92 +3,159 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys */ -#include "dictionary.hh" -#include "scope.hh" -#include "debug.hh" +#include "scm-hash.hh" + +#include "warn.hh" #include "music-output-def.hh" -#include "global-translator.hh" -#include "translator-def.hh" -#include "identifier.hh" +#include "global-context.hh" +#include "context-def.hh" #include "main.hh" +#include "file-path.hh" #include "lily-guile.hh" +#include "ly-module.hh" -int -Music_output_def::get_next_default_count () const -{ - return 0; -} - - +#include "ly-smobs.icc" Music_output_def::Music_output_def () { - scope_p_ = new Scope; - translator_p_dict_p_ = new Scope; + scaled_fonts_ = SCM_EOL; + translator_tab_ = new Scheme_hash_table; + scope_ = SCM_EOL; + smobify_self (); + + scm_gc_unprotect_object (translator_tab_->self_scm ()); + scope_ = ly_make_anonymous_module (); } Music_output_def::~Music_output_def () { - delete scope_p_; - delete translator_p_dict_p_; } Music_output_def::Music_output_def (Music_output_def const &s) { - scope_p_ = new Scope (*s.scope_p_); - translator_p_dict_p_ = new Scope (*s.translator_p_dict_p_); + scope_ = SCM_EOL; + translator_tab_ = 0; + scaled_fonts_ = SCM_EOL; + smobify_self (); + + translator_tab_ = new Scheme_hash_table (*s.translator_tab_); + scm_gc_unprotect_object (translator_tab_->self_scm ()); + + scaled_fonts_ = scm_list_copy (s.scaled_fonts_); + + scope_= ly_make_anonymous_module (); + if (ly_module_p (s.scope_)) + ly_import_module (scope_, s.scope_); +} + + +IMPLEMENT_SMOBS (Music_output_def); +IMPLEMENT_DEFAULT_EQUAL_P (Music_output_def); + +SCM +Music_output_def::mark_smob (SCM m) +{ + Music_output_def * mo = (Music_output_def*) SCM_CELL_WORD_1 (m); + if (mo->translator_tab_) + scm_gc_mark (mo->translator_tab_->self_scm ()); + scm_gc_mark (mo->scope_); + + return mo->scaled_fonts_; } void -Music_output_def::assign_translator (SCM transdef) +Music_output_def::assign_context_def (SCM transdef) { - Translator_def *tp = unsmob_translator_def (transdef); + Context_def *tp = unsmob_context_def (transdef); assert (tp); - String s = ly_scm2string (tp->type_name_); - translator_p_dict_p_->set (s, transdef); + translator_tab_->set (tp->get_context_name (), transdef); + + String nm = ly_symbol2string (tp->get_context_name ()) + "Context"; + + + scm_module_define (scope_, ly_symbol2scm (nm.to_str0 ()), transdef); } +/* + find the translator for NAME. NAME must be a symbol. +*/ SCM -Music_output_def::find_translator_l (SCM name) const -{ - String s = ly_scm2string (name); - +Music_output_def::find_context_def (SCM name) const +{ SCM val =SCM_EOL; - if (translator_p_dict_p_->elem_b (s)) - return translator_p_dict_p_->scm_elem (s); + translator_tab_->try_retrieve (name, &val); return val; } +int +Music_output_def::print_smob (SCM s, SCM p, scm_print_state *) +{ + Music_output_def * def = unsmob_music_output_def (s); + scm_puts ("#< ", p); + scm_puts (classname (def), p); + + (void)def; + scm_puts (">", p); + return 1; +} -Global_translator * -Music_output_def::get_global_translator_p () +SCM +Music_output_def::get_scmvar (String s) const { - Translator_def * t = unsmob_translator_def (find_translator_l (ly_str02scm ("Score"))); - if (!t) - error (_f ("can't find `%s' context", "Score")); + return lookup_variable (ly_symbol2scm (s.to_str0 ())); +} - Translator_group * tg = t->instantiate (this); - - tg->initialize (); - - return dynamic_cast (tg); +void +Music_output_def::set_variable (SCM sym, SCM val) +{ + scm_module_define (scope_, sym, val); } +SCM +Music_output_def::lookup_variable (SCM sym) const +{ + SCM var = ly_module_lookup (scope_, sym); + return scm_variable_ref (var); +} -String -Music_output_def::get_default_output () const +LY_DEFINE (ly_paper_lookup, "ly:paper-lookup", + 2, 0,0, (SCM pap, SCM sym), + "Lookup @var{sym} in @var{pap}. " + "Return the value or @code{'()} if undefined.") { - if (safe_global_b || !scope_p_->elem_b ("output")) - return ""; - SCM s = scope_p_->scm_elem ("output"); - - return gh_string_p (s) ? ly_scm2string (s) : String (""); + Music_output_def *op = unsmob_music_output_def (pap); + SCM_ASSERT_TYPE (op, pap, SCM_ARG1, __FUNCTION__, "Paper"); + SCM_ASSERT_TYPE (gh_symbol_p (sym), sym, SCM_ARG2, __FUNCTION__, "symbol"); + + SCM var = ly_module_lookup (op->scope_, sym); + if (SCM_VARIABLEP (var)) + return SCM_VARIABLE_REF (var); + else + return SCM_EOL; } +LY_DEFINE (ly_output_def_scope, "ly:output-def-scope", + 1, 0,0, (SCM def), + "Get the variable scope inside @var{def}.") +{ + Music_output_def *op = unsmob_music_output_def (def); + SCM_ASSERT_TYPE (op, def, SCM_ARG1, __FUNCTION__, "Output definition"); + return op->scope_; +} +LY_DEFINE (ly_output_def_clone, "ly:output-def-clone", + 1, 0, 0, (SCM def), + "Clone @var{def}.") +{ + Music_output_def *op = unsmob_music_output_def (def); + SCM_ASSERT_TYPE (op, def, SCM_ARG1, __FUNCTION__, "Output definition"); + SCM s = op->clone ()->self_scm (); + scm_gc_unprotect_object (s); + return s; +}