/* 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); }