X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnested-property.cc;h=db897d3fd847d60cce195e926889eced04c9ec23;hb=e90f0536f9be39ada0bef0aeb0d275dec3b2fb5b;hp=fb62c7d80ad08196313ad8c2a4d6509369037524;hpb=a8c9e8a7ca320ab0df5fd32e717fd62cd7635ce6;p=lilypond.git diff --git a/lily/nested-property.cc b/lily/nested-property.cc index fb62c7d80a..db897d3fd8 100644 --- a/lily/nested-property.cc +++ b/lily/nested-property.cc @@ -31,7 +31,7 @@ evict_from_alist (SCM symbol, SCM alist, SCM alist_end) /* PROP_PATH should be big-to-small ordering */ -SCM +SCM nested_property_alist (SCM alist, SCM prop_path, SCM value) { SCM new_value = SCM_BOOL_F; @@ -52,17 +52,19 @@ nested_property_alist (SCM alist, SCM prop_path, SCM value) Recursively purge alist of prop_path: revert ((sym, val) : L, [sym]) = L - revert ((sym, val) : L, sym : props) = + revert ((sym, val) : L, sym : props) = (sym, revert (val, rest-props)) ++ L revert ((sym, val) : L, p ++ rest-props) = (sym, val) : revert (L, p ++ rest-props) */ -SCM +SCM nested_property_revert_alist (SCM alist, SCM prop_path) { + int copy_count = 0; + bool drop = false; assert(scm_is_pair (prop_path)); - + SCM wanted_sym = scm_car (prop_path); SCM new_list = SCM_EOL; @@ -71,6 +73,7 @@ nested_property_revert_alist (SCM alist, SCM prop_path) { SCM sub_sym = scm_caar (s); SCM old_val = scm_cdar (s); + drop = false; if (sub_sym == wanted_sym) { @@ -81,25 +84,48 @@ nested_property_revert_alist (SCM alist, SCM prop_path) /* nothing changed: drop newly constructed list. */ if (old_val == new_val) return alist; - + *tail = scm_acons (sub_sym, new_val, SCM_EOL); tail = SCM_CDRLOC(*tail); + *tail = scm_cdr (s); + return new_list; } else { - /* old value is dropped. */ + /* old value should be dropped only if we have another copy of it in the alist */ + copy_count++; + /* + Only drop the first instance found. + the overridden value is always the first + if this was the only copy, we will return + the original list anyways so it is not relevant + if we drop this pair + */ + if (copy_count == 1) + drop = true; } - - *tail = scm_cdr (s); - return new_list; + /* we now iterate over every item */ } - - *tail = scm_acons (sub_sym, old_val, SCM_EOL); - tail = SCM_CDRLOC (*tail); + /* + Make a new list with every item + except for the eventual dropped one + */ + if (!drop) + { + *tail = scm_acons (sub_sym, old_val, SCM_EOL); + tail = SCM_CDRLOC (*tail); + } } - /* Wanted symbol not found: drop newly constructed list. */ - return alist; + /* + If we find more than one copy of the property + push the new list, else it means we are trying to + revert the original value + */ + if (copy_count > 1) + return new_list; + else + return alist; } @@ -109,7 +135,7 @@ set_nested_property (Grob *me, SCM big_to_small, SCM value) SCM alist = me->get_property (scm_car (big_to_small)); alist = nested_property_alist (alist, scm_cdr (big_to_small), value); - + me->set_property (scm_car (big_to_small), alist); }