+
+Music *
+property_op_to_music (SCM op)
+{
+ Music * m = 0;
+ SCM tag = gh_car (op);
+ SCM symbol = gh_cadr (op);
+ SCM args = gh_cddr (op);
+ SCM grob_val = SCM_UNDEFINED;
+ SCM grob_sym = SCM_UNDEFINED;
+ SCM val = SCM_UNDEFINED;
+
+ if (tag == ly_symbol2scm ("assign"))
+ {
+ m = MY_MAKE_MUSIC("PropertySet");
+ val = gh_car (args);
+ }
+ else if (tag == ly_symbol2scm ("unset"))
+ m = MY_MAKE_MUSIC("PropertyUnset");
+ else if (tag == ly_symbol2scm ("poppush")
+ || tag == ly_symbol2scm ("push"))
+ {
+ m = MY_MAKE_MUSIC("OverrideProperty");
+ grob_sym = gh_car (args);
+ grob_val = gh_cadr (args);
+ }
+ else if (tag == ly_symbol2scm ("pop")) {
+ m = MY_MAKE_MUSIC("RevertProperty");
+ grob_sym = gh_car (args);
+ }
+
+ m->set_mus_property ("symbol", symbol);
+
+ if (val != SCM_UNDEFINED)
+ m->set_mus_property ("value", val);
+ if (grob_val != SCM_UNDEFINED)
+ m->set_mus_property ("grob-value", grob_val);
+
+ if (grob_sym != SCM_UNDEFINED)
+ {
+ bool itc = internal_type_checking_global_b;
+ /* UGH.
+ */
+ bool autobeam = gh_equal_p (symbol, ly_symbol2scm ("autoBeamSettings"));
+ if (autobeam)
+ internal_type_checking_global_b = false;
+ m->set_mus_property ("grob-property", grob_sym);
+ if (autobeam)
+ internal_type_checking_global_b = itc;
+ }
+
+ if (op == ly_symbol2scm ("poppush"))
+ m->set_mus_property ("pop-first", SCM_BOOL_T);
+
+
+ return m;
+}
+
+Music*
+context_spec_music (SCM type, SCM id, Music * m, SCM ops)
+{
+ Music * csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
+
+ csm->set_mus_property ("element", m->self_scm ());
+ scm_gc_unprotect_object (m->self_scm ());
+
+ csm->set_mus_property ("context-type", scm_string_to_symbol (type));
+ csm->set_mus_property ("property-operations", ops);
+
+ if (gh_string_p (id))
+ csm->set_mus_property ("context-id", id);
+ return csm;
+}
+
+
+SCM
+get_next_unique_context ()
+{
+ static int new_context_count;
+
+ char s[1024];
+ snprintf (s, 1024, "uniqueContext%d", new_context_count ++);
+
+ return scm_makfrom0str (s);
+}