From 2459c66ea8366f6541be25728973975ee0bc4d62 Mon Sep 17 00:00:00 2001 From: Neil Puttock Date: Sat, 12 Sep 2009 22:07:54 +0100 Subject: [PATCH] Fix #743: Reinstate warnings for unterminated span dynamics. (cherry picked from commit 4f00600ac4a7ab1e268cd04014001c01a4df3985) --- .../warn-unterminated-span-dynamic.ly | 18 ++++++ lily/new-dynamic-engraver.cc | 55 +++++++++++++------ 2 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 input/regression/warn-unterminated-span-dynamic.ly diff --git a/input/regression/warn-unterminated-span-dynamic.ly b/input/regression/warn-unterminated-span-dynamic.ly new file mode 100644 index 0000000000..88c35b2840 --- /dev/null +++ b/input/regression/warn-unterminated-span-dynamic.ly @@ -0,0 +1,18 @@ +\version "2.12.3" + +\header { + texidoc = "A warning is printed if a dynamic spanner is +unterminated." +} + +<< + \new Staff { + % warning expected: unterminated crescendo + c'1\< + } + \new Staff { + % warning expected: unterminated decrescendo + c'1\> + } +>> + diff --git a/lily/new-dynamic-engraver.cc b/lily/new-dynamic-engraver.cc index 8c8fce9800..ac652216f7 100644 --- a/lily/new-dynamic-engraver.cc +++ b/lily/new-dynamic-engraver.cc @@ -32,7 +32,11 @@ class New_dynamic_engraver : public Engraver protected: virtual void process_music (); virtual void stop_translation_timestep (); + virtual void finalize (); + private: + string get_spanner_type (Stream_event *ev); + Drul_array accepted_spanevents_drul_; Spanner *current_spanner_; Spanner *finished_spanner_; @@ -75,7 +79,7 @@ New_dynamic_engraver::process_music () if (current_spanner_ && (accepted_spanevents_drul_[STOP] || script_event_ || accepted_spanevents_drul_[START])) { - Stream_event* ender = accepted_spanevents_drul_[STOP]; + Stream_event *ender = accepted_spanevents_drul_[STOP]; if (!ender) ender = script_event_; @@ -91,20 +95,8 @@ New_dynamic_engraver::process_music () if (accepted_spanevents_drul_[START]) { current_span_event_ = accepted_spanevents_drul_[START]; - - SCM start_sym = current_span_event_->get_property ("class"); - string start_type; - - if (start_sym == ly_symbol2scm ("decrescendo-event")) - start_type = "decrescendo"; - else if (start_sym == ly_symbol2scm ("crescendo-event")) - start_type = "crescendo"; - else - { - programming_error ("unknown dynamic spanner type"); - return; - } - + + string start_type = get_spanner_type (current_span_event_); SCM cresc_type = get_property ((start_type + "Spanner").c_str ()); if (cresc_type == ly_symbol2scm ("text")) @@ -123,7 +115,6 @@ New_dynamic_engraver::process_music () { if (cresc_type != ly_symbol2scm ("hairpin")) { - // Fixme: should put value in error message. string as_string = ly_scm_write_string (cresc_type); current_span_event_ ->origin()->warning (_f ("unknown crescendo style: %s\ndefaulting to hairpin.", as_string.c_str())); @@ -185,6 +176,38 @@ New_dynamic_engraver::stop_translation_timestep () finished_spanner_ = 0; } +void +New_dynamic_engraver::finalize () +{ + if (current_spanner_ + && !current_spanner_->is_live ()) + current_spanner_ = 0; + if (current_spanner_) + { + current_span_event_ + ->origin ()->warning (_f ("unterminated %s", + get_spanner_type (current_span_event_) + .c_str ())); + current_spanner_->suicide (); + current_spanner_ = 0; + } +} + +string +New_dynamic_engraver::get_spanner_type (Stream_event *ev) +{ + string type; + SCM start_sym = ev->get_property ("class"); + + if (start_sym == ly_symbol2scm ("decrescendo-event")) + type = "decrescendo"; + else if (start_sym == ly_symbol2scm ("crescendo-event")) + type = "crescendo"; + else + programming_error ("unknown dynamic spanner type"); + return type; +} + void New_dynamic_engraver::acknowledge_note_column (Grob_info info) { -- 2.39.2