From ae0495dda1032c3994c770d727c65b46e702459c Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Sun, 11 Mar 2012 14:48:51 +0100 Subject: [PATCH] Implement ly:output-find-context-def --- lily/context-def.cc | 12 ++++++++++++ lily/include/context-def.hh | 1 + lily/output-def-scheme.cc | 27 +++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/lily/context-def.cc b/lily/context-def.cc index 9c988f4da9..d4f3dc3433 100644 --- a/lily/context-def.cc +++ b/lily/context-def.cc @@ -374,6 +374,18 @@ Context_def::lookup (SCM sym) const return SCM_UNDEFINED; } +bool +Context_def::is_alias (SCM sym) const +{ + if (scm_is_eq (sym, ly_symbol2scm ("Bottom"))) + return !scm_is_pair (get_accepted (SCM_EOL)); + + if (scm_is_eq (sym, get_context_name ())) + return true; + + return scm_is_true (scm_c_memq (sym, context_aliases_)); +} + LY_DEFINE (ly_context_def_lookup, "ly:context-def-lookup", 2, 1, 0, (SCM def, SCM sym, SCM val), "Return the value of @var{sym} in output definition @var{def}" diff --git a/lily/include/context-def.hh b/lily/include/context-def.hh index 8f4218745b..2fddd980b7 100644 --- a/lily/include/context-def.hh +++ b/lily/include/context-def.hh @@ -57,6 +57,7 @@ public: SCM get_translator_group_type () const { return translator_group_type_; } void set_acceptor (SCM accepts, bool add); SCM lookup (SCM sym) const; + bool is_alias (SCM sym) const; VIRTUAL_COPY_CONSTRUCTOR (Context_def, Context_def); diff --git a/lily/output-def-scheme.cc b/lily/output-def-scheme.cc index 43d5b64105..a2e1e34513 100644 --- a/lily/output-def-scheme.cc +++ b/lily/output-def-scheme.cc @@ -91,6 +91,8 @@ LY_DEFINE (ly_output_description, "ly:output-description", 1, 0, 0, (SCM output_def), "Return the description of translators in @var{output-def}.") { + LY_ASSERT_SMOB (Output_def, output_def, 1); + Output_def *id = unsmob_output_def (output_def); SCM al = ly_module_2_alist (id->scope_); @@ -105,6 +107,31 @@ LY_DEFINE (ly_output_description, "ly:output-description", return ell; } +LY_DEFINE (ly_output_find_context_def, "ly:output-find-context-def", + 1, 1, 0, (SCM output_def, SCM context_name), + "Return an alist of all context defs (matching @var{context-name}" + "if given) in @var{output-def}.") +{ + LY_ASSERT_SMOB (Output_def, output_def, 1); + if (!SCM_UNBNDP (context_name)) + LY_ASSERT_TYPE (ly_is_symbol, context_name, 2); + + Output_def *id = unsmob_output_def (output_def); + + SCM al = ly_module_2_alist (id->scope_); + SCM ell = SCM_EOL; + for (SCM s = al; scm_is_pair (s); s = scm_cdr (s)) + { + SCM p = scm_car (s); + Context_def *td = unsmob_context_def (scm_cdr (p)); + if (td && scm_is_eq (scm_car (p), td->get_context_name ()) + && (SCM_UNBNDP (context_name) || td->is_alias (context_name))) + ell = scm_cons (p, ell); + } + return ell; +} + + LY_DEFINE (ly_output_def_p, "ly:output-def?", 1, 0, 0, (SCM def), "Is @var{def} an output definition?") -- 2.39.5