/*
stream-event.cc -- implement Stream_event
source file of the GNU LilyPond music typesetter
(c) 2005-2006 Erik Sandberg
*/
#include "stream-event.hh"
#include "ly-smobs.icc"
#include "context.hh"
#include "input.hh"
#include "input-smob.hh"
// ES todo: Add stuff to lily-proto.hh: Stream_event and its subclasses, Stream_creator, etc.
Stream_event::~Stream_event ()
{
}
void
Stream_event::init ()
{
self_scm_ = SCM_EOL;
context_ = -1;
property_alist_ = SCM_EOL;
origin_ = 0;
smobify_self ();
}
Stream_event::Stream_event ()
{
init ();
}
Stream_event::Stream_event (Context *c, Input *origin)
{
init ();
//TODO: re-implement context_ = c->get_unique ();
set_property ("context", scm_int2num (context_));
origin_ = origin;
}
Stream_event::Stream_event (SCM property_alist)
{
init ();
property_alist_ = property_alist;
origin_ = &dummy_input_global;
}
Stream_event::Stream_event (Context *c, SCM class_name)
{
init ();
//TODO:re-implement context_ = c->get_unique ();
set_property ("context", scm_int2num (context_));
set_property ("class", class_name);
origin_ = &dummy_input_global;
}
Stream_event::Stream_event (Stream_event *ev)
{
init ();
property_alist_ = scm_copy_tree (ev->property_alist_);
origin_ = ev->origin_;
context_ = ev->context_;
}
Input *
Stream_event::origin () const
{
return origin_;
}
SCM
Stream_event::mark_smob (SCM sm)
{
Stream_event *me = (Stream_event *) SCM_CELL_WORD_1 (sm);
return me->property_alist_;
}
int
Stream_event::print_smob (SCM s, SCM port, scm_print_state *)
{
scm_puts ("#", port);
return 1;
}
IMPLEMENT_SMOBS (Stream_event);
IMPLEMENT_DEFAULT_EQUAL_P (Stream_event);
IMPLEMENT_TYPE_P (Stream_event, "ly:stream-event?");
MAKE_SCHEME_CALLBACK (Stream_event, undump, 1);
MAKE_SCHEME_CALLBACK (Stream_event, dump, 1);
SCM
Stream_event::dump (SCM self)
{
Stream_event *ev = unsmob_stream_event (self);
// Reversed alists look prettier.
return scm_reverse (ev->property_alist_);
}
SCM
Stream_event::undump (SCM data)
{
Stream_event *obj = new Stream_event ();
obj->property_alist_ = scm_reverse (data);
obj->context_ = scm_to_int (obj->get_property ("context"));
return obj->unprotect ();
}
SCM
Stream_event::internal_get_property (SCM sym) const
{
SCM s = scm_sloppy_assq (sym, property_alist_);
if (s != SCM_BOOL_F)
return scm_cdr (s);
return SCM_EOL;
}
void
Stream_event::internal_set_property (SCM prop, SCM val)
{
property_alist_ = scm_assq_set_x (property_alist_, prop, val);
}
/* ------------------------------------ */
LY_DEFINE (ly_make_stream_event, "ly:make-stream-event",
1, 0, 0, (SCM proplist),
"Creates a stream event, with the given property list.\n" )
{
SCM_ASSERT_TYPE (scm_list_p (proplist), proplist, SCM_ARG1, __FUNCTION__, "association list");
Stream_event *e = new Stream_event (proplist);
return e->unprotect ();
}
LY_DEFINE (ly_stream_event_context, "ly:stream-event-context",
1, 0, 0, (SCM sev),
"Returns the context number of the given stream event.")
{
Stream_event *e = unsmob_stream_event (sev);
SCM_ASSERT_TYPE (e, sev, SCM_ARG1, __FUNCTION__, "stream event");
return scm_int2num (e->get_context ());
}
LY_DEFINE (ly_stream_event_property, "ly:stream-event-property",
2, 0, 0, (SCM sev, SCM sym),
"Get the property @var{sym} of stream event @var{mus}.\n"
"If @var{sym} is undefined, return @code{' ()}.\n")
{
Stream_event *e = unsmob_stream_event (sev);
SCM_ASSERT_TYPE (e, sev, SCM_ARG1, __FUNCTION__, "stream event");
SCM_ASSERT_TYPE (scm_is_symbol (sym), sym, SCM_ARG2, __FUNCTION__, "symbol");
return e->internal_get_property (sym);
}