/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2000--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 2000--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
smobify_self ();
- input_location_ = make_input (Input ());
+ input_location_ = Input ().smobbed_copy ();
context_name_ = ly_symbol2scm ("");
}
Input *
Context_def::origin () const
{
- return unsmob_input (input_location_);
+ return Input::unsmob (input_location_);
}
Context_def::Context_def (Context_def const &s)
+ : Smob<Context_def> ()
{
context_aliases_ = SCM_EOL;
translator_group_type_ = SCM_EOL;
smobify_self ();
description_ = s.description_;
- input_location_ = make_input (*s.origin ());
+ input_location_ = s.origin ()->smobbed_copy ();
default_child_ = s.default_child_;
accept_mods_ = s.accept_mods_;
property_ops_ = s.property_ops_;
{
}
-#include "ly-smobs.icc"
-IMPLEMENT_SMOBS (Context_def);
-IMPLEMENT_DEFAULT_EQUAL_P (Context_def);
-IMPLEMENT_TYPE_P (Context_def, "ly:context-def?");
+const char Context_def::type_p_name_[] = "ly:context-def?";
int
-Context_def::print_smob (SCM smob, SCM port, scm_print_state *)
+Context_def::print_smob (SCM port, scm_print_state *)
{
- Context_def *me = (Context_def *) SCM_CELL_WORD_1 (smob);
-
scm_puts ("#<Context_def ", port);
- scm_display (me->context_name_, port);
+ scm_display (context_name_, port);
+ scm_puts (" ", port);
+ string loc = origin ()->location_string ();
+ scm_puts (loc.c_str (), port);
scm_puts (">", port);
return 1;
}
SCM
-Context_def::mark_smob (SCM smob)
+Context_def::mark_smob ()
{
- ASSERT_LIVE_IS_ALLOWED ();
-
- Context_def *me = (Context_def *) SCM_CELL_WORD_1 (smob);
-
- scm_gc_mark (me->description_);
- scm_gc_mark (me->context_aliases_);
- scm_gc_mark (me->accept_mods_);
- scm_gc_mark (me->translator_mods_);
- scm_gc_mark (me->property_ops_);
- scm_gc_mark (me->translator_group_type_);
- scm_gc_mark (me->default_child_);
- scm_gc_mark (me->input_location_);
-
- return me->context_name_;
+ ASSERT_LIVE_IS_ALLOWED (self_scm ());
+
+ scm_gc_mark (description_);
+ scm_gc_mark (context_aliases_);
+ scm_gc_mark (accept_mods_);
+ scm_gc_mark (translator_mods_);
+ scm_gc_mark (property_ops_);
+ scm_gc_mark (translator_group_type_);
+ scm_gc_mark (default_child_);
+ scm_gc_mark (input_location_);
+
+ return context_name_;
}
void
|| ly_symbol2scm ("push") == tag
|| ly_symbol2scm ("assign") == tag
|| ly_symbol2scm ("unset") == tag
- || ly_symbol2scm ("apply") == tag)
+ || ly_symbol2scm ("apply") == tag)
property_ops_ = scm_cons (mod, property_ops_);
else if (ly_symbol2scm ("alias") == tag)
context_aliases_ = scm_cons (sym, context_aliases_);
vector<Context_def *> accepteds;
for (SCM s = accepted; scm_is_pair (s); s = scm_cdr (s))
- if (Context_def *t = unsmob_context_def (find_context_def (odef,
+ if (Context_def *t = Context_def::unsmob (find_context_def (odef,
scm_car (s))))
accepteds.push_back (t);
l1 = scm_cons (arg, l1);
else if (ly_symbol2scm ("remove") == tag
&& (scm_is_pair (arg)
- || ly_is_procedure (arg)
- || get_translator (arg)))
+ || ly_is_procedure (arg)
+ || get_translator (arg)))
l1 = scm_delete_x (arg, l1);
}
context->definition_mods_ = ops;
context->aliases_ = context_aliases_;
context->accepts_list_ = get_accepted (ops);
+ context->default_child_ = get_default_child (ops);
return context;
}
get_translator_names (SCM_EOL)), ell);
ell = scm_cons (scm_cons (ly_symbol2scm ("description"), description_), ell);
ell = scm_cons (scm_cons (ly_symbol2scm ("aliases"), context_aliases_), ell);
+ ell = scm_cons (scm_cons (ly_symbol2scm ("accepts"), get_accepted (SCM_EOL)),
+ ell);
+ if (scm_is_symbol (default_child_))
+ ell = scm_acons (ly_symbol2scm ("default-child"), default_child_, ell);
ell = scm_cons (scm_cons (ly_symbol2scm ("accepts"), get_accepted (SCM_EOL)),
ell);
ell = scm_cons (scm_cons (ly_symbol2scm ("property-ops"), property_ops_),
Context_def::is_alias (SCM sym) const
{
if (scm_is_eq (sym, ly_symbol2scm ("Bottom")))
- return !scm_is_pair (get_accepted (SCM_EOL));
+ return !scm_is_symbol (get_default_child (SCM_EOL));
if (scm_is_eq (sym, get_context_name ()))
return true;
}
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}"
- " (e.g., @code{\\paper}). If no value is found, return"
- " @var{val} or @code{'()} if @var{val} is undefined.")
+ 2, 1, 0, (SCM def, SCM sym, SCM val),
+ "Return the value of @var{sym} in context definition @var{def}"
+ " (e.g., @code{\\Voice}). If no value is found, return"
+ " @var{val} or @code{'()} if @var{val} is undefined."
+ " @var{sym} can be any of @samp{default-child}, @samp{consists},"
+ " @samp{description}, @samp{aliases}, @samp{accepts},"
+ " @samp{property-ops}, @samp{context-name}, @samp{group-type}.")
{
LY_ASSERT_SMOB (Context_def, def, 1);
- Context_def *cd = unsmob_context_def (def);
+ Context_def *cd = Context_def::unsmob (def);
LY_ASSERT_TYPE (ly_is_symbol, sym, 2);
SCM res = cd->lookup (sym);
}
LY_DEFINE (ly_context_def_modify, "ly:context-def-modify",
- 2, 0, 0, (SCM def, SCM mod),
- "Return the result of applying the context-mod @var{mod} to"
- " the context definition @var{def}. Does not change @var{def}.")
+ 2, 0, 0, (SCM def, SCM mod),
+ "Return the result of applying the context-mod @var{mod} to"
+ " the context definition @var{def}. Does not change @var{def}.")
{
LY_ASSERT_SMOB (Context_def, def, 1);
LY_ASSERT_SMOB (Context_mod, mod, 2);
- Context_def *cd = unsmob_context_def (def)->clone ();
+ Context_def *cd = Context_def::unsmob (def)->clone ();
- for (SCM s = unsmob_context_mod (mod)->get_mods ();
+ for (SCM s = Context_mod::unsmob (mod)->get_mods ();
scm_is_pair (s);
s = scm_cdr (s))
cd->add_context_mod (scm_car (s));