X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fcontext-property.cc;h=62e04a27323a5b136194c0607954e2b53e35c197;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=369037381aba5b67ef8d5f01996c1d6e357ed9ba;hpb=00b9619cea1020f6773f23df8764ef85ee2912bf;p=lilypond.git diff --git a/lily/context-property.cc b/lily/context-property.cc index 369037381a..62e04a2732 100644 --- a/lily/context-property.cc +++ b/lily/context-property.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2014 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -59,14 +59,13 @@ typecheck_grob (SCM symbol, SCM value) return typecheck_grob (symbol, upc->unpure_part ()) && typecheck_grob (symbol, upc->pure_part ()); return ly_is_procedure (value) - || Simple_closure::unsmob (value) + || Simple_closure::is_smob (value) || type_check_assignment (symbol, value, ly_symbol2scm ("backend-type?")); } class Grob_properties : public Simple_smob { public: - static int print_smob (SCM, SCM, scm_print_state *); SCM mark_smob (); static const char type_p_name_[]; private: @@ -106,14 +105,6 @@ Grob_properties::mark_smob () return cooked_from_; } -int -Grob_properties::print_smob (SCM /*smob*/, SCM port, scm_print_state *) -{ - scm_puts ("#", port); - - return 1; -} - LY_DEFINE (ly_make_grob_properties, "ly:make-grob-properties", 1, 0, 0, (SCM alist), "This packages the given property list @var{alist} in" @@ -199,18 +190,21 @@ Grob_property_info::create () alist defined in a parent context. BASED-ON should always be a tail of ALIST. - Push or pop (depending on value of VAL) a single entry from a + Push a single entry from a translator property list by name of PROP. GROB_PROPERTY_PATH indicates nested alists, eg. '(beamed-stem-lengths details) + + Return value can be passed to matched_pop and will only cancel the + same override then. */ -void +SCM Grob_property_info::push (SCM grob_property_path, SCM new_value) { /* Don't mess with MIDI. */ if (!create ()) - return; + return SCM_EOL; SCM symbol = scm_car (grob_property_path); SCM rest = scm_cdr (grob_property_path); @@ -218,10 +212,12 @@ Grob_property_info::push (SCM grob_property_path, SCM new_value) { // poor man's typechecking if (typecheck_grob (symbol, nested_create_alist (rest, new_value))) { - props_->alist_ = scm_acons (grob_property_path, new_value, props_->alist_); + SCM cell = scm_cons (grob_property_path, new_value); + props_->alist_ = scm_cons (cell, props_->alist_); props_->nested_++; + return cell; } - return; + return SCM_EOL; } /* it's tempting to replace the head of the list if it's the same @@ -230,7 +226,34 @@ Grob_property_info::push (SCM grob_property_path, SCM new_value) */ if (typecheck_grob (symbol, new_value)) - props_->alist_ = scm_acons (symbol, new_value, props_->alist_); + { + SCM cell = scm_cons (symbol, new_value); + props_->alist_ = scm_cons (cell, props_->alist_); + return cell; + } + return SCM_EOL; +} + +void +Grob_property_info::matched_pop (SCM cell) +{ + if (!scm_is_pair (cell)) + return; + if (!check ()) + return; + SCM current_alist = props_->alist_; + SCM daddy = props_->based_on_; + for (SCM p = current_alist; !scm_is_eq (p, daddy); p = scm_cdr (p)) + { + if (scm_is_eq (scm_car (p), cell)) + { + if (scm_is_pair (scm_car (cell))) + props_->nested_--; + props_->alist_ = partial_list_copy (current_alist, p, scm_cdr (p)); + return; + } + } + return; } /*