+
+Music *
+property_op_to_music (SCM op)
+{
+ Music *m = 0;
+ SCM tag = ly_car (op);
+ SCM symbol = ly_cadr (op);
+ SCM args = ly_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 = ly_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 = ly_car (args);
+ grob_val = ly_cadr (args);
+ }
+ else if (tag == ly_symbol2scm ("pop")) {
+ m = MY_MAKE_MUSIC ("RevertProperty");
+ grob_sym = ly_car (args);
+ }
+
+ m->set_property ("symbol", symbol);
+
+ if (val != SCM_UNDEFINED)
+ m->set_property ("value", val);
+ if (grob_val != SCM_UNDEFINED)
+ m->set_property ("grob-value", grob_val);
+
+ if (grob_sym != SCM_UNDEFINED)
+ {
+ bool itc = internal_type_checking_global_b;
+ /* UGH.
+ */
+ bool autobeam = ly_c_equal_p (symbol, ly_symbol2scm ("autoBeamSettings"));
+ if (autobeam)
+ internal_type_checking_global_b = false;
+ m->set_property ("grob-property", grob_sym);
+ if (autobeam)
+ internal_type_checking_global_b = itc;
+ }
+
+ if (op == ly_symbol2scm ("poppush"))
+ m->set_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_property ("element", m->self_scm ());
+ scm_gc_unprotect_object (m->self_scm ());
+
+ csm->set_property ("context-type",
+ ly_c_symbol_p (type) ? type : scm_string_to_symbol (type));
+ csm->set_property ("property-operations", ops);
+
+ if (ly_c_string_p (id))
+ csm->set_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);
+}
+