X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmusic.cc;h=60d33436b98bf1ea17cc2bad6475a222e8b60c45;hb=88aee98e9414b1ea25efbbec913960f26c6ced82;hp=a1accb9c3d4a8fb5485a5a06d4c832fa445eb898;hpb=652f454fae6ed31ced7f9c3ce22dbc5752460a8c;p=lilypond.git diff --git a/lily/music.cc b/lily/music.cc index a1accb9c3d..60d33436b9 100644 --- a/lily/music.cc +++ b/lily/music.cc @@ -68,7 +68,7 @@ Music::derived_mark () const SCM Music::copy_mutable_properties () const { - return ly_music_deep_copy (mutable_property_alist_); + return music_deep_copy (mutable_property_alist_); } void @@ -329,3 +329,40 @@ Music::duration_length_callback (SCM m) mom = d->get_length (); return mom.smobbed_copy (); } + +SCM +music_deep_copy (SCM m) +{ + if (Music *mus = unsmob (m)) + return mus->clone ()->unprotect (); + if (scm_is_pair (m)) + { + SCM copy = SCM_EOL; + do + { + copy = scm_cons (music_deep_copy (scm_car (m)), copy); + m = scm_cdr (m); + } + while (scm_is_pair (m)); + // Oh, come on, GUILE. Why do you require the second argument + // of scm_reverse_x to be a proper list? That makes no sense. + // return scm_reverse_x (copy, music_deep_copy (m)); + SCM last_cons = copy; + copy = scm_reverse_x (copy, SCM_EOL); + scm_set_cdr_x (last_cons, music_deep_copy (m)); + return copy; + } + return m; +} + +void +set_origin (SCM m, SCM origin) +{ + while (scm_is_pair (m)) + { + set_origin (scm_car (m), origin); + m = scm_cdr (m); + } + if (Music *mus = unsmob (m)) + mus->set_property ("origin", origin); +}