/*
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 unsmob<Input> (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 *) const
{
- 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 () const
{
- 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
Context_def::add_context_mod (SCM mod)
{
SCM tag = scm_car (mod);
- if (ly_symbol2scm ("description") == tag)
+ if (scm_is_eq (tag, ly_symbol2scm ("description")))
{
description_ = scm_cadr (mod);
return;
if (scm_is_string (sym))
sym = scm_string_to_symbol (sym);
- if (ly_symbol2scm ("default-child") == tag)
+ if (scm_is_eq (tag, ly_symbol2scm ("default-child")))
default_child_ = sym;
- else if (ly_symbol2scm ("consists") == tag
- || ly_symbol2scm ("remove") == tag)
+ else if (scm_is_eq (tag, ly_symbol2scm ("consists"))
+ || scm_is_eq (tag, ly_symbol2scm ("remove")))
{
translator_mods_ = scm_cons (scm_list_2 (tag, sym), translator_mods_);
}
- else if (ly_symbol2scm ("accepts") == tag
- || ly_symbol2scm ("denies") == tag)
+ else if (scm_is_eq (tag, ly_symbol2scm ("accepts"))
+ || scm_is_eq (tag, ly_symbol2scm ("denies")))
accept_mods_ = scm_cons (scm_list_2 (tag, sym), accept_mods_);
- else if (ly_symbol2scm ("pop") == tag
- || ly_symbol2scm ("push") == tag
- || ly_symbol2scm ("assign") == tag
- || ly_symbol2scm ("unset") == tag
- || ly_symbol2scm ("apply") == tag)
+ else if (scm_is_eq (tag, ly_symbol2scm ("pop"))
+ || scm_is_eq (tag, ly_symbol2scm ("push"))
+ || scm_is_eq (tag, ly_symbol2scm ("assign"))
+ || scm_is_eq (tag, ly_symbol2scm ("unset"))
+ || scm_is_eq (tag, ly_symbol2scm ("apply")))
property_ops_ = scm_cons (mod, property_ops_);
- else if (ly_symbol2scm ("alias") == tag)
+ else if (scm_is_eq (tag, ly_symbol2scm ("alias")))
context_aliases_ = scm_cons (sym, context_aliases_);
- else if (ly_symbol2scm ("translator-type") == tag)
+ else if (scm_is_eq (tag, ly_symbol2scm ("translator-type")))
translator_group_type_ = sym;
- else if (ly_symbol2scm ("context-name") == tag)
+ else if (scm_is_eq (tag, ly_symbol2scm ("context-name")))
context_name_ = sym;
else
programming_error ("unknown context mod tag");
{
SCM tag = scm_caar (s);
SCM sym = scm_cadar (s);
- if (tag == ly_symbol2scm ("accepts"))
+ if (scm_is_eq (tag, ly_symbol2scm ("accepts")))
acc = scm_cons (sym, acc);
- else if (tag == ly_symbol2scm ("denies"))
+ else if (scm_is_eq (tag, ly_symbol2scm ("denies")))
acc = scm_delete_x (sym, acc);
}
for (SCM s = user_mod; scm_is_pair (s); s = scm_cdr (s))
{
SCM entry = scm_car (s);
- if (scm_car (entry) == ly_symbol2scm ("default-child"))
+ if (scm_is_eq (scm_car (entry), ly_symbol2scm ("default-child")))
{
name = scm_cadr (entry);
break;
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 = unsmob<Context_def> (find_context_def (odef,
scm_car (s))))
accepteds.push_back (t);
if (scm_is_string (arg))
arg = scm_string_to_symbol (arg);
- if (ly_symbol2scm ("consists") == tag)
+ if (scm_is_eq (tag, ly_symbol2scm ("consists")))
l1 = scm_cons (arg, l1);
- else if (ly_symbol2scm ("remove") == tag
+ else if (scm_is_eq (tag, ly_symbol2scm ("remove"))
&& (scm_is_pair (arg)
|| ly_is_procedure (arg)
|| get_translator (arg)))
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.")
+ "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 = unsmob<Context_def> (def);
LY_ASSERT_TYPE (ly_is_symbol, sym, 2);
SCM res = cd->lookup (sym);
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 = unsmob<Context_def> (def)->clone ();
- for (SCM s = unsmob_context_mod (mod)->get_mods ();
+ for (SCM s = unsmob<Context_mod> (mod)->get_mods ();
scm_is_pair (s);
s = scm_cdr (s))
cd->add_context_mod (scm_car (s));