X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmusic-output-def.cc;h=ff392eaeeb7bec65fd475d373852880df6c3ac59;hb=7e72a1e50e94a7f9738d62599de79fe7745f600c;hp=ee064079abc4871182a7f854dc01316d08ea5168;hpb=a0095a83df6c42fa70051f9c831b209112349463;p=lilypond.git diff --git a/lily/music-output-def.cc b/lily/music-output-def.cc index ee064079ab..ff392eaeeb 100644 --- a/lily/music-output-def.cc +++ b/lily/music-output-def.cc @@ -3,16 +3,15 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2002 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys */ #include "scm-hash.hh" -#include "dictionary.hh" #include "warn.hh" #include "music-output-def.hh" #include "global-translator.hh" -#include "translator-def.hh" +#include "context-def.hh" #include "main.hh" #include "file-path.hh" #include "lily-guile.hh" @@ -20,26 +19,19 @@ #include "ly-smobs.icc" -int -Music_output_def::get_next_score_count () const -{ - return 0; -} - Music_output_def::Music_output_def () { - style_sheet_ = SCM_EOL; 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 () { } @@ -49,13 +41,11 @@ Music_output_def::Music_output_def (Music_output_def const &s) scope_ = SCM_EOL; translator_tab_ = new Scheme_hash_table (*s.translator_tab_); - style_sheet_ = SCM_EOL; scaled_fonts_ = SCM_EOL; smobify_self (); scm_gc_unprotect_object (translator_tab_->self_scm ()); - style_sheet_ = scm_list_copy (s.style_sheet_); scaled_fonts_ = scm_list_copy (s.scaled_fonts_); scope_= ly_make_anonymous_module (); @@ -71,7 +61,6 @@ SCM Music_output_def::mark_smob (SCM m) { Music_output_def * mo = (Music_output_def*) SCM_CELL_WORD_1 (m); - scm_gc_mark (mo->style_sheet_); scm_gc_mark (mo->translator_tab_->self_scm ()); scm_gc_mark (mo->scope_); @@ -81,26 +70,23 @@ Music_output_def::mark_smob (SCM m) void Music_output_def::assign_translator (SCM transdef) { - Translator_def *tp = unsmob_translator_def (transdef); + Context_def *tp = unsmob_context_def (transdef); assert (tp); + translator_tab_->set (tp->get_context_name (), transdef); - SCM s = ly_symbol2scm (""); - if (gh_string_p (tp->type_name_)) - s = scm_string_to_symbol (tp->type_name_); + String nm = ly_symbol2string (tp->get_context_name ()) + "Context"; - translator_tab_->set (s, transdef); + + scm_module_define (scope_, ly_symbol2scm (nm.to_str0()), transdef); } /* - find the translator for NAME. NAME may be a string or a symbol. + find the translator for NAME. NAME must be a symbol. */ SCM Music_output_def::find_translator (SCM name) const { - if (gh_string_p (name)) - name = scm_string_to_symbol (name); - SCM val =SCM_EOL; translator_tab_->try_retrieve (name, &val); return val; @@ -111,12 +97,12 @@ Global_translator * Music_output_def::get_global_translator () { SCM key = ly_symbol2scm ("Score"); - Translator_def * t = unsmob_translator_def (find_translator (key)); + Context_def * t = unsmob_context_def (find_translator (key)); if (!t) error (_f ("can't find `%s' context", "Score")); - Translator_group * tg = t->instantiate (this); + Translator_group * tg = t->instantiate (this, SCM_EOL); tg->initialize (); @@ -127,34 +113,14 @@ int Music_output_def::print_smob (SCM s, SCM p, scm_print_state *) { Music_output_def * def = unsmob_music_output_def (s); - scm_puts ("#type_name_, p); -#else - (void) def; -#endif + scm_puts ("#< ", p); + scm_puts (classname (def), p); + + (void)def; scm_puts (">", p); return 1; } -/* - ugh: should move into Music_output_def (complication: .midi and .tex - need separate counts.) */ -String -Music_output_def::outname_string () -{ - String out = output_name_global; - int def = get_next_score_count (); - if (def && out != "-") - { - Path p = split_path (out); - p.base += "-" + to_string (def); - out = p.string (); - } - return out; -} - - SCM Music_output_def::get_scmvar (String s) const @@ -176,3 +142,53 @@ Music_output_def::lookup_variable (SCM sym) const return scm_variable_ref (var); } + +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 '() if undefined. " + ) +{ + 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 v = op->lookup_variable (sym); + + if (SCM_VARIABLEP(v)) + return SCM_VARIABLE_REF(v); + else + return SCM_EOL; +} + +LY_DEFINE(ly_output_def_scope, + "ly:output-def-scope", + 1, 0,0, + (SCM def), + "Get the 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; +} +